X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fcrosstabs.q;h=a83a86472f33c74189ed81421f66953197af1711;hb=f15c854d8500105766b2f5666bb62b983ff24f88;hp=e296da2d61da1e7307238f76772d8071eb6af2fb;hpb=84b708489d9ca5d68ec516c2b30473ab75807fb4;p=pspp-builds.git diff --git a/src/language/stats/crosstabs.q b/src/language/stats/crosstabs.q index e296da2d..a83a8647 100644 --- a/src/language/stats/crosstabs.q +++ b/src/language/stats/crosstabs.q @@ -161,41 +161,6 @@ struct pivot_table double total; /* Grand total. */ }; -/* A crosstabulation of exactly 2 variables, conditional on zero - or more other variables having given values. */ -struct crosstab - { - /* Case counts. */ - double missing; - - /* Variables. */ - int n_vars; /* Number of variables (at least 2). */ - const struct variable **vars; - union value *values; /* Values of variables beyond 2. */ - - /* Data. */ - struct table_entry **entries; - size_t n_entries; - - /* Column values, number of columns. */ - union value *cols; - int n_cols; - - /* Row values, number of rows. */ - union value *rows; - int n_rows; - - /* Number of statistically interesting columns/rows - (columns/rows with data in them). */ - int ns_cols, ns_rows; - - /* Matrix contents. */ - double *mat; /* Matrix proper. */ - double *row_tot; /* Row totals. */ - double *col_tot; /* Column totals. */ - double total; /* Grand total. */ - }; - /* Integer mode variable info. */ struct var_range { @@ -1028,22 +993,22 @@ output_pivot_table (struct crosstabs_proc *proc, struct pivot_table *pt) if (chisq) { display_dimensions (proc, &x, chisq, first_difference); - display_chisq (pt, chisq, &showed_fisher); + display_chisq (&x, chisq, &showed_fisher); } if (sym) { display_dimensions (proc, &x, sym, first_difference); - display_symmetric (proc, pt, sym); + display_symmetric (proc, &x, sym); } if (risk) { display_dimensions (proc, &x, risk, first_difference); - display_risk (pt, risk); + display_risk (&x, risk); } if (direct) { display_dimensions (proc, &x, direct, first_difference); - display_directional (proc, pt, direct); + display_directional (proc, &x, direct); } /* Free the parts of x that are not owned by pt. In @@ -1218,10 +1183,19 @@ create_crosstab_table (struct crosstabs_proc *proc, struct pivot_table *pt) for (i = 0; i < pt->n_consts; i++) { const struct variable *var = pt->const_vars[i]; + size_t ofs; + char *s = NULL; + ds_put_format (&title, ", %s=", var_get_name (var)); - data_out (&pt->const_values[i], var_get_print_format (var), - ds_put_uninit (&title, var_get_width (var))); - /* XXX remove any leading space in what was just inserted. */ + + /* Insert the formatted value of the variable, then trim + leading spaces in what was just inserted. */ + ofs = ds_length (&title); + s = data_out (&pt->const_values[i], var_get_print_format (var)); + ds_put_cstr (&title, s); + free (s); + ds_remove (&title, ofs, ss_cspan (ds_substr (&title, ofs, SIZE_MAX), + ss_cstr (" "))); } ds_put_cstr (&title, " ["); @@ -1264,7 +1238,6 @@ create_chisq_table (struct pivot_table *pt) _("Exact. Sig. (2-sided)")); tab_text (chisq, 5, 0, TAB_RIGHT | TAT_TITLE, _("Exact. Sig. (1-sided)")); - chisq = 0; tab_offset (chisq, 0, 1); return chisq; @@ -1539,6 +1512,7 @@ table_value_missing (struct crosstabs_proc *proc, const union value *v, const struct variable *var) { struct substring s; + char *ss; const struct fmt_spec *print = var_get_print_format (var); const char *label = var_lookup_value_label (var, v); @@ -1549,7 +1523,9 @@ table_value_missing (struct crosstabs_proc *proc, } s.string = tab_alloc (table, print->w); - data_out (v, print, s.string); + ss = data_out (v, print); + strcpy (s.string, ss); + free (ss); s.length = print->w; if (proc->exclude == MV_NEVER && var_is_num_missing (var, v->f, MV_USER)) s.string[s.length++] = 'M'; @@ -1588,11 +1564,14 @@ format_cell_entry (struct tab_table *table, int c, int r, double value, const struct fmt_spec f = {FMT_F, 10, 1}; union value v; struct substring s; + char *ss; s.length = 10; s.string = tab_alloc (table, 16); v.f = value; - data_out (&v, &f, s.string); + ss = data_out (&v, &f); + strcpy (s.string, ss); + free (ss); while (*s.string == ' ') { s.length--; @@ -1809,7 +1788,6 @@ display_chisq (struct pivot_table *pt, struct tab_table *chisq, double chisq_v[N_CHISQ]; double fisher1, fisher2; int df[N_CHISQ]; - int s = 0; int i; @@ -1822,7 +1800,6 @@ display_chisq (struct pivot_table *pt, struct tab_table *chisq, if ((i != 2 && chisq_v[i] == SYSMIS) || (i == 2 && fisher1 == SYSMIS)) continue; - s = 1; tab_text (chisq, 0, 0, TAB_LEFT, gettext (chisq_stats[i])); if (i != 2)