/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2007, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2007, 2010, 2011, 2020 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include <unistd.h>
#include "data/dataset.h"
-#include "data/file-name.h"
#include "data/session.h"
#include "language/command.h"
#include "language/lexer/include-path.h"
static int
do_insert (struct lexer *lexer, struct dataset *ds, enum variant variant)
{
- enum lex_syntax_mode syntax_mode;
+ enum segmenter_mode syntax_mode;
enum lex_error_mode error_mode;
char *relative_name;
char *filename;
if (!lex_force_string_or_id (lexer))
return CMD_FAILURE;
- relative_name = utf8_to_filename (lex_tokcstr (lexer));
+ relative_name = utf8_to_filename (lex_tokcstr (lexer));
+ if (NULL == relative_name)
+ return CMD_FAILURE;
+
filename = include_path_search (relative_name);
free (relative_name);
- if ( ! filename)
+ if (! filename)
{
msg (SE, _("Can't find `%s' in include file search path."),
lex_tokcstr (lexer));
}
lex_get (lexer);
- syntax_mode = LEX_SYNTAX_INTERACTIVE;
+ syntax_mode = SEG_MODE_INTERACTIVE;
error_mode = LEX_ERROR_CONTINUE;
cd = false;
status = CMD_FAILURE;
encoding = xstrdup (session_get_default_syntax_encoding (
dataset_session (ds)));
- while ( T_ENDCMD != lex_token (lexer))
+ while (T_ENDCMD != lex_token (lexer))
{
if (lex_match_id (lexer, "ENCODING"))
{
else if (variant == INSERT && lex_match_id (lexer, "SYNTAX"))
{
lex_match (lexer, T_EQUALS);
- if ( lex_match_id (lexer, "INTERACTIVE") )
- syntax_mode = LEX_SYNTAX_INTERACTIVE;
- else if ( lex_match_id (lexer, "BATCH"))
- syntax_mode = LEX_SYNTAX_BATCH;
- else if ( lex_match_id (lexer, "AUTO"))
- syntax_mode = LEX_SYNTAX_AUTO;
+ if (lex_match_id (lexer, "INTERACTIVE"))
+ syntax_mode = SEG_MODE_INTERACTIVE;
+ else if (lex_match_id (lexer, "BATCH"))
+ syntax_mode = SEG_MODE_BATCH;
+ else if (lex_match_id (lexer, "AUTO"))
+ syntax_mode = SEG_MODE_AUTO;
else
{
- lex_error_expecting (lexer, "BATCH", "INTERACTIVE", "AUTO",
- NULL_SENTINEL);
+ lex_error_expecting (lexer, "BATCH", "INTERACTIVE", "AUTO");
goto exit;
}
}
else if (variant == INSERT && lex_match_id (lexer, "CD"))
{
lex_match (lexer, T_EQUALS);
- if ( lex_match_id (lexer, "YES") )
+ if (lex_match_id (lexer, "YES"))
{
cd = true;
}
- else if ( lex_match_id (lexer, "NO"))
+ else if (lex_match_id (lexer, "NO"))
{
cd = false;
}
else
{
- lex_error_expecting (lexer, "YES", "NO", NULL_SENTINEL);
+ lex_error_expecting (lexer, "YES", "NO");
goto exit;
}
}
else if (variant == INSERT && lex_match_id (lexer, "ERROR"))
{
lex_match (lexer, T_EQUALS);
- if ( lex_match_id (lexer, "CONTINUE") )
+ if (lex_match_id (lexer, "CONTINUE"))
{
error_mode = LEX_ERROR_CONTINUE;
}
- else if ( lex_match_id (lexer, "STOP"))
+ else if (lex_match_id (lexer, "STOP"))
{
error_mode = LEX_ERROR_STOP;
}
else
{
- lex_error_expecting (lexer, "CONTINUE", "STOP", NULL_SENTINEL);
+ lex_error_expecting (lexer, "CONTINUE", "STOP");
goto exit;
}
}
}
status = lex_end_of_command (lexer);
- if ( status == CMD_SUCCESS)
+ if (status == CMD_SUCCESS)
{
struct lex_reader *reader;
lex_discard_rest_of_command (lexer);
lex_include (lexer, reader);
- if ( cd )
+ if (cd)
{
char *directory = dir_name (filename);
- chdir (directory);
+ int ret = chdir (directory);
+ if (0 != ret)
+ {
+ int err = errno;
+ msg (SE, _("Cannot change directory to %s: %s"), directory,
+ strerror (err));
+ status = CMD_FAILURE;
+ }
+
free (directory);
}
}