Improve error messages for missing subcommands.
[pspp] / src / language / dictionary / mrsets.c
index 97ab2c1fb4ffdded42110f9812ef73d3454a777b..1f281221a258c6e49d3a0183ccb74c01321008fb 100644 (file)
@@ -79,11 +79,10 @@ parse_group (struct lexer *lexer, struct dictionary *dict,
              enum mrset_type type)
 {
   const char *subcommand_name = type == MRSET_MD ? "MDGROUP" : "MCGROUP";
-  struct mrset *mrset;
   bool labelsource_varlabel;
   bool has_value;
 
-  mrset = xzalloc (sizeof *mrset);
+  struct mrset *mrset = XZALLOC (struct mrset);
   mrset->type = type;
   mrset->cat_source = MRSET_VARLABELS;
 
@@ -93,10 +92,16 @@ parse_group (struct lexer *lexer, struct dictionary *dict,
     {
       if (lex_match_id (lexer, "NAME"))
         {
-          if (!lex_force_match (lexer, T_EQUALS) || !lex_force_id (lexer)
-              || !mrset_is_valid_name (lex_tokcstr (lexer),
-                                       dict_get_encoding (dict), true))
+          if (!lex_force_match (lexer, T_EQUALS) || !lex_force_id (lexer))
             goto error;
+          char *error = mrset_is_valid_name__ (lex_tokcstr (lexer),
+                                               dict_get_encoding (dict));
+          if (error)
+            {
+              lex_error (lexer, "%s", error);
+              free (error);
+              goto error;
+            }
 
           free (mrset->name);
           mrset->name = xstrdup (lex_tokcstr (lexer));
@@ -147,7 +152,7 @@ parse_group (struct lexer *lexer, struct dictionary *dict,
             {
               if (!lex_is_integer (lexer))
                 {
-                  msg (SE, _("Numeric VALUE must be an integer."));
+                  lex_error (lexer, _("Numeric VALUE must be an integer."));
                   goto error;
                 }
               value_destroy (&mrset->counted, mrset->width);
@@ -170,7 +175,7 @@ parse_group (struct lexer *lexer, struct dictionary *dict,
 
               value_destroy (&mrset->counted, mrset->width);
               value_init (&mrset->counted, width);
-              memcpy (value_str_rw (&mrset->counted, width), s, width);
+              memcpy (mrset->counted.s, s, width);
               mrset->width = width;
 
               free (s);
@@ -421,7 +426,8 @@ parse_group (struct lexer *lexer, struct dictionary *dict,
                       if (!c->warned && utf8_strcasecmp (c->label, label))
                         {
                           char *s = data_out (value, var_get_encoding (var),
-                                              var_get_print_format (var));
+                                              var_get_print_format (var),
+                                              settings_get_fmt_settings ());
                           c->warned = true;
                           msg (SW, _("Variables specified on MCGROUP should "
                                      "have the same categories, but %s and %s "
@@ -481,8 +487,8 @@ parse_mrset_names (struct lexer *lexer, struct dictionary *dict,
             return false;
           if (dict_lookup_mrset (dict, lex_tokcstr (lexer)) == NULL)
             {
-              msg (SE, _("No multiple response set named %s."),
-                   lex_tokcstr (lexer));
+              lex_error (lexer, _("No multiple response set named %s."),
+                         lex_tokcstr (lexer));
               stringi_set_destroy (mrset_names);
               return false;
             }