X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Faggregate.c;h=044297462c982a2d395a6ef66c9d26780015163d;hb=48386ee68a5283653435d05a9ea4e449710fd370;hp=7d1c7a7a72cb245c751601b711af76463477d825;hpb=687adf53eae434e88a47bb3409f946f3a26115a4;p=pspp diff --git a/src/language/stats/aggregate.c b/src/language/stats/aggregate.c index 7d1c7a7a72..044297462c 100644 --- a/src/language/stats/aggregate.c +++ b/src/language/stats/aggregate.c @@ -64,17 +64,17 @@ struct agr_var struct agr_var *next; /* Next in list. */ /* Collected during parsing. */ - struct variable *src; /* Source variable. */ + const struct variable *src; /* Source variable. */ struct variable *dest; /* Target variable. */ int function; /* Function. */ - int include_missing; /* 1=Include user-missing values. */ + enum mv_class exclude; /* Classes of missing values to exclude. */ union agr_argument arg[2]; /* Arguments. */ /* Accumulated during AGGREGATE execution. */ double dbl[3]; int int1, int2; char *string; - int missing; + bool saw_missing; struct moments1 *moments; }; @@ -141,7 +141,7 @@ struct agr_proc /* Break variables. */ struct sort_criteria *sort; /* Sort criteria. */ - struct variable **break_vars; /* Break variables. */ + const struct variable **break_vars; /* Break variables. */ size_t break_var_cnt; /* Number of break variables. */ struct ccase break_case; /* Last values of break variables. */ @@ -305,7 +305,6 @@ cmd_aggregate (struct lexer *lexer, struct dataset *ds) goto error; } discard_variables (ds); - dict_destroy (dict); dataset_set_dict (ds, agr.dict); agr.dict = NULL; proc_set_source (ds, agr.sink->class->make_source (agr.sink)); @@ -391,13 +390,13 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict, s size_t n_dest; struct string function_name; - int include_missing; + enum mv_class exclude; const struct agr_func *function; int func_index; union agr_argument arg[2]; - struct variable **src; + const struct variable **src; size_t n_src; size_t i; @@ -410,6 +409,7 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict, s n_src = 0; arg[0].c = NULL; arg[1].c = NULL; + ds_init_empty (&function_name); /* Parse the list of target variables. */ while (!lex_match (lexer, '=')) @@ -450,14 +450,14 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict, s goto error; } - include_missing = 0; + exclude = MV_ANY; - ds_init_string (&function_name, lex_tokstr (lexer)); + ds_assign_string (&function_name, lex_tokstr (lexer)); ds_chomp (&function_name, '.'); if (lex_tokid(lexer)[strlen (lex_tokid (lexer)) - 1] == '.') - include_missing = 1; + exclude = MV_SYSTEM; for (function = agr_func_tab; function->name; function++) if (!strcasecmp (function->name, ds_cstr (&function_name))) @@ -496,7 +496,7 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict, s else if (function->n_args) pv_opts |= PV_SAME_TYPE; - if (!parse_variables (lexer, dict, &src, &n_src, pv_opts)) + if (!parse_variables_const (lexer, dict, &src, &n_src, pv_opts)) goto error; } @@ -520,8 +520,8 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict, s } else { - msg (SE, _("Missing argument %d to %s."), i + 1, - function->name); + msg (SE, _("Missing argument %d to %s."), + (int) i + 1, function->name); goto error; } @@ -652,7 +652,7 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict, s v->dest = destvar; } - v->include_missing = include_missing; + v->exclude = exclude; if (v->src != NULL) { @@ -793,9 +793,7 @@ accumulate_aggregate_info (struct agr_proc *agr, const union value *v = case_data (input, iter->src); int src_width = var_get_width (iter->src); - if (iter->include_missing - ? var_is_numeric (iter->src) && v->f == SYSMIS - : var_is_value_missing (iter->src, v)) + if (var_is_value_missing (iter->src, v, iter->exclude)) { switch (iter->function) { @@ -808,7 +806,7 @@ accumulate_aggregate_info (struct agr_proc *agr, iter->int1++; break; } - iter->missing = 1; + iter->saw_missing = true; continue; } @@ -961,7 +959,7 @@ dump_aggregate_info (struct agr_proc *agr, struct ccase *output) for (i = 0; i < agr->break_var_cnt; i++) { - struct variable *v = agr->break_vars[i]; + const struct variable *v = agr->break_vars[i]; size_t value_cnt = var_get_value_cnt (v); memcpy (case_data_rw_idx (output, value_idx), case_data (&agr->break_case, v), @@ -977,7 +975,7 @@ dump_aggregate_info (struct agr_proc *agr, struct ccase *output) { union value *v = case_data_rw (output, i->dest); - if (agr->missing == COLUMNWISE && i->missing != 0 + if (agr->missing == COLUMNWISE && i->saw_missing && (i->function & FUNC) != N && (i->function & FUNC) != NU && (i->function & FUNC) != NMISS && (i->function & FUNC) != NUMISS) { @@ -1091,7 +1089,7 @@ initialize_aggregate_info (struct agr_proc *agr, const struct ccase *input) for (iter = agr->agr_vars; iter; iter = iter->next) { - iter->missing = 0; + iter->saw_missing = false; iter->dbl[0] = iter->dbl[1] = iter->dbl[2] = 0.0; iter->int1 = iter->int2 = 0; switch (iter->function)