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
{
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)
{
The rest of the data was allocated and destroyed at a
lower level already. */
- free (pt);
}
+ free (proc->pivots);
}
static int internal_cmd_crosstabs (struct lexer *lexer, struct dataset *ds,
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_table *, struct outp_driver *,
- void *proc);
+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,
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
submit (struct crosstabs_proc *proc, struct pivot_table *pt,
struct tab_table *t)
{
+ struct crosstabs_dim_aux *aux;
int i;
if (t == NULL)
tab_box (t, -1, -1, -1, TAL_GAP, 0, tab_t (t), tab_l (t) - 1,
tab_nr (t) - 1);
tab_vline (t, TAL_2, tab_l (t), 0, tab_nr (t) - 1);
- tab_dim (t, crosstabs_dim, proc);
+
+ 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_table *t, struct outp_driver *d, void *proc_)
+crosstabs_dim (struct tab_rendering *r, void *aux_)
{
- struct crosstabs_proc *proc = proc_;
+ 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 (proc->exclude == MV_NEVER)
+ if (aux->exclude == MV_NEVER)
c += outp_string_width (d, "M", OUTP_PROPORTIONAL);
/* Set width for header columns. */
- if (t->l != 0)
+ if (tab_l (t) != 0)
{
size_t i;
int w;
- w = d->width - c * (t->nc - t->l);
- for (i = 0; i <= t->nc; i++)
- w -= t->wrv[i];
- w /= t->l;
+ 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 < t->l; i++)
- t->w[i] = w;
+ for (i = 0; i < tab_l (t); i++)
+ r->w[i] = w;
}
- for (i = t->l; i < t->nc; i++)
- t->w[i] = c;
+ for (i = tab_l (t); i < tab_nc (t); i++)
+ r->w[i] = c;
- for (i = 0; i < t->nr; i++)
- t->h[i] = tab_natural_height (t, d, i);
+ 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