Fixed some memory leaks.
[pspp-builds.git] / src / val-labs.c
index 9d289cbce50f7c707637092332d1f53ae59b5fdc..1af46a2c5d81496e5bc5f5156805a395d3002883 100644 (file)
@@ -41,17 +41,12 @@ static int get_label (struct variable **vars, int var_cnt);
 int
 cmd_value_labels (void)
 {
-  lex_match_id ("VALUE");
-  lex_match_id ("LABELS");
   return do_value_labels (1);
 }
 
 int
 cmd_add_value_labels (void)
 {
-  lex_match_id ("ADD");
-  lex_match_id ("VALUE");
-  lex_match_id ("LABELS");
   return do_value_labels (0);
 }
 \f
@@ -62,12 +57,19 @@ do_value_labels (int erase)
 {
   struct variable **vars; /* Variable list. */
   int var_cnt;            /* Number of variables. */
+  int parse_err=0;        /* true if error parsing variables */
 
   lex_match ('/');
   
   while (token != '.')
     {
-      parse_variables (default_dict, &vars, &var_cnt, PV_SAME_TYPE);
+      parse_err = !parse_variables (default_dict, &vars, &var_cnt, 
+                                   PV_SAME_TYPE) ;
+      if (var_cnt < 1)
+       {
+         free(vars);
+         return CMD_FAILURE;
+       }
       if (!verify_val_labs (vars, var_cnt))
         goto lossage;
       if (erase)
@@ -82,6 +84,7 @@ do_value_labels (int erase)
 
       free (vars);
     }
+  free (vars);
 
   if (token != '.')
     {
@@ -89,7 +92,7 @@ do_value_labels (int erase)
       return CMD_TRAILING_GARBAGE;
     }
 
-  return CMD_SUCCESS;
+  return parse_err ? CMD_PART_SUCCESS_MAYBE : CMD_SUCCESS;
 
  lossage:
   free (vars);
@@ -148,7 +151,7 @@ get_label (struct variable **vars, int var_cnt)
               lex_error (_("expecting string"));
              return 0;
            }
-         st_bare_pad_copy (value.s, ds_value (&tokstr), MAX_SHORT_STRING);
+         st_bare_pad_copy (value.s, ds_c_str (&tokstr), MAX_SHORT_STRING);
        }
       else
        {
@@ -171,7 +174,7 @@ get_label (struct variable **vars, int var_cnt)
          msg (SW, _("Truncating value label to 60 characters."));
          ds_truncate (&tokstr, 60);
        }
-      label = ds_value (&tokstr);
+      label = ds_c_str (&tokstr);
 
       for (i = 0; i < var_cnt; i++)
         val_labs_replace (vars[i]->val_labs, value, label);