X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fxforms%2Fcount.c;h=39f04574975faa4732cc682878937f888d1b222d;hb=9105b67fe006fe41c044e3659325594a52d0c899;hp=371f2ecbada1a33d34efea3b97019766985d3244;hpb=3816248a008a4af75aac6319d0c9929cb7ff679e;p=pspp diff --git a/src/language/xforms/count.c b/src/language/xforms/count.c index 371f2ecbad..39f0457497 100644 --- a/src/language/xforms/count.c +++ b/src/language/xforms/count.c @@ -1,6 +1,5 @@ /* PSPP - computes sample statistics. Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. - Written by Ben Pfaff . This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -59,10 +58,10 @@ struct criteria struct criteria *next; /* Variables to count. */ - struct variable **vars; + const struct variable **vars; size_t var_cnt; - /* Count special values?. */ + /* Count special values? */ bool count_system_missing; /* Count system missing? */ bool count_user_missing; /* Count user missing? */ @@ -120,7 +119,7 @@ cmd_count (struct lexer *lexer, struct dataset *ds) dv->var = dict_lookup_var (dataset_dict (ds), lex_tokid (lexer)); if (dv->var != NULL) { - if (dv->var->type == ALPHA) + if (var_is_alpha (dv->var)) { msg (SE, _("Destination cannot be a string variable.")); goto fail; @@ -137,10 +136,11 @@ cmd_count (struct lexer *lexer, struct dataset *ds) for (;;) { bool ok; - + crit->next = NULL; crit->vars = NULL; - if (!parse_variables (lexer, dataset_dict (ds), &crit->vars, &crit->var_cnt, + if (!parse_variables_const (lexer, dataset_dict (ds), &crit->vars, + &crit->var_cnt, PV_DUPLICATE | PV_SAME_TYPE)) goto fail; pool_register (trns->pool, free, crit->vars); @@ -149,7 +149,7 @@ cmd_count (struct lexer *lexer, struct dataset *ds) goto fail; crit->value_cnt = 0; - if (crit->vars[0]->type == NUMERIC) + if (var_is_numeric (crit->vars[0])) ok = parse_numeric_criteria (lexer, trns->pool, crit); else ok = parse_string_criteria (lexer, trns->pool, crit); @@ -239,8 +239,8 @@ parse_string_criteria (struct lexer *lexer, struct pool *pool, struct criteria * size_t i; for (i = 0; i < crit->var_cnt; i++) - if (crit->vars[i]->width > len) - len = crit->vars[i]->width; + if (var_get_width (crit->vars[i]) > len) + len = var_get_width (crit->vars[i]); crit->values.str = NULL; for (;;) @@ -277,12 +277,14 @@ count_numeric (struct criteria *crit, struct ccase *c) for (i = 0; i < crit->var_cnt; i++) { - double x = case_num (c, crit->vars[i]->fv); - if (x == SYSMIS) - counter += crit->count_system_missing; - else if (crit->count_user_missing - && mv_is_num_user_missing (&crit->vars[i]->miss, x)) - counter++; + double x = case_num (c, crit->vars[i]); + if (var_is_num_missing (crit->vars[i], x, MV_ANY)) + { + if (x == SYSMIS + ? crit->count_system_missing + : crit->count_user_missing) + counter++; + } else { struct num_value *v; @@ -311,8 +313,8 @@ count_string (struct criteria *crit, struct ccase *c) { char **v; for (v = crit->values.str; v < crit->values.str + crit->value_cnt; v++) - if (!memcmp (case_str (c, crit->vars[i]->fv), *v, - crit->vars[i]->width)) + if (!memcmp (case_str (c, crit->vars[i]), *v, + var_get_width (crit->vars[i]))) { counter++; break; @@ -337,11 +339,11 @@ count_trns_proc (void *trns_, struct ccase *c, counter = 0; for (crit = dv->crit; crit; crit = crit->next) - if (crit->vars[0]->type == NUMERIC) + if (var_is_numeric (crit->vars[0])) counter += count_numeric (crit, c); else counter += count_string (crit, c); - case_data_rw (c, dv->var->fv)->f = counter; + case_data_rw (c, dv->var)->f = counter; } return TRNS_CONTINUE; }