X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fval-labs.c;h=657bf5c735e8b2d59fc48ed7fb1868b394878da3;hb=a29bbbe97388bb6f9c9b4df36b448dfe5023363c;hp=9d289cbce50f7c707637092332d1f53ae59b5fdc;hpb=2ca4a5735ccbbe66ae2277faf6aa47e2bb83bfab;p=pspp diff --git a/src/val-labs.c b/src/val-labs.c index 9d289cbce5..657bf5c735 100644 --- a/src/val-labs.c +++ b/src/val-labs.c @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ #include #include @@ -28,30 +28,28 @@ #include "str.h" #include "value-labels.h" #include "var.h" + +#include "gettext.h" +#define _(msgid) gettext (msgid) /* Declarations. */ static int do_value_labels (int); -static int verify_val_labs (struct variable **vars, int var_cnt); -static void erase_labels (struct variable **vars, int var_cnt); -static int get_label (struct variable **vars, int var_cnt); +static int verify_val_labs (struct variable **vars, size_t var_cnt); +static void erase_labels (struct variable **vars, size_t var_cnt); +static int get_label (struct variable **vars, size_t var_cnt); /* Stubs. */ 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); } @@ -61,13 +59,20 @@ static int do_value_labels (int erase) { struct variable **vars; /* Variable list. */ - int var_cnt; /* Number of variables. */ + size_t 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) @@ -77,7 +82,11 @@ do_value_labels (int erase) goto lossage; if (token != '/') + { + free (vars); break; + } + lex_get (); free (vars); @@ -89,7 +98,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); @@ -99,15 +108,15 @@ do_value_labels (int erase) /* Verifies that none of the VAR_CNT variables in VARS are long string variables. */ static int -verify_val_labs (struct variable **vars, int var_cnt) +verify_val_labs (struct variable **vars, size_t var_cnt) { - int i; + size_t i; for (i = 0; i < var_cnt; i++) { struct variable *vp = vars[i]; - if (vp->type == ALPHA && vp->width > 8) + if (vp->type == ALPHA && vp->width > MAX_SHORT_STRING) { msg (SE, _("It is not possible to assign value labels to long " "string variables such as %s."), vp->name); @@ -119,9 +128,9 @@ verify_val_labs (struct variable **vars, int var_cnt) /* Erases all the labels for the VAR_CNT variables in VARS. */ static void -erase_labels (struct variable **vars, int var_cnt) +erase_labels (struct variable **vars, size_t var_cnt) { - int i; + size_t i; /* Erase old value labels if desired. */ for (i = 0; i < var_cnt; i++) @@ -131,14 +140,14 @@ erase_labels (struct variable **vars, int var_cnt) /* Parse all the labels for the VAR_CNT variables in VARS and add the specified labels to those variables. */ static int -get_label (struct variable **vars, int var_cnt) +get_label (struct variable **vars, size_t var_cnt) { /* Parse all the labels and add them to the variables. */ do { union value value; char *label; - int i; + size_t i; /* Set value. */ if (vars[0]->type == ALPHA) @@ -148,16 +157,16 @@ 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); + buf_copy_str_rpad (value.s, MAX_SHORT_STRING, ds_c_str (&tokstr)); } else { - if (token != T_NUM) + if (!lex_is_number ()) { lex_error (_("expecting integer")); return 0; } - if (!lex_integer_p ()) + if (!lex_is_integer ()) msg (SW, _("Value label `%g' is not integer."), tokval); value.f = tokval; } @@ -171,7 +180,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);