X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fcrosstabs.c;h=bb63e982538b30a912e52ae94cfcce96c83a76b0;hb=9574a6c2bf65ddc8ef13d4e942833bc5d4b0d2e0;hp=b6a5de51110d02fb360bfd0c84ae634002261ffa;hpb=f751a381d7b792ee539ff2297a2b1ab9afe2d8c3;p=pspp diff --git a/src/language/stats/crosstabs.c b/src/language/stats/crosstabs.c index b6a5de5111..bb63e98253 100644 --- a/src/language/stats/crosstabs.c +++ b/src/language/stats/crosstabs.c @@ -59,6 +59,7 @@ #include "output/charts/barchart.h" #include "gl/minmax.h" +#include "gl/xalloc-oversized.h" #include "gl/xalloc.h" #include "gl/xsize.h" @@ -320,7 +321,7 @@ cmd_crosstabs (struct lexer *lexer, struct dataset *ds) else if (lex_match_id (lexer, "INCLUDE")) proc.exclude = MV_SYSTEM; else if (lex_match_id (lexer, "REPORT")) - proc.exclude = MV_NEVER; + proc.exclude = 0; else { lex_error (lexer, NULL); @@ -469,7 +470,7 @@ cmd_crosstabs (struct lexer *lexer, struct dataset *ds) assert (proc.n_cells < CRS_N_CELLS); /* Missing values. */ - if (proc.mode == GENERAL && proc.exclude == MV_NEVER) + if (proc.mode == GENERAL && !proc.exclude) { msg (SE, _("Missing mode %s not allowed in general mode. " "Assuming %s."), "REPORT", "MISSING=TABLE"); @@ -605,7 +606,7 @@ parse_crosstabs_tables (struct lexer *lexer, struct dataset *ds, } } - int *by_iter = xcalloc (n_by, sizeof *by_iter); + int *by_iter = XCALLOC (n_by, int); proc->pivots = xnrealloc (proc->pivots, proc->n_pivots + nx, sizeof *proc->pivots); for (int i = 0; i < nx; i++) @@ -664,9 +665,6 @@ parse_crosstabs_variables (struct lexer *lexer, struct dataset *ds, for (;;) { size_t orig_nv = proc->n_variables; - size_t i; - - long min, max; if (!parse_variables_const (lexer, dataset_dict (ds), &proc->variables, &proc->n_variables, @@ -679,26 +677,20 @@ parse_crosstabs_variables (struct lexer *lexer, struct dataset *ds, if (!lex_force_int (lexer)) goto error; - min = lex_integer (lexer); + long min = lex_integer (lexer); lex_get (lexer); lex_match (lexer, T_COMMA); - if (!lex_force_int (lexer)) + if (!lex_force_int_range (lexer, NULL, min, LONG_MAX)) goto error; - max = lex_integer (lexer); - if (max < min) - { - msg (SE, _("Maximum value (%ld) less than minimum value (%ld)."), - max, min); - goto error; - } + long max = lex_integer (lexer); lex_get (lexer); if (!lex_force_match (lexer, T_RPAREN)) goto error; - for (i = orig_nv; i < proc->n_variables; i++) + for (size_t i = orig_nv; i < proc->n_variables; i++) { const struct variable *var = proc->variables[i]; struct var_range *vr = xmalloc (sizeof *vr); @@ -753,7 +745,7 @@ should_tabulate_case (const struct crosstabulation *xt, const struct ccase *c, const struct variable *var = xt->vars[j].var; const struct var_range *range = get_var_range (xt->proc, var); - if (var_is_value_missing (var, case_data (c, var), exclude)) + if (var_is_value_missing (var, case_data (c, var)) & exclude) return false; if (range != NULL) @@ -920,7 +912,7 @@ postcalc (struct crosstabs_proc *proc) if (proc->barchart) { int n_vars = (xt->n_vars > 2 ? 2 : xt->n_vars); - const struct variable **vars = xcalloc (n_vars, sizeof *vars); + const struct variable **vars = XCALLOC (n_vars, const struct variable*); for (size_t i = 0; i < n_vars; i++) vars[i] = xt->vars[i].var; chart_submit (barchart_create (vars, n_vars, _("Count"), @@ -1199,7 +1191,7 @@ output_crosstabulation (struct crosstabs_proc *proc, struct crosstabulation *xt) if (table) display_crosstabulation (proc, &x, table, crs_leaves); - if (proc->exclude == MV_NEVER) + if (proc->exclude == 0) delete_missing (&x); if (chisq) @@ -1343,7 +1335,7 @@ add_var_dimension (struct pivot_table *table, const struct xtab_var *var, { struct pivot_value *value = pivot_value_new_var_value ( var->var, &var->values[j]); - if (var_is_value_missing (var->var, &var->values[j], MV_ANY)) + if (var_is_value_missing (var->var, &var->values[j])) pivot_value_add_footnote (value, missing_footnote); pivot_category_create_leaf (group, value); } @@ -1570,7 +1562,7 @@ delete_missing (struct crosstabulation *xt) for (r = 0; r < n_rows; r++) if (var_is_num_missing (xt->vars[ROW_VAR].var, - xt->vars[ROW_VAR].values[r].f, MV_USER)) + xt->vars[ROW_VAR].values[r].f) == MV_USER) { for (c = 0; c < n_cols; c++) xt->mat[c + r * n_cols] = 0.; @@ -1580,7 +1572,7 @@ delete_missing (struct crosstabulation *xt) for (c = 0; c < n_cols; c++) if (var_is_num_missing (xt->vars[COL_VAR].var, - xt->vars[COL_VAR].values[c].f, MV_USER)) + xt->vars[COL_VAR].values[c].f) == MV_USER) { for (r = 0; r < n_rows; r++) xt->mat[c + r * n_cols] = 0.; @@ -1725,7 +1717,8 @@ display_crosstabulation (struct crosstabs_proc *proc, double expected_value = xt->row_tot[r] * xt->col_tot[c] / xt->total; double residual = *mp - expected_value; double sresidual = residual / sqrt (expected_value); - double asresidual = (sresidual + double asresidual + = residual / sqrt (expected_value * (1. - xt->row_tot[r] / xt->total) * (1. - xt->col_tot[c] / xt->total)); double entries[CRS_N_CELLS] = { @@ -1930,6 +1923,7 @@ display_risk (struct crosstabulation *xt, struct pivot_table *risk, union value c[2]; if (!calc_risk (xt, risk_v, upper, lower, c, &n_valid)) return; + assert (risk_statistics); size_t *indexes = xnmalloc (risk->n_dimensions, sizeof *indexes); assert (xt->n_vars == 2); @@ -2964,9 +2958,3 @@ calc_directional (struct crosstabs_proc *proc, struct crosstabulation *xt, return 1; } - -/* - Local Variables: - mode: c - End: -*/