value-parser: Make parse_value() accept variable's print format also.
authorBen Pfaff <blp@cs.stanford.edu>
Tue, 12 Apr 2011 13:48:08 +0000 (06:48 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Tue, 12 Apr 2011 13:48:08 +0000 (06:48 -0700)
Previously commands such as VALUE LABELS required numeric values to
be given as plain numbers, but this makes it difficult to add
meaningful value labels for variables with date and time formats.
This commit allows values for this command and a few others to be
given in a variable's print format instead.

Bug #18497.

src/language/dictionary/value-labels.c
src/language/expressions/evaluate.c
src/language/lexer/value-parser.c
src/language/lexer/value-parser.h
src/language/stats/npar.c
src/language/stats/roc.c
src/language/stats/t-test.q
tests/language/dictionary/value-labels.at

index 57124ebe9b6db6175e2015df3c80221eb4c1890c..2dfe0885bffb46a81ee33e01ad513f84d9ccd55e 100644 (file)
@@ -131,7 +131,7 @@ get_label (struct lexer *lexer, struct variable **vars, size_t var_cnt,
 
       /* Set value. */
       value_init (&value, width);
-      if (!parse_value (lexer, &value, width))
+      if (!parse_value (lexer, &value, vars[0]))
         {
           value_destroy (&value, width);
           return 0;
index 3df9a6c9fe70172308c3a3486f4997e5cd33244d..56deb9a5c0665c6f0cd50fb624d7815b20a9c21e 100644 (file)
@@ -174,7 +174,7 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED)
           else
             c = case_unshare_and_resize (c, dict_get_proto (d));
 
-          if (!parse_value (lexer, case_data_rw (c, v), var_get_width (v)))
+          if (!parse_value (lexer, case_data_rw (c, v), v))
             NOT_REACHED ();
 
           if (!lex_force_match (lexer, T_RPAREN))
index ff2701e8dadfb586b64a791367de731177b00563..74478cfa60ac7bce5249792e38fc6f77a0504062 100644 (file)
@@ -129,18 +129,15 @@ parse_number (struct lexer *lexer, double *x, const enum fmt_type *format)
     }
 }
 
-/* Parses the current token from LEXER into value V, which must
-   already have been initialized with the specified WIDTH.
-   Returns true if successful, false otherwise. */
+/* Parses the current token from LEXER into value V, which must already have
+   been initialized with the specified VAR's WIDTH.  Returns true if
+   successful, false otherwise. */
 bool
-parse_value (struct lexer *lexer, union value *v, int width)
+parse_value (struct lexer *lexer, union value *v, const struct variable *var)
 {
+  int width = var_get_width (var);
   if (width == 0)
-    {
-      if (!lex_force_num (lexer))
-       return false;
-      v->f = lex_tokval (lexer);
-    }
+    return parse_number (lexer, &v->f, &var_get_print_format (var)->type);
   else if (lex_force_string (lexer))
     {
       const char *s = lex_tokcstr (lexer);
index 4f9004a361478efcbca80d2a41476706e5395cc7..94b2cdc142482a456bb7e277ae7f3ccce39b36f1 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2005, 2009 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2009, 2011 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
 
 struct lexer;
 enum fmt_type;
+struct variable;
 union value;
 bool parse_num_range (struct lexer *,
                       double *x, double *y, const enum fmt_type *fmt);
-bool parse_value (struct lexer *, union value *, int width);
+bool parse_value (struct lexer *, union value *, const struct variable *);
 
 #endif /* value-parser.h */
index 3d977a7dc106ae6da6defeca2a16695486bcdfca..2bc42934a381b9798f18a0b1142524fd967445d3 100644 (file)
@@ -1027,7 +1027,7 @@ parse_n_sample_related_test (struct lexer *lexer,
     return false;
 
   value_init (&nst->val1, var_get_width (nst->indep_var));
-  if ( ! parse_value (lexer, &nst->val1, var_get_width (nst->indep_var)))
+  if ( ! parse_value (lexer, &nst->val1, nst->indep_var))
     {
       value_destroy (&nst->val1, var_get_width (nst->indep_var));
       return false;
@@ -1036,7 +1036,7 @@ parse_n_sample_related_test (struct lexer *lexer,
   lex_match (lexer, T_COMMA);
 
   value_init (&nst->val2, var_get_width (nst->indep_var));
-  if ( ! parse_value (lexer, &nst->val2, var_get_width (nst->indep_var)))
+  if ( ! parse_value (lexer, &nst->val2, nst->indep_var))
     {
       value_destroy (&nst->val2, var_get_width (nst->indep_var));
       return false;
index b6596ec7543c2481209a10094662a9efa7509ccc..471b946ee817b17124836b4f601d9358fbd833cf 100644 (file)
@@ -113,7 +113,7 @@ cmd_roc (struct lexer *lexer, struct dataset *ds)
     }
 
   value_init (&roc.state_value, var_get_width (roc.state_var));
-  parse_value (lexer, &roc.state_value, var_get_width (roc.state_var));
+  parse_value (lexer, &roc.state_value, roc.state_var);
 
 
   if ( !lex_force_match (lexer, T_RPAREN))
index 4b082fe7c710fb670c565cc3421ee998ff01284e..d26fc8a4cffe6385cab26340e656698cab237d02 100644 (file)
@@ -295,14 +295,14 @@ tts_custom_groups (struct lexer *lexer, struct dataset *ds,
     n_values = 0;
   else
     {
-      if (!parse_value (lexer, &proc->g_value[0], width))
+      if (!parse_value (lexer, &proc->g_value[0], proc->indep_var))
         return 0;
       lex_match (lexer, T_COMMA);
       if (lex_match (lexer, T_RPAREN))
         n_values = 1;
       else
         {
-          if (!parse_value (lexer, &proc->g_value[1], width)
+          if (!parse_value (lexer, &proc->g_value[1], proc->indep_var)
               || !lex_force_match (lexer, T_RPAREN))
             return 0;
           n_values = 2;
index c6c48db4f0847b92e81cab3291b601acccbb19f0..feec9d8627fa67149d787fea79ac62d90b585bb7 100644 (file)
@@ -1,5 +1,31 @@
 AT_BANNER([VALUE LABELS])
 
+AT_SETUP([VALUE LABELS date formats])
+AT_DATA([value-labels.sps], [dnl
+DATA LIST LIST NOTABLE /ad (adate10) dt (datetime20).
+VALUE LABELS ad 'july 10, 1982' 'label 1'
+                '1-2-93' 'label 2'
+                '5-4-2003' 'label 3'
+            /dt '12 Apr 2011 06:09:56' 'label 4'.
+DISPLAY DICTIONARY.
+])
+AT_CHECK([pspp -O format=csv value-labels.sps], [0], [dnl
+Variable,Description,,Position
+ad,Format: ADATE10,,1
+,Measure: Scale,,
+,Display Alignment: Right,,
+,Display Width: 8,,
+,07/10/1982,label 1,
+,01/02/1993,label 2,
+,05/04/2003,label 3,
+dt,Format: DATETIME20.0,,2
+,Measure: Scale,,
+,Display Alignment: Right,,
+,Display Width: 8,,
+,12-APR-2011 06:09:56,label 4,
+])
+AT_CLEANUP
+
 dnl Tests for a bug which caused VALUE LABELS to 
 dnl crash when given invalid syntax.
 AT_SETUP([VALUE LABELS invalid syntax bug])