CD: Fix a bug and add a regression test.
[pspp-builds.git] / src / language / data-io / get-data.c
index dd55752c7cabbfe114a2b3d1e458376a3719ea2b..47b65b445adfc44ffa15e9b72c9738703fc687a0 100644 (file)
@@ -279,7 +279,7 @@ static int
 parse_get_txt (struct lexer *lexer, struct dataset *ds)
 {
   struct data_parser *parser = NULL;
-  struct dictionary *dict = dict_create ();
+  struct dictionary *dict = dict_create (get_default_encoding ());
   struct file_handle *fh = NULL;
   struct dfm_reader *reader = NULL;
   char *name = NULL;
@@ -293,7 +293,7 @@ parse_get_txt (struct lexer *lexer, struct dataset *ds)
   if (!lex_force_match_id (lexer, "FILE"))
     goto error;
   lex_force_match (lexer, T_EQUALS);
-  fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE);
+  fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE, NULL);
   if (fh == NULL)
     goto error;
 
@@ -520,19 +520,46 @@ parse_get_txt (struct lexer *lexer, struct dataset *ds)
           if (!parse_format_specifier (lexer, &input)
               || !fmt_check_input (&input))
             goto error;
+
+          output = fmt_for_output_from_input (&input);
         }
       else
         {
+          char fmt_type_name[FMT_TYPE_LEN_MAX + 1];
+          enum fmt_type fmt_type;
+          int w, d;
+
           if (!parse_column_range (lexer, 0, &fc, &lc, NULL))
             goto error;
-          if (!parse_format_specifier_name (lexer, &input.type))
+
+          /* Accept a format (e.g. F8.2) or just a type name (e.g. DOLLAR).  */
+          if (!parse_abstract_format_specifier (lexer, fmt_type_name, &w, &d))
             goto error;
+          if (!fmt_from_name (fmt_type_name, &fmt_type))
+            {
+              msg (SE, _("Unknown format type `%s'."), fmt_type_name);
+              goto error;
+            }
+
+          /* Compose input format. */
+          input.type = fmt_type;
           input.w = lc - fc + 1;
           input.d = 0;
           if (!fmt_check_input (&input))
             goto error;
+
+          /* Compose output format. */
+          if (w != 0)
+            {
+              output.type = fmt_type;
+              output.w = w;
+              output.d = d;
+              if (!fmt_check_output (&output))
+                goto error;
+            }
+          else
+            output = fmt_for_output_from_input (&input);
         }
-      output = fmt_for_output_from_input (&input);
 
       v = dict_create_var (dict, name, fmt_var_width (&input));
       if (v == NULL)