DATA LIST: Do not treat the comma as a field separator if DECIMAL=COMMA
[pspp] / src / language / data-io / data-list.c
index 17c6032d252b97181864f43e4158900b071316fe..90d060eaab66721a8462fcb81baa351494177441 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011, 2012, 2013 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
@@ -138,13 +138,12 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds)
        {
           if (!in_input_program ())
             {
-              msg (SE, _("The END subcommand may only be used within "
-                         "INPUT PROGRAM."));
+              msg (SE, _("The %s subcommand may only be used within %s."), "END", "INPUT PROGRAM");
               goto error;
             }
          if (end)
            {
-             msg (SE, _("The END subcommand may only be specified once."));
+             msg (SE, _("The %s subcommand may only be specified once."), "END");
              goto error;
            }
 
@@ -230,7 +229,9 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds)
                   data_parser_set_quotes (parser, ss_cstr ("'\""));
                   data_parser_set_soft_delimiters (parser,
                                                    ss_cstr (CC_SPACES));
-                  data_parser_set_hard_delimiters (parser, ss_cstr (","));
+                  const char decimal = settings_get_decimal_char (FMT_F);
+                  data_parser_set_hard_delimiters (parser,
+                                                   ss_buffer (",", (decimal == '.') ? 1 : 0));
                 }
             }
         }
@@ -252,7 +253,7 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds)
 
   if (type != DP_FIXED && end != NULL)
     {
-      msg (SE, _("The END subcommand may be used only with DATA LIST FIXED."));
+      msg (SE, _("The %s subcommand may be used only with %s."), "END", "DATA LIST FIXED");
       goto error;
     }
 
@@ -297,7 +298,7 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds)
   fh_unref (fh);
   free (encoding);
 
-  return CMD_SUCCESS;
+  return CMD_DATA_LIST;
 
  error:
   data_parser_destroy (parser);
@@ -429,9 +430,28 @@ parse_free (struct lexer *lexer, struct dictionary *dict,
 
       if (lex_match (lexer, T_LPAREN))
        {
-         if (!parse_format_specifier (lexer, &input)
-              || !fmt_check_input (&input)
-              || !lex_force_match (lexer, T_RPAREN))
+          char type[FMT_TYPE_LEN_MAX + 1];
+
+         if (!parse_abstract_format_specifier (lexer, type, &input.w,
+                                                &input.d))
+            return NULL;
+          if (!fmt_from_name (type, &input.type))
+            {
+              msg (SE, _("Unknown format type `%s'."), type);
+              return NULL;
+            }
+
+          /* If no width was included, use the minimum width for the type.
+             This isn't quite right, because DATETIME by itself seems to become
+             DATETIME20 (see bug #30690), whereas this will become
+             DATETIME17.  The correct behavior is not documented. */
+          if (input.w == 0)
+            {
+              input.w = fmt_min_input_width (input.type);
+              input.d = 0;
+            }
+
+          if (!fmt_check_input (&input) || !lex_force_match (lexer, T_RPAREN))
             return NULL;
 
           /* As a special case, N format is treated as F format