work on data list
[pspp] / src / language / data-io / inpt-pgm.c
index 72d5a2e7b88e302df07e4ca54e59c206cbdebae5..36c58c859122fc5a0c6f9322bd46ed102f1af135 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012 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
@@ -22,8 +22,8 @@
 #include "data/case.h"
 #include "data/caseinit.h"
 #include "data/casereader-provider.h"
+#include "data/dataset.h"
 #include "data/dictionary.h"
-#include "data/procedure.h"
 #include "data/transformations.h"
 #include "data/variable.h"
 #include "language/command.h"
@@ -92,7 +92,7 @@ cmd_input_program (struct lexer *lexer, struct dataset *ds)
   struct input_program_pgm *inp;
   bool saw_END_CASE = false;
 
-  proc_discard_active_file (ds);
+  dataset_clear (ds);
   if (!lex_match (lexer, T_ENDCMD))
     return lex_end_of_command (lexer);
 
@@ -117,7 +117,7 @@ cmd_input_program (struct lexer *lexer, struct dataset *ds)
           if (result == CMD_EOF)
             msg (SE, _("Unexpected end-of-file within INPUT PROGRAM."));
           inside_input_program = false;
-          proc_discard_active_file (ds);
+          dataset_clear (ds);
           destroy_input_program (inp);
           return result;
         }
@@ -129,7 +129,7 @@ cmd_input_program (struct lexer *lexer, struct dataset *ds)
   if (dict_get_next_value_idx (dataset_dict (ds)) == 0)
     {
       msg (SE, _("Input program did not create any variables."));
-      proc_discard_active_file (ds);
+      dataset_clear (ds);
       destroy_input_program (inp);
       return CMD_FAILURE;
     }
@@ -144,7 +144,7 @@ cmd_input_program (struct lexer *lexer, struct dataset *ds)
   caseinit_mark_for_init (inp->init, dataset_dict (ds));
   inp->proto = caseproto_ref (dict_get_proto (dataset_dict (ds)));
 
-  proc_set_active_file_data (
+  dataset_set_source (
     ds, casereader_create_sequential (NULL, inp->proto, CASENUMBER_MAX,
                                       &input_program_casereader_class, inp));
 
@@ -266,6 +266,7 @@ cmd_reread (struct lexer *lexer, struct dataset *ds)
   struct file_handle *fh;       /* File to be re-read. */
   struct expression *e;         /* Expression for column to set. */
   struct reread_trns *t;        /* Created transformation. */
+  char *encoding = NULL;
 
   fh = fh_get_default_handle ();
   e = NULL;
@@ -277,41 +278,53 @@ cmd_reread (struct lexer *lexer, struct dataset *ds)
 
          if (e)
            {
-              msg (SE, _("%s subcommand may be given at most once."), "COLUMN");
-             expr_free (e);
-             return CMD_CASCADING_FAILURE;
+              lex_sbc_only_once ("COLUMN");
+              goto error;
            }
 
          e = expr_parse (lexer, ds, EXPR_NUMBER);
          if (!e)
-           return CMD_CASCADING_FAILURE;
+            goto error;
        }
       else if (lex_match_id (lexer, "FILE"))
        {
          lex_match (lexer, T_EQUALS);
           fh_unref (fh);
-          fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE);
+          fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE, NULL);
          if (fh == NULL)
-           {
-             expr_free (e);
-             return CMD_CASCADING_FAILURE;
-           }
+            goto error;
+       }
+      else if (lex_match_id (lexer, "ENCODING"))
+       {
+         lex_match (lexer, T_EQUALS);
+         if (!lex_force_string (lexer))
+           goto error;
+
+          free (encoding);
+          encoding = ss_xstrdup (lex_tokss (lexer));
+
+         lex_get (lexer);
        }
       else
        {
          lex_error (lexer, NULL);
-         expr_free (e);
-          return CMD_CASCADING_FAILURE;
+          goto error;
        }
     }
 
   t = xmalloc (sizeof *t);
-  t->reader = dfm_open_reader (fh, lexer);
+  t->reader = dfm_open_reader (fh, lexer, encoding);
   t->column = e;
   add_transformation (ds, reread_trns_proc, reread_trns_free, t);
 
   fh_unref (fh);
+  free (encoding);
   return CMD_SUCCESS;
+
+error:
+  expr_free (e);
+  free (encoding);
+  return CMD_CASCADING_FAILURE;
 }
 
 /* Executes a REREAD transformation. */