lexer: New type enum token_type.
[pspp] / src / language / dictionary / numeric.c
index 5c64b948488d2fa8b4aedebd4dca15e69a87ab95..946c35c167cd7f7f51834575d1b9e574a83fe617 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2010 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
@@ -43,20 +43,24 @@ cmd_numeric (struct lexer *lexer, struct dataset *ds)
   char **v;
   size_t nv;
 
-  /* Format spec for variables to create.  f.type==-1 if default is to
-     be used. */
-  struct fmt_spec f;
-
   do
     {
-      if (!parse_DATA_LIST_vars (lexer, &v, &nv, PV_NONE))
+      /* Format spec for variables to create.  f.type==-1 if default is to
+        be used. */
+      struct fmt_spec f;
+
+      if (!parse_DATA_LIST_vars (lexer, &v, &nv, PV_NO_DUPLICATE))
        return CMD_FAILURE;
 
       /* Get the optional format specification. */
-      if (lex_match (lexer, '('))
+      if (lex_match (lexer, T_LPAREN))
        {
          if (!parse_format_specifier (lexer, &f))
            goto fail;
+
+         if ( ! fmt_check_output (&f))
+           goto fail;
+
          if (fmt_is_string (f.type))
            {
               char str[FMT_STRING_LEN_MAX + 1];
@@ -65,7 +69,7 @@ cmd_numeric (struct lexer *lexer, struct dataset *ds)
              goto fail;
            }
 
-         if (!lex_match (lexer, ')'))
+         if (!lex_match (lexer, T_RPAREN))
            {
              msg (SE, _("`)' expected after output format."));
              goto fail;
@@ -92,7 +96,7 @@ cmd_numeric (struct lexer *lexer, struct dataset *ds)
        free (v[i]);
       free (v);
     }
-  while (lex_match (lexer, '/'));
+  while (lex_match (lexer, T_SLASH));
 
   return lex_end_of_command (lexer);
 
@@ -123,12 +127,12 @@ cmd_string (struct lexer *lexer, struct dataset *ds)
 
   do
     {
-      if (!parse_DATA_LIST_vars (lexer, &v, &nv, PV_NONE))
+      if (!parse_DATA_LIST_vars (lexer, &v, &nv, PV_NO_DUPLICATE))
        return CMD_FAILURE;
 
-      if (!lex_force_match (lexer, '(')
+      if (!lex_force_match (lexer, T_LPAREN)
           || !parse_format_specifier (lexer, &f)
-          || !lex_force_match (lexer, ')'))
+          || !lex_force_match (lexer, T_RPAREN))
        goto fail;
       if (!fmt_is_string (f.type))
        {
@@ -158,7 +162,7 @@ cmd_string (struct lexer *lexer, struct dataset *ds)
        free (v[i]);
       free (v);
     }
-  while (lex_match (lexer, '/'));
+  while (lex_match (lexer, T_SLASH));
 
   return lex_end_of_command (lexer);