X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmodify-vars.c;h=4d01b6a942399b7b1568d77d53b4c76829758c09;hb=92fb12eb06716d14c05b781f5d9dcde956d77c30;hp=4911664d92870846784613a1bd9505f35e960432;hpb=05e356b2a3087e819ef3b5388e29c822f41502e1;p=pspp diff --git a/src/modify-vars.c b/src/modify-vars.c index 4911664d92..4d01b6a942 100644 --- a/src/modify-vars.c +++ b/src/modify-vars.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 @@ -33,6 +33,9 @@ #include "var.h" #include "vfm.h" +#include "gettext.h" +#define _(msgid) gettext (msgid) + /* FIXME: should change weighting variable, etc. */ /* These control the ordering produced by compare_variables_given_ordering(). */ @@ -106,7 +109,7 @@ cmd_modify_vars (void) if (lex_match_id ("REORDER")) { struct variable **v = NULL; - int nv = 0; + size_t nv = 0; if (already_encountered & 1) { @@ -119,7 +122,7 @@ cmd_modify_vars (void) do { struct ordering ordering; - int prev_nv = nv; + size_t prev_nv = nv; ordering.forward = ordering.positional = 1; if (lex_match_id ("FORWARD")); @@ -181,8 +184,8 @@ cmd_modify_vars (void) lex_match ('='); do { - int prev_nv_1 = vm.rename_cnt; - int prev_nv_2 = vm.rename_cnt; + size_t prev_nv_1 = vm.rename_cnt; + size_t prev_nv_2 = vm.rename_cnt; if (!lex_match ('(')) { @@ -223,7 +226,7 @@ cmd_modify_vars (void) else if (lex_match_id ("KEEP")) { struct variable **keep_vars, **all_vars, **drop_vars; - int keep_cnt, all_cnt, drop_cnt; + size_t keep_cnt, all_cnt, drop_cnt; if (already_encountered & 4) { @@ -244,9 +247,10 @@ cmd_modify_vars (void) compare_variables_given_ordering, &forward_positional_ordering); dict_get_vars (default_dict, &all_vars, &all_cnt, 0); + assert (all_cnt >= keep_cnt); drop_cnt = all_cnt - keep_cnt; - drop_vars = xmalloc (drop_cnt * sizeof *keep_vars); + drop_vars = xnmalloc (drop_cnt, sizeof *keep_vars); if (set_difference (all_vars, all_cnt, keep_vars, keep_cnt, sizeof *all_vars, @@ -265,7 +269,7 @@ cmd_modify_vars (void) else if (lex_match_id ("DROP")) { struct variable **drop_vars; - int drop_cnt; + size_t drop_cnt; if (already_encountered & 4) { @@ -348,7 +352,7 @@ compare_variables_given_ordering (const void *a_, const void *b_, if (ordering->positional) result = a->index < b->index ? -1 : a->index > b->index; else - result = strcmp (a->name, b->name); + result = strcasecmp (a->name, b->name); if (!ordering->forward) result = -result; return result; @@ -358,7 +362,7 @@ compare_variables_given_ordering (const void *a_, const void *b_, struct var_renaming { struct variable *var; - char new_name[SHORT_NAME_LEN + 1]; + char new_name[LONG_NAME_LEN + 1]; }; /* A algo_compare_func that compares new_name members in struct @@ -370,7 +374,7 @@ compare_var_renaming_by_new_name (const void *a_, const void *b_, const struct var_renaming *a = a_; const struct var_renaming *b = b_; - return strcmp (a->new_name, b->new_name); + return strcasecmp (a->new_name, b->new_name); } /* Returns true if performing VM on dictionary D would not cause @@ -387,7 +391,8 @@ validate_var_modification (const struct dictionary *d, struct variable **all_vars; struct variable **keep_vars; struct variable **drop_vars; - size_t all_cnt, keep_cnt, drop_cnt; + size_t keep_cnt, drop_cnt; + size_t all_cnt; struct var_renaming *var_renaming; int valid; @@ -398,14 +403,15 @@ validate_var_modification (const struct dictionary *d, /* Drop variables, in index order. */ drop_cnt = vm->drop_cnt; - drop_vars = xmalloc (drop_cnt * sizeof *drop_vars); + drop_vars = xnmalloc (drop_cnt, sizeof *drop_vars); memcpy (drop_vars, vm->drop_vars, drop_cnt * sizeof *drop_vars); sort (drop_vars, drop_cnt, sizeof *drop_vars, compare_variables_given_ordering, &forward_positional_ordering); /* Keep variables, in index order. */ + assert (all_cnt >= drop_cnt); keep_cnt = all_cnt - drop_cnt; - keep_vars = xmalloc (keep_cnt * sizeof *keep_vars); + keep_vars = xnmalloc (keep_cnt, sizeof *keep_vars); if (set_difference (all_vars, all_cnt, drop_vars, drop_cnt, sizeof *all_vars, @@ -415,7 +421,7 @@ validate_var_modification (const struct dictionary *d, assert (0); /* Copy variables into var_renaming array. */ - var_renaming = xmalloc (keep_cnt * sizeof *var_renaming); + var_renaming = xnmalloc (keep_cnt, sizeof *var_renaming); for (i = 0; i < keep_cnt; i++) { var_renaming[i].var = keep_vars[i]; @@ -480,7 +486,7 @@ rearrange_dict (struct dictionary *d, const struct var_modification *vm) /* Record the old names of variables to rename. After variables are deleted, we can't depend on the variables to still exist, but we can still look them up by name. */ - rename_old_names = xmalloc (vm->rename_cnt * sizeof *rename_old_names); + rename_old_names = xnmalloc (vm->rename_cnt, sizeof *rename_old_names); for (i = 0; i < vm->rename_cnt; i++) rename_old_names[i] = xstrdup (vm->rename_vars[i]->name); @@ -489,8 +495,8 @@ rearrange_dict (struct dictionary *d, const struct var_modification *vm) dict_delete_vars (d, vm->drop_vars, vm->drop_cnt); /* Compose lists of variables to rename and their new names. */ - rename_vars = xmalloc (vm->rename_cnt * sizeof *rename_vars); - rename_new_names = xmalloc (vm->rename_cnt * sizeof *rename_new_names); + rename_vars = xnmalloc (vm->rename_cnt, sizeof *rename_vars); + rename_new_names = xnmalloc (vm->rename_cnt, sizeof *rename_new_names); rename_cnt = 0; for (i = 0; i < vm->rename_cnt; i++) {