X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fcrosstabs.q;h=becc2edbd03fdb3299975e36a1ef70e14c174b37;hb=e7d0a9f16192ceeff9243f0ede8e399ee1ef0d44;hp=c821ce0ad6484e477b162979e628f346059e1ac1;hpb=e9aa6e433b846849da90550f6800095d569fb549;p=pspp-builds.git diff --git a/src/language/stats/crosstabs.q b/src/language/stats/crosstabs.q index c821ce0a..becc2edb 100644 --- a/src/language/stats/crosstabs.q +++ b/src/language/stats/crosstabs.q @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -68,7 +69,7 @@ crosstabs (crs_): *^tables=custom; +variables=custom; - +missing=miss:!table/include/report; + missing=miss:!table/include/report; +write[wr_]=none,cells,all; +format=fmt:!labels/nolabels/novallabs, val:!avalue/dvalue, @@ -174,11 +175,11 @@ static struct cmd_crosstabs cmd; static struct pool *pl_tc; /* For table cells. */ static struct pool *pl_col; /* For column data. */ -static int internal_cmd_crosstabs (void); -static void precalc (const struct ccase *, void *); -static bool calc_general (const struct ccase *, void *); -static bool calc_integer (const struct ccase *, void *); -static void postcalc (void *); +static int internal_cmd_crosstabs (struct dataset *ds); +static void precalc (const struct ccase *, void *, const struct dataset *); +static bool calc_general (const struct ccase *, void *, const struct dataset *); +static bool calc_integer (const struct ccase *, void *, const struct dataset *); +static bool postcalc (void *, const struct dataset *); static void submit (struct tab_table *); static void format_short (char *s, const struct fmt_spec *fp, @@ -186,9 +187,9 @@ static void format_short (char *s, const struct fmt_spec *fp, /* Parse and execute CROSSTABS, then clean up. */ int -cmd_crosstabs (void) +cmd_crosstabs (struct dataset *ds) { - int result = internal_cmd_crosstabs (); + int result = internal_cmd_crosstabs (ds); free (variables); pool_destroy (pl_tc); @@ -199,7 +200,7 @@ cmd_crosstabs (void) /* Parses and executes the CROSSTABS procedure. */ static int -internal_cmd_crosstabs (void) +internal_cmd_crosstabs (struct dataset *ds) { int i; bool ok; @@ -211,7 +212,7 @@ internal_cmd_crosstabs (void) pl_tc = pool_create (); pl_col = pool_create (); - if (!parse_crosstabs (&cmd)) + if (!parse_crosstabs (ds, &cmd, NULL)) return CMD_FAILURE; mode = variables ? INTEGER : GENERAL; @@ -292,7 +293,7 @@ internal_cmd_crosstabs (void) else write = CRS_WR_NONE; - ok = procedure_with_splits (precalc, + ok = procedure_with_splits (ds, precalc, mode == GENERAL ? calc_general : calc_integer, postcalc, NULL); @@ -301,7 +302,7 @@ internal_cmd_crosstabs (void) /* Parses the TABLES subcommand. */ static int -crs_custom_tables (struct cmd_crosstabs *cmd UNUSED) +crs_custom_tables (struct dataset *ds, struct cmd_crosstabs *cmd UNUSED, void *aux UNUSED) { struct var_set *var_set; int n_by; @@ -312,7 +313,7 @@ crs_custom_tables (struct cmd_crosstabs *cmd UNUSED) /* Ensure that this is a TABLES subcommand. */ if (!lex_match_id ("TABLES") - && (token != T_ID || dict_lookup_var (default_dict, tokid) == NULL) + && (token != T_ID || dict_lookup_var (dataset_dict (ds), tokid) == NULL) && token != T_ALL) return 2; lex_match ('='); @@ -320,7 +321,7 @@ crs_custom_tables (struct cmd_crosstabs *cmd UNUSED) if (variables != NULL) var_set = var_set_create_from_array (variables, variables_cnt); else - var_set = var_set_create_from_dict (default_dict); + var_set = var_set_create_from_dict (dataset_dict (ds)); assert (var_set != NULL); for (n_by = 0; ;) @@ -405,7 +406,7 @@ crs_custom_tables (struct cmd_crosstabs *cmd UNUSED) /* Parses the VARIABLES subcommand. */ static int -crs_custom_variables (struct cmd_crosstabs *cmd UNUSED) +crs_custom_variables (struct dataset *ds, struct cmd_crosstabs *cmd UNUSED, void *aux UNUSED) { if (nxtab) { @@ -422,7 +423,7 @@ crs_custom_variables (struct cmd_crosstabs *cmd UNUSED) long min, max; - if (!parse_variables (default_dict, &variables, &variables_cnt, + if (!parse_variables (dataset_dict (ds), &variables, &variables_cnt, (PV_APPEND | PV_NUMERIC | PV_NO_DUPLICATE | PV_NO_SCRATCH))) return 0; @@ -482,14 +483,14 @@ crs_custom_variables (struct cmd_crosstabs *cmd UNUSED) /* Data file processing. */ -static int compare_table_entry (const void *, const void *, void *); -static unsigned hash_table_entry (const void *, void *); +static int compare_table_entry (const void *, const void *, const void *); +static unsigned hash_table_entry (const void *, const void *); /* Set up the crosstabulation tables for processing. */ -static void -precalc (const struct ccase *first, void *aux UNUSED) +static void +precalc (const struct ccase *first, void *aux UNUSED, const struct dataset *ds) { - output_split_file_values (first); + output_split_file_values (ds, first); if (mode == GENERAL) { gen_tab = hsh_create (512, compare_table_entry, hash_table_entry, @@ -557,16 +558,17 @@ precalc (const struct ccase *first, void *aux UNUSED) n_sorted_tab + 1, sizeof *sorted_tab); sorted_tab[n_sorted_tab] = NULL; } + } /* Form crosstabulations for general mode. */ static bool -calc_general (const struct ccase *c, void *aux UNUSED) +calc_general (const struct ccase *c, void *aux UNUSED, const struct dataset *ds) { - int bad_warn = 1; + bool bad_warn = true; /* Case weight. */ - double weight = dict_get_case_weight (default_dict, c, &bad_warn); + double weight = dict_get_case_weight (dataset_dict (ds), c, &bad_warn); /* Flattened current table index. */ int t; @@ -635,12 +637,12 @@ calc_general (const struct ccase *c, void *aux UNUSED) } static bool -calc_integer (const struct ccase *c, void *aux UNUSED) +calc_integer (const struct ccase *c, void *aux UNUSED, const struct dataset *ds) { - int bad_warn = 1; + bool bad_warn = true; /* Case weight. */ - double weight = dict_get_case_weight (default_dict, c, &bad_warn); + double weight = dict_get_case_weight (dataset_dict (ds), c, &bad_warn); /* Flattened current table index. */ int t; @@ -695,7 +697,7 @@ calc_integer (const struct ccase *c, void *aux UNUSED) /* Compare the table_entry's at A and B and return a strcmp()-type result. */ static int -compare_table_entry (const void *a_, const void *b_, void *foo UNUSED) +compare_table_entry (const void *a_, const void *b_, const void *aux UNUSED) { const struct table_entry *a = a_; const struct table_entry *b = b_; @@ -735,7 +737,7 @@ compare_table_entry (const void *a_, const void *b_, void *foo UNUSED) /* Calculate a hash value from table_entry A. */ static unsigned -hash_table_entry (const void *a_, void *foo UNUSED) +hash_table_entry (const void *a_, const void *aux UNUSED) { const struct table_entry *a = a_; unsigned long hash; @@ -760,8 +762,8 @@ static void output_pivot_table (struct table_entry **, struct table_entry **, int *, int *, int *); static void make_summary_table (void); -static void -postcalc (void *aux UNUSED) +static bool +postcalc (void *aux UNUSED, const struct dataset *ds UNUSED) { if (mode == GENERAL) { @@ -797,6 +799,8 @@ postcalc (void *aux UNUSED) } hsh_destroy (gen_tab); + + return true; } static void insert_summary (struct tab_table *, int tab_index, double valid); @@ -948,7 +952,7 @@ static int n_rows; static int ns_cols, ns_rows; /* Crosstabulation. */ -static struct crosstab *x; +static const struct crosstab *x; /* Number of variables from the crosstabulation to consider. This is either x->nvar, if pivoting is on, or 2, if pivoting is off. */ @@ -1606,7 +1610,7 @@ find_pivot_extent_integer (struct table_entry **tp, int *cnt, int pivot) result. WIDTH_ points to an int which is either 0 for a numeric value or a string width for a string value. */ static int -compare_value (const void *a_, const void *b_, void *width_) +compare_value (const void *a_, const void *b_, const void *width_) { const union value *a = a_; const union value *b = b_; @@ -1701,11 +1705,11 @@ display_dimensions (struct tab_table *table, int first_difference, struct table_ } /* Put VALUE into cell (C,R) of TABLE, suffixed with character - SUFFIX if nonzero. If MARK_MISSING is nonzero the entry is + SUFFIX if nonzero. If MARK_MISSING is true the entry is additionally suffixed with a letter `M'. */ static void format_cell_entry (struct tab_table *table, int c, int r, double value, - char suffix, int mark_missing) + char suffix, bool mark_missing) { const struct fmt_spec f = {FMT_F, 10, 1}; union value v; @@ -1754,13 +1758,13 @@ display_crosstabulation (void) tab_hline (table, TAL_1, -1, n_cols, 0); for (c = 0; c < n_cols; c++) { - int mark_missing = 0; + bool mark_missing = false; double expected_value = row_tot[r] * col_tot[c] / W; if (cmd.miss == CRS_REPORT && (mv_is_num_user_missing (&x->vars[COL_VAR]->miss, cols[c].f) || mv_is_num_user_missing (&x->vars[ROW_VAR]->miss, rows[r].f))) - mark_missing = 1; + mark_missing = true; for (i = 0; i < num_cells; i++) { double v; @@ -1799,8 +1803,7 @@ display_crosstabulation (void) * (1. - col_tot[c] / W))); break; default: - assert (0); - abort (); + NOT_REACHED (); } format_cell_entry (table, c, i, v, suffix, mark_missing); @@ -1821,11 +1824,11 @@ display_crosstabulation (void) for (r = 0; r < n_rows; r++) { char suffix = 0; - int mark_missing = 0; + bool mark_missing = false; if (cmd.miss == CRS_REPORT && mv_is_num_user_missing (&x->vars[ROW_VAR]->miss, rows[r].f)) - mark_missing = 1; + mark_missing = true; for (i = 0; i < num_cells; i++) { @@ -1855,8 +1858,7 @@ display_crosstabulation (void) v = 0.; break; default: - assert (0); - abort (); + NOT_REACHED (); } format_cell_entry (table, n_cols, 0, v, suffix, mark_missing); @@ -1875,13 +1877,13 @@ display_crosstabulation (void) for (c = 0; c <= n_cols; c++) { double ct = c < n_cols ? col_tot[c] : W; - int mark_missing = 0; + bool mark_missing = false; char suffix = 0; int i; if (cmd.miss == CRS_REPORT && c < n_cols && mv_is_num_user_missing (&x->vars[COL_VAR]->miss, cols[c].f)) - mark_missing = 1; + mark_missing = true; for (i = 0; i < num_cells; i++) { @@ -1911,8 +1913,7 @@ display_crosstabulation (void) case CRS_CL_ASRESIDUAL: continue; default: - assert (0); - abort (); + NOT_REACHED (); } format_cell_entry (table, c, i, v, suffix, mark_missing);