output: Always use helper functions to access struct tab_table members.
[pspp-builds.git] / src / language / stats / crosstabs.q
index 70bbe5cc95b31857214fa50f21e3070466b9a80f..ff249136547b7fc309ec278b97035e7cf34deff5 100644 (file)
@@ -200,6 +200,12 @@ 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)
 {
@@ -228,8 +234,8 @@ free_proc (struct crosstabs_proc *proc)
 
          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,
@@ -912,8 +918,8 @@ 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_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,
@@ -1344,6 +1350,7 @@ static void
 submit (struct crosstabs_proc *proc, struct pivot_table *pt,
         struct tab_table *t)
 {
+  struct crosstabs_dim_aux *aux;
   int i;
 
   if (t == NULL)
@@ -1366,33 +1373,39 @@ submit (struct crosstabs_proc *proc, struct pivot_table *pt,
   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;
@@ -1400,15 +1413,22 @@ crosstabs_dim (struct tab_table *t, struct outp_driver *d, void *proc_)
       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 < tab_nr (t); i++)
+    r->h[i] = tab_natural_height (r, i);
+}
 
-  for (i = 0; i < t->nr; i++)
-    t->h[i] = tab_natural_height (t, d, i);
+static void
+crosstabs_dim_free (void *aux_)
+{
+  struct crosstabs_dim_aux *aux = aux_;
+  free (aux);
 }
 
 static bool