vlabels works a little
[pspp] / src / language / utilities / include.c
index bcee162c6a04f56e44a01164d0c7af87662cba62..eefbde6158bc2bbeba81b11a19161c8df52da42d 100644 (file)
@@ -1,5 +1,5 @@
 /* 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
@@ -23,7 +23,6 @@
 #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"
@@ -47,7 +46,7 @@ enum variant
 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;
@@ -59,18 +58,17 @@ do_insert (struct lexer *lexer, struct dataset *ds, enum variant variant)
   if (lex_match_id (lexer, "FILE"))
     lex_match (lexer, T_EQUALS);
 
-  /* File name can be identifier or string. */
-  if (lex_token (lexer) != T_ID && !lex_is_string (lexer))
-    {
-      lex_error (lexer, _("expecting file name"));
-      return CMD_FAILURE;
-    }
+  if (!lex_force_string_or_id (lexer))
+    return CMD_FAILURE;
+
+  relative_name = utf8_to_filename (lex_tokcstr (lexer));
+  if (NULL == relative_name)
+    return CMD_FAILURE;
 
-  relative_name = utf8_to_filename (lex_tokcstr (lexer)); 
   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));
@@ -78,13 +76,13 @@ do_insert (struct lexer *lexer, struct dataset *ds, enum variant variant)
     }
   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"))
         {
@@ -94,56 +92,54 @@ do_insert (struct lexer *lexer, struct dataset *ds, enum variant variant)
 
           free (encoding);
           encoding = xstrdup (lex_tokcstr (lexer));
+         lex_get (lexer);
         }
       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 (lexer, _("expecting %s, %s, or %s after %s"),
-                         "BATCH", "INTERACTIVE", "AUTO", "SYNTAX");
+             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 (lexer, _("expecting %s or %s after %s"),
-                         "YES", "NO", "CD");
+             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 (lexer, _("expecting %s or %s after %s"),
-                         "CONTINUE", "STOP", "ERROR");
+             lex_error_expecting (lexer, "CONTINUE", "STOP");
              goto exit;
            }
        }
@@ -156,7 +152,7 @@ do_insert (struct lexer *lexer, struct dataset *ds, enum variant variant)
     }
   status = lex_end_of_command (lexer);
 
-  if ( status == CMD_SUCCESS)
+  if (status == CMD_SUCCESS)
     {
       struct lex_reader *reader;
 
@@ -167,10 +163,18 @@ do_insert (struct lexer *lexer, struct dataset *ds, enum variant variant)
           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);
             }
         }