Make cases simpler, faster, and easier to understand.
[pspp-builds.git] / src / language / data-io / data-list.c
index 51dbce114089261606925849b29c67081054460d..d07eae5c554f7cb19b665175e2a45f9146e08102 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006, 2007 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2007, 2009 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
@@ -282,7 +282,8 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds)
 
  error:
   data_parser_destroy (parser);
-  dict_destroy (dict);
+  if (!in_input_program ())
+    dict_destroy (dict);
   fh_unref (fh);
   return CMD_CASCADING_FAILURE;
 }
@@ -404,7 +405,7 @@ parse_free (struct lexer *lexer, struct dictionary *dict,
 
       if (!parse_DATA_LIST_vars_pool (lexer, tmp_pool,
                                      &name, &name_cnt, PV_NONE))
-       return 0;
+       return false;
 
       if (lex_match (lexer, '('))
        {
@@ -424,7 +425,7 @@ parse_free (struct lexer *lexer, struct dictionary *dict,
        {
          lex_match (lexer, '*');
           input = fmt_for_input (FMT_F, 8, 0);
-         output = *get_format ();
+         output = *settings_get_format ();
        }
 
       for (i = 0; i < name_cnt; i++)
@@ -435,7 +436,7 @@ parse_free (struct lexer *lexer, struct dictionary *dict,
          if (v == NULL)
            {
              msg (SE, _("%s is a duplicate variable name."), name[i]);
-             return 0;
+             return false;
            }
           var_set_both_formats (v, &output);
 
@@ -462,14 +463,15 @@ data_list_trns_free (void *trns_)
   return true;
 }
 
-/* Handle DATA LIST transformation TRNS, parsing data into C. */
+/* Handle DATA LIST transformation TRNS, parsing data into *C. */
 static int
-data_list_trns_proc (void *trns_, struct ccase *c, casenumber case_num UNUSED)
+data_list_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED)
 {
   struct data_list_trns *trns = trns_;
   int retval;
 
-  if (data_parser_parse (trns->parser, trns->reader, c))
+  *c = case_unshare (*c);
+  if (data_parser_parse (trns->parser, trns->reader, *c))
     retval = TRNS_CONTINUE;
   else if (dfm_reader_error (trns->reader) || dfm_eof (trns->reader) > 1)
     {
@@ -483,7 +485,7 @@ data_list_trns_proc (void *trns_, struct ccase *c, casenumber case_num UNUSED)
   /* If there was an END subcommand handle it. */
   if (trns->end != NULL)
     {
-      double *end = &case_data_rw (c, trns->end)->f;
+      double *end = &case_data_rw (*c, trns->end)->f;
       if (retval == TRNS_END_FILE)
         {
           *end = 1.0;