X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fcrosstabs.q;h=bb4acafa62c6cd279bb7622dc4ff18206bd415e3;hb=dfd1972f7bcb550a4fc3b05dbe7e71d12334b0a7;hp=7db55a2c24b2278072acad0fb26d00482a3db24b;hpb=32b22a683b99b2675a208b43937fed8463583c1a;p=pspp diff --git a/src/language/stats/crosstabs.q b/src/language/stats/crosstabs.q index 7db55a2c24..bb4acafa62 100644 --- a/src/language/stats/crosstabs.q +++ b/src/language/stats/crosstabs.q @@ -56,8 +56,7 @@ #include #include #include -#include -#include +#include #include "minmax.h" #include "xalloc.h" @@ -177,6 +176,7 @@ get_var_range (const struct variable *v) struct crosstabs_proc { + const struct dictionary *dict; enum { INTEGER, GENERAL } mode; enum mv_class exclude; bool pivot; @@ -200,16 +200,11 @@ struct crosstabs_proc unsigned int statistics; /* Bit k is 1 if statistic k is requested. */ }; -/* Auxiliary data structure for tab_dim. */ -struct crosstabs_dim_aux - { - enum mv_class exclude; - }; - static void init_proc (struct crosstabs_proc *proc, struct dataset *ds) { const struct variable *wv = dict_get_weight (dataset_dict (ds)); + proc->dict = dataset_dict (ds); proc->bad_warn = true; proc->variables = NULL; proc->n_variables = 0; @@ -247,8 +242,7 @@ static void tabulate_general_case (struct pivot_table *, const struct ccase *, static void tabulate_integer_case (struct pivot_table *, const struct ccase *, double weight); static void postcalc (struct crosstabs_proc *); -static void submit (struct crosstabs_proc *, struct pivot_table *, - struct tab_table *); +static void submit (struct pivot_table *, struct tab_table *); /* Parse and execute CROSSTABS, then clean up. */ int @@ -895,7 +889,7 @@ make_summary_table (struct crosstabs_proc *proc) } ds_destroy (&name); - submit (proc, NULL, summary); + submit (NULL, summary); } /* Output. */ @@ -918,8 +912,6 @@ static void display_symmetric (struct crosstabs_proc *, struct pivot_table *, static void display_risk (struct pivot_table *, struct tab_table *); static void display_directional (struct crosstabs_proc *, struct pivot_table *, struct tab_table *); -static void crosstabs_dim (struct tab_rendering *, void *aux); -static void crosstabs_dim_free (void *aux); static void table_value_missing (struct crosstabs_proc *proc, struct tab_table *table, int c, int r, unsigned char opt, const union value *v, @@ -1027,18 +1019,18 @@ output_pivot_table (struct crosstabs_proc *proc, struct pivot_table *pt) free (x.col_tot); } - submit (proc, NULL, table); + submit (NULL, table); if (chisq) { if (!showed_fisher) tab_resize (chisq, 4 + (pt->n_vars - 2), -1); - submit (proc, pt, chisq); + submit (pt, chisq); } - submit (proc, pt, sym); - submit (proc, pt, risk); - submit (proc, pt, direct); + submit (pt, sym); + submit (pt, risk); + submit (pt, direct); free (pt->cols); } @@ -1189,14 +1181,16 @@ create_crosstab_table (struct crosstabs_proc *proc, struct pivot_table *pt) { const struct variable *var = pt->const_vars[i]; size_t ofs; + char *s = NULL; ds_put_format (&title, ", %s=", var_get_name (var)); /* Insert the formatted value of the variable, then trim leading spaces in what was just inserted. */ ofs = ds_length (&title); - data_out (&pt->const_values[i], var_get_print_format (var), - ds_put_uninit (&title, var_get_width (var))); + s = data_out (&pt->const_values[i], dict_get_encoding (proc->dict), 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 (" "))); } @@ -1237,9 +1231,9 @@ create_chisq_table (struct pivot_table *pt) tab_text (chisq, 3, 0, TAB_RIGHT | TAT_TITLE, _("Asymp. Sig. (2-sided)")); tab_text (chisq, 4, 0, TAB_RIGHT | TAT_TITLE, - _("Exact. Sig. (2-sided)")); + _("Exact Sig. (2-sided)")); tab_text (chisq, 5, 0, TAB_RIGHT | TAT_TITLE, - _("Exact. Sig. (1-sided)")); + _("Exact Sig. (1-sided)")); tab_offset (chisq, 0, 1); return chisq; @@ -1344,10 +1338,8 @@ delete_missing (struct pivot_table *pt) /* Prepare table T for submission, and submit it. */ static void -submit (struct crosstabs_proc *proc, struct pivot_table *pt, - struct tab_table *t) +submit (struct pivot_table *pt, struct tab_table *t) { - struct crosstabs_dim_aux *aux; int i; if (t == NULL) @@ -1356,7 +1348,7 @@ submit (struct crosstabs_proc *proc, struct pivot_table *pt, tab_resize (t, -1, 0); if (tab_nr (t) == tab_t (t)) { - tab_destroy (t); + table_unref (&t->table); return; } tab_offset (t, 0, 0); @@ -1371,63 +1363,9 @@ submit (struct crosstabs_proc *proc, struct pivot_table *pt, tab_nr (t) - 1); tab_vline (t, TAL_2, tab_l (t), 0, tab_nr (t) - 1); - aux = xmalloc (sizeof *aux); - aux->exclude = proc->exclude; - tab_dim (t, crosstabs_dim, crosstabs_dim_free, aux); - tab_submit (t); } -/* Sets the widths of all the columns and heights of all the rows in - table T for driver D. */ -static void -crosstabs_dim (struct tab_rendering *r, void *aux_) -{ - const struct tab_table *t = r->table; - struct outp_driver *d = r->driver; - struct crosstabs_dim_aux *aux = aux_; - int i; - - /* Width of a numerical column. */ - int c = outp_string_width (d, "0.000000", OUTP_PROPORTIONAL); - if (aux->exclude == MV_NEVER) - c += outp_string_width (d, "M", OUTP_PROPORTIONAL); - - /* Set width for header columns. */ - if (tab_l (t) != 0) - { - size_t i; - int w; - - w = d->width - c * (tab_nc (t) - tab_l (t)); - for (i = 0; i <= tab_nc (t); i++) - w -= r->wrv[i]; - w /= tab_l (t); - - if (w < d->prop_em_width * 8) - w = d->prop_em_width * 8; - - if (w > d->prop_em_width * 15) - w = d->prop_em_width * 15; - - for (i = 0; i < tab_l (t); i++) - r->w[i] = w; - } - - for (i = tab_l (t); i < tab_nc (t); i++) - r->w[i] = c; - - for (i = 0; i < tab_nr (t); i++) - r->h[i] = tab_natural_height (r, i); -} - -static void -crosstabs_dim_free (void *aux_) -{ - struct crosstabs_dim_aux *aux = aux_; - free (aux); -} - static bool find_crosstab (struct pivot_table *pt, size_t *row0p, size_t *row1p) { @@ -1534,13 +1472,12 @@ table_value_missing (struct crosstabs_proc *proc, const struct fmt_spec *print = var_get_print_format (var); if (proc->exclude == MV_NEVER && var_is_value_missing (var, v, MV_USER)) { - char *s = xmalloc (print->w + 2); - strcpy (&s[print->w], "M"); - tab_text (table, c, r, opt, s + strspn (s, " ")); + char *s = data_out (v, dict_get_encoding (proc->dict), print); + tab_text_format (table, c, r, opt, "%sM", s + strspn (s, " ")); free (s); } else - tab_value (table, c, r, opt, v, print); + tab_value (table, c, r, opt, v, proc->dict, print); } } @@ -1566,22 +1503,26 @@ display_dimensions (struct crosstabs_proc *proc, struct pivot_table *pt, additionally suffixed with a letter `M'. */ static void format_cell_entry (struct tab_table *table, int c, int r, double value, - char suffix, bool mark_missing) + char suffix, bool mark_missing, const struct dictionary *dict) { const struct fmt_spec f = {FMT_F, 10, 1}; union value v; - int len = 10; - char s[16]; + char suffixes[3]; + int suffix_len; + char *s; v.f = value; - data_out (&v, &f, s); + s = data_out (&v, dict_get_encoding (dict), &f); + + suffix_len = 0; if (suffix != 0) - s[len++] = suffix; + suffixes[suffix_len++] = suffix; if (mark_missing) - s[len++] = 'M'; - s[len] = '\0'; + suffixes[suffix_len++] = 'M'; + suffixes[suffix_len] = '\0'; - tab_text (table, c, r, TAB_RIGHT, s + strspn (s, " ")); + tab_text_format (table, c, r, TAB_RIGHT, "%s%s", + s + strspn (s, " "), suffixes); } /* Displays the crosstabulation table. */ @@ -1656,7 +1597,7 @@ display_crosstabulation (struct crosstabs_proc *proc, struct pivot_table *pt, default: NOT_REACHED (); } - format_cell_entry (table, c, i, v, suffix, mark_missing); + format_cell_entry (table, c, i, v, suffix, mark_missing, proc->dict); } mp++; @@ -1707,7 +1648,7 @@ display_crosstabulation (struct crosstabs_proc *proc, struct pivot_table *pt, NOT_REACHED (); } - format_cell_entry (table, pt->n_cols, 0, v, suffix, mark_missing); + format_cell_entry (table, pt->n_cols, 0, v, suffix, mark_missing, proc->dict); tab_next_row (table); } } @@ -1757,7 +1698,7 @@ display_crosstabulation (struct crosstabs_proc *proc, struct pivot_table *pt, NOT_REACHED (); } - format_cell_entry (table, c, i, v, suffix, mark_missing); + format_cell_entry (table, c, i, v, suffix, mark_missing, proc->dict); } last_row = i; }