DATA LIST: Accept freefield format types without widths use minimum width.
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 25 Nov 2012 01:50:05 +0000 (17:50 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 25 Nov 2012 01:50:05 +0000 (17:50 -0800)
A user reported that SPSS accepts syntax such as "DATA LIST FREE/
d (DATETIME)." using a default width for the field with no specified width.
This commit makes PSPP accept this syntax too, although it does not get
the width exactly right (please let me know if you figure out how to do
that).

Bug #30690.
Reported by Andreas Lappe.

src/language/data-io/data-list.c
tests/language/data-io/data-list.at

index 17c6032d252b97181864f43e4158900b071316fe..bc295a9aed7aa7939eb6f2f8141d82a4604d2053 100644 (file)
@@ -429,9 +429,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
index ade227274cd0ace507260f2d47a9bf7bed307ed7..4a59cf795ad80eecdecf1007c3e005a83009e415 100644 (file)
@@ -274,3 +274,16 @@ y         @&t@
 z         @&t@
 ])
 AT_CLEANUP
+
+AT_SETUP([DATA LIST FREE and LIST assume a width if omitted])
+AT_DATA([data-list.sps], [dnl
+DATA LIST FREE TABLE/s (a) d (datetime) f (f).
+])
+AT_CHECK([pspp -O format=csv data-list.sps], [0], [dnl
+Table: Reading free-form data from INLINE.
+Variable,Format
+s,A1
+d,DATETIME17.0
+f,F1.0
+])
+AT_CLEANUP