Improve error messages for format specifiers.
[pspp] / src / language / dictionary / formats.c
index 718344acc63ed1037787c1ab6823507b7e2ae8dd..907a47f9ae6efb68d5c6e4e6b1a64ab7752eb57f 100644 (file)
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
 
-enum
-  {
-    FORMATS_PRINT = 001,
-    FORMATS_WRITE = 002
-  };
-
-static int internal_cmd_formats (struct lexer *, struct dataset *ds, int);
+static int cmd_formats__ (struct lexer *, struct dataset *ds,
+                          bool print_format, bool write_format);
 
 int
 cmd_print_formats (struct lexer *lexer, struct dataset *ds)
 {
-  return internal_cmd_formats (lexer, ds, FORMATS_PRINT);
+  return cmd_formats__ (lexer, ds, true, false);
 }
 
 int
 cmd_write_formats (struct lexer *lexer, struct dataset *ds)
 {
-  return internal_cmd_formats (lexer, ds, FORMATS_WRITE);
+  return cmd_formats__ (lexer, ds, false, true);
 }
 
 int
 cmd_formats (struct lexer *lexer, struct dataset *ds)
 {
-  return internal_cmd_formats (lexer, ds, FORMATS_PRINT | FORMATS_WRITE);
+  return cmd_formats__ (lexer, ds, true, true);
 }
 
 static int
-internal_cmd_formats (struct lexer *lexer, struct dataset *ds, int which)
+cmd_formats__ (struct lexer *lexer, struct dataset *ds,
+               bool print_format, bool write_format)
 {
   /* Variables. */
   struct variable **v;
@@ -73,6 +69,8 @@ internal_cmd_formats (struct lexer *lexer, struct dataset *ds, int which)
       int width;
       size_t i;
 
+      lex_match (lexer, T_SLASH);
+
       if (lex_token (lexer) == T_ENDCMD)
        break;
 
@@ -82,25 +80,32 @@ internal_cmd_formats (struct lexer *lexer, struct dataset *ds, int which)
 
       if (!lex_match (lexer, T_LPAREN))
        {
-         msg (SE, _("`(' expected after variable list."));
+          lex_error_expecting (lexer, "`('");
          goto fail;
        }
-      if (!parse_format_specifier (lexer, &f)
-          || !fmt_check_output (&f)
-          || !fmt_check_width_compat (&f, width))
-       goto fail;
+      if (!parse_format_specifier (lexer, &f))
+        goto fail;
+      char *error = fmt_check_output__ (&f);
+      if (!error)
+        error = fmt_check_width_compat__ (&f, var_get_name (v[0]), width);
+      if (error)
+        {
+          lex_next_error (lexer, -1, -1, "%s", error);
+          free (error);
+          goto fail;
+        }
 
       if (!lex_match (lexer, T_RPAREN))
        {
-         msg (SE, _("`)' expected after output format."));
+          lex_error_expecting (lexer, "`)'");
          goto fail;
        }
 
       for (i = 0; i < cv; i++)
        {
-         if (which & FORMATS_PRINT)
+         if (print_format)
             var_set_print_format (v[i], &f);
-         if (which & FORMATS_WRITE)
+         if (write_format)
             var_set_write_format (v[i], &f);
        }
       free (v);