X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fxforms%2Fcount.c;h=4942f97aad1568e3e6e73eb7bed12c88867d9533;hb=f514231dd2fc0c2adc1ebab5c46a4b55d2bd9c2b;hp=80854d3100661cb81715adfa402f915288b5a13e;hpb=338fb2a2e84df6427a2fdee6769421f57d5666d8;p=pspp-builds.git diff --git a/src/language/xforms/count.c b/src/language/xforms/count.c index 80854d31..4942f97a 100644 --- a/src/language/xforms/count.c +++ b/src/language/xforms/count.c @@ -1,21 +1,18 @@ -/* PSPP - computes sample statistics. +/* PSPP - a program for statistical analysis. 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 - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. 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., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + along with this program. If not, see . */ #include @@ -59,14 +56,14 @@ 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? */ - /* Criterion values. */ + /* Criterion values. */ size_t value_cnt; union { @@ -137,10 +134,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); @@ -178,7 +176,7 @@ cmd_count (struct lexer *lexer, struct dataset *ds) the same dest var more than once. */ dv->var = dict_lookup_var (dataset_dict (ds), dv->name); - if (dv->var == NULL) + if (dv->var == NULL) dv->var = dict_create_var_assert (dataset_dict (ds), dv->name, 0); } @@ -202,12 +200,12 @@ parse_numeric_criteria (struct lexer *lexer, struct pool *pool, struct criteria for (;;) { double low, high; - + if (lex_match_id (lexer, "SYSMIS")) crit->count_system_missing = true; else if (lex_match_id (lexer, "MISSING")) crit->count_user_missing = true; - else if (parse_num_range (lexer, &low, &high, NULL)) + else if (parse_num_range (lexer, &low, &high, NULL)) { struct num_value *cur; @@ -278,25 +276,27 @@ count_numeric (struct criteria *crit, struct ccase *c) for (i = 0; i < crit->var_cnt; i++) { double x = case_num (c, crit->vars[i]); - if (x == SYSMIS) - counter += crit->count_system_missing; - else if (crit->count_user_missing - && var_is_num_user_missing (crit->vars[i], x)) - counter++; - else + 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; - + for (v = crit->values.num; v < crit->values.num + crit->value_cnt; - v++) - if (v->type == CNT_SINGLE ? x == v->a : x >= v->a && x <= v->b) + v++) + if (v->type == CNT_SINGLE ? x == v->a : x >= v->a && x <= v->b) { counter++; break; - } + } } } - + return counter; }