Separate table functions that format their arguments from those that don't.
[pspp-builds.git] / src / language / stats / examine.q
index 312547f3f67132380f33d9a204d7049cfb1a670f..e8333b1ceeaa5257d922b9be4700bc6aec8ef7d1 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2004, 2008 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2008, 2009 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -122,6 +122,9 @@ struct factor_metrics
   /* Sum of all weights, including those for missing values */
   double n;
 
+  /* Sum of weights of non_missing values */
+  double n_valid;
+
   double mean;
 
   double variance;
@@ -140,7 +143,7 @@ struct factor_result
 {
   struct ll ll;
 
-  union value *value[2];
+  union value value[2];
 
   /* An array of factor metrics, one for each variable */
   struct factor_metrics *metrics;
@@ -168,6 +171,7 @@ factor_destroy (struct xfactor *fctr)
       int v;
       struct factor_result *result =
        ll_data (ll, struct factor_result, ll);
+      int i;
 
       for (v = 0; v < n_dependent_vars; ++v)
        {
@@ -186,8 +190,10 @@ factor_destroy (struct xfactor *fctr)
          casereader_destroy (result->metrics[v].up_reader);
        }
 
-      free (result->value[0]);
-      free (result->value[1]);
+      for (i = 0; i < 2; i++)
+        if (fctr->indep_var[i])
+          value_destroy (&result->value[i],
+                         var_get_width (fctr->indep_var[i]));
       free (result->metrics);
       ll = ll_next (ll);
       free (result);
@@ -195,7 +201,7 @@ factor_destroy (struct xfactor *fctr)
 }
 
 static struct xfactor level0_factor;
-static struct ll_list factor_list = LL_INITIALIZER (factor_list);
+static struct ll_list factor_list;
 
 /* Parse the clause specifying the factors */
 static int examine_parse_independent_vars (struct lexer *lexer,
@@ -204,6 +210,7 @@ static int examine_parse_independent_vars (struct lexer *lexer,
 
 /* Output functions */
 static void show_summary (const struct variable **dependent_var, int n_dep_var,
+                         const struct dictionary *dict,
                          const struct xfactor *f);
 
 
@@ -228,7 +235,7 @@ static void show_extremes (const struct variable **dependent_var,
 static void run_examine (struct cmd_examine *, struct casereader *,
                          struct dataset *);
 
-static void output_examine (void);
+static void output_examine (const struct dictionary *dict);
 
 
 void factor_calc (const struct ccase *c, int case_no,
@@ -265,6 +272,8 @@ cmd_examine (struct lexer *lexer, struct dataset *ds)
   subc_list_double_create (&percentile_list);
   percentile_algorithm = PC_HAVERAGE;
 
+  ll_init (&factor_list);
+
   if ( !parse_examine (lexer, ds, &cmd, NULL) )
     {
       subc_list_double_destroy (&percentile_list);
@@ -369,14 +378,14 @@ np_plot (struct np *np, const char *label)
   chart_write_yscale (dnp_chart, np->dns_min, np->dns_max, 5);
 
   {
-    struct ccase c;
     struct casereader *reader = casewriter_make_reader (np->writer);
-    while (casereader_read (reader, &c))
+    struct ccase *c;
+    while ((c = casereader_read (reader)) != NULL)
       {
-       chart_datum (np_chart, 0, case_data_idx (&c, NP_IDX_Y)->f, case_data_idx (&c, NP_IDX_NS)->f);
-       chart_datum (dnp_chart, 0, case_data_idx (&c, NP_IDX_Y)->f, case_data_idx (&c, NP_IDX_DNS)->f);
+       chart_datum (np_chart, 0, case_data_idx (c, NP_IDX_Y)->f, case_data_idx (c, NP_IDX_NS)->f);
+       chart_datum (dnp_chart, 0, case_data_idx (c, NP_IDX_Y)->f, case_data_idx (c, NP_IDX_DNS)->f);
 
-       case_destroy (&c);
+       case_unref (c);
       }
     casereader_destroy (reader);
   }
@@ -594,7 +603,7 @@ show_boxplot_variables (const struct variable **dependent_var,
 
 #if 0
       ds_put_format (&title, "%s = ", var_get_name (fctr->indep_var[0]));
-      var_append_value_name (fctr->indep_var[0], result->value[0], &title);
+      var_append_value_name (fctr->indep_var[0], &result->value[0], &title);
 #endif
 
       chart_write_title (ch, ds_cstr (&title));
@@ -623,11 +632,11 @@ show_boxplot_variables (const struct variable **dependent_var,
 
 /* Show all the appropriate tables */
 static void
-output_examine (void)
+output_examine (const struct dictionary *dict)
 {
   struct ll *ll;
 
-  show_summary (dependent_vars, n_dependent_vars, &level0_factor);
+  show_summary (dependent_vars, n_dependent_vars, dict, &level0_factor);
 
   if ( cmd.a_statistics[XMN_ST_EXTREME] )
     show_extremes (dependent_vars, n_dependent_vars, &level0_factor);
@@ -654,7 +663,7 @@ output_examine (void)
        ll != ll_null (&factor_list); ll = ll_next (ll))
     {
       struct xfactor *factor = ll_data (ll, struct xfactor, ll);
-      show_summary (dependent_vars, n_dependent_vars, factor);
+      show_summary (dependent_vars, n_dependent_vars, dict, factor);
 
       if ( cmd.a_statistics[XMN_ST_EXTREME] )
        show_extremes (dependent_vars, n_dependent_vars, factor);
@@ -866,11 +875,16 @@ static void
 examine_group (struct cmd_examine *cmd, struct casereader *reader, int level,
               const struct dictionary *dict, struct xfactor *factor)
 {
-  struct ccase c;
+  struct ccase *c;
   const struct variable *wv = dict_get_weight (dict);
   int v;
   int n_extrema = 1;
   struct factor_result *result = xzalloc (sizeof (*result));
+  int i;
+
+  for (i = 0; i < 2; i++)
+    if (factor->indep_var[i])
+      value_init (&result->value[i], var_get_width (factor->indep_var[i]));
 
   result->metrics = xcalloc (n_dependent_vars, sizeof (*result->metrics));
 
@@ -878,20 +892,15 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level,
     n_extrema = cmd->st_n;
 
 
-  if (casereader_peek (reader, 0, &c))
+  c = casereader_peek (reader, 0);
+  if (c != NULL)
     {
       if ( level > 0)
-       {
-         result->value[0] =
-           value_dup (case_data (&c, factor->indep_var[0]),
-                      var_get_width (factor->indep_var[0]));
-
-         if ( level > 1)
-           result->value[1] =
-             value_dup (case_data (&c, factor->indep_var[1]),
-                        var_get_width (factor->indep_var[1]));
-       }
-      case_destroy (&c);
+        for (i = 0; i < 2; i++)
+          if (factor->indep_var[i])
+            value_copy (&result->value[i], case_data (c, factor->indep_var[i]),
+                        var_get_width (factor->indep_var[i]));
+      case_unref (c);
     }
 
   for (v = 0; v < n_dependent_vars; ++v)
@@ -914,7 +923,7 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level,
          struct subcase up_ordering;
           subcase_init_var (&up_ordering, dependent_vars[v], SC_ASCEND);
          writer = sort_create_writer (&up_ordering,
-                                      casereader_get_value_cnt (reader));
+                                      casereader_get_proto (reader));
           subcase_destroy (&up_ordering);
        }
       else
@@ -922,38 +931,42 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level,
          /* but in this case, sorting is unnecessary, so an ordinary
             casewriter is sufficient */
          writer =
-           autopaging_writer_create (casereader_get_value_cnt (reader));
+           autopaging_writer_create (casereader_get_proto (reader));
        }
 
 
       /* Sort or just iterate, whilst calculating moments etc */
-      while (casereader_read (input, &c))
+      while ((c = casereader_read (input)) != NULL)
        {
-         const casenumber loc =
-             case_data_idx (&c, casereader_get_value_cnt (reader) - 1)->f;
+          int n_vals = caseproto_get_n_widths (casereader_get_proto (reader));
+         const casenumber loc = case_data_idx (c, n_vals - 1)->f;
 
-         const double weight = wv ? case_data (&c, wv)->f : 1.0;
+         const double weight = wv ? case_data (c, wv)->f : 1.0;
+         const union value *value = case_data (c, dependent_vars[v]);
 
          if (weight != SYSMIS)
            minimize (&result->metrics[v].cmin, weight);
 
          moments1_add (result->metrics[v].moments,
-                       case_data (&c, dependent_vars[v])->f,
+                       value->f,
                        weight);
 
          result->metrics[v].n += weight;
 
+         if ( ! var_is_value_missing (dependent_vars[v], value, MV_ANY) )
+           result->metrics[v].n_valid += weight;
+
          extrema_add (result->metrics[v].maxima,
-                      case_data (&c, dependent_vars[v])->f,
+                      value->f,
                       weight,
                       loc);
 
          extrema_add (result->metrics[v].minima,
-                      case_data (&c, dependent_vars[v])->f,
+                      value->f,
                       weight,
                       loc);
 
-         casewriter_write (writer, &c);
+         casewriter_write (writer, c);
        }
       casereader_destroy (input);
       result->metrics[v].up_reader = casewriter_make_reader (writer);
@@ -984,7 +997,7 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level,
          for (i = 0 ; i < metric->n_ptiles; ++i)
            {
              metric->ptl[i] = (struct percentile *)
-               percentile_create (percentile_list.data[i] / 100.0, metric->n);
+               percentile_create (percentile_list.data[i] / 100.0, metric->n_valid);
 
              if ( percentile_list.data[i] == 25)
                metric->quartiles[0] = metric->ptl[i];
@@ -994,8 +1007,8 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level,
                metric->quartiles[2] = metric->ptl[i];
            }
 
-         metric->tukey_hinges = tukey_hinges_create (metric->n, metric->cmin);
-         metric->trimmed_mean = trimmed_mean_create (metric->n, 0.05);
+         metric->tukey_hinges = tukey_hinges_create (metric->n_valid, metric->cmin);
+         metric->trimmed_mean = trimmed_mean_create (metric->n_valid, 0.05);
 
          n_os = metric->n_ptiles + 2;
 
@@ -1028,7 +1041,7 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level,
   /* FIXME: Do this in the above loop */
   if ( cmd->a_plot[XMN_PLT_HISTOGRAM] )
     {
-      struct ccase c;
+      struct ccase *c;
       struct casereader *input = casereader_clone (reader);
 
       for (v = 0; v < n_dependent_vars; ++v)
@@ -1059,18 +1072,18 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level,
          metric->histogram = histogram_create (10, min->value, max->value);
        }
 
-      while (casereader_read (input, &c))
+      while ((c = casereader_read (input)) != NULL)
        {
-         const double weight = wv ? case_data (&c, wv)->f : 1.0;
+         const double weight = wv ? case_data (c, wv)->f : 1.0;
 
          for (v = 0; v < n_dependent_vars; ++v)
            {
              struct factor_metrics *metric = &result->metrics[v];
              if ( metric->histogram)
                histogram_add ((struct histogram *) metric->histogram,
-                              case_data (&c, dependent_vars[v])->f, weight);
+                              case_data (c, dependent_vars[v])->f, weight);
            }
-         case_destroy (&c);
+         case_unref (c);
        }
       casereader_destroy (input);
     }
@@ -1081,12 +1094,12 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level,
       for (v = 0; v < n_dependent_vars; ++v)
        {
          struct factor_metrics *metric = &result->metrics[v];
+          int n_vals = caseproto_get_n_widths (casereader_get_proto (
+                                                 metric->up_reader));
 
          metric->box_whisker =
            box_whisker_create ((struct tukey_hinges *) metric->tukey_hinges,
-                               cmd->v_id,
-                               casereader_get_value_cnt (metric->up_reader)
-                               - 1);
+                               cmd->v_id, n_vals - 1);
 
          order_stats_accumulate ((struct order_stats **) &metric->box_whisker,
                                  1,
@@ -1106,17 +1119,18 @@ run_examine (struct cmd_examine *cmd, struct casereader *input,
 {
   struct ll *ll;
   const struct dictionary *dict = dataset_dict (ds);
-  struct ccase c;
+  struct ccase *c;
   struct casereader *level0 = casereader_clone (input);
 
-  if (!casereader_peek (input, 0, &c))
+  c = casereader_peek (input, 0);
+  if (c == NULL)
     {
       casereader_destroy (input);
       return;
     }
 
-  output_split_file_values (ds, &c);
-  case_destroy (&c);
+  output_split_file_values (ds, c);
+  case_unref (c);
 
   ll_init (&level0_factor.result_list);
 
@@ -1169,7 +1183,7 @@ run_examine (struct cmd_examine *cmd, struct casereader *input,
 
   casereader_destroy (input);
 
-  output_examine ();
+  output_examine (dict);
 
   factor_destroy (&level0_factor);
 
@@ -1189,8 +1203,12 @@ run_examine (struct cmd_examine *cmd, struct casereader *input,
 
 static void
 show_summary (const struct variable **dependent_var, int n_dep_var,
+             const struct dictionary *dict,
              const struct xfactor *fctr)
 {
+  const struct variable *wv = dict_get_weight (dict);
+  const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : & F_8_0;
+
   static const char *subtitle[]=
     {
       N_("Valid"),
@@ -1227,7 +1245,7 @@ show_summary (const struct variable **dependent_var, int n_dep_var,
   tbl = tab_create (n_cols, n_rows, 0);
   tab_headers (tbl, heading_columns, 0, heading_rows, 0);
 
-  tab_dim (tbl, tab_natural_dimensions);
+  tab_dim (tbl, tab_natural_dimensions, NULL);
 
   /* Outline the box */
   tab_box (tbl,
@@ -1302,7 +1320,7 @@ show_summary (const struct variable **dependent_var, int n_dep_var,
     {
       int j = 0;
       struct ll *ll;
-      union value *last_value = NULL;
+      const union value *last_value = NULL;
 
       if ( v > 0 )
        tab_hline (tbl, TAL_1, 0, n_cols -1 ,
@@ -1328,15 +1346,15 @@ show_summary (const struct variable **dependent_var, int n_dep_var,
            {
 
              if ( last_value == NULL ||
-                  compare_values_short (last_value, result->value[0],
-                                         fctr->indep_var[0]))
+                  !value_equal (last_value, &result->value[0],
+                                 var_get_width (fctr->indep_var[0])))
                {
                  struct string str;
 
-                 last_value = result->value[0];
+                 last_value = &result->value[0];
                  ds_init_empty (&str);
 
-                 var_append_value_name (fctr->indep_var[0], result->value[0],
+                 var_append_value_name (fctr->indep_var[0], &result->value[0],
                                         &str);
 
                  tab_text (tbl, 1,
@@ -1360,7 +1378,7 @@ show_summary (const struct variable **dependent_var, int n_dep_var,
                  ds_init_empty (&str);
 
                  var_append_value_name (fctr->indep_var[1],
-                                        result->value[1], &str);
+                                        &result->value[1], &str);
 
                  tab_text (tbl, 2,
                            heading_rows + j +
@@ -1382,43 +1400,43 @@ show_summary (const struct variable **dependent_var, int n_dep_var,
          result->metrics[v].se_mean = sqrt (result->metrics[v].variance / n) ;
 
          /* Total Valid */
-         tab_float (tbl, heading_columns,
+         tab_double (tbl, heading_columns,
                     heading_rows + j + v * ll_count (&fctr->result_list),
                     TAB_LEFT,
-                    n, 8, 0);
+                    n, wfmt);
 
-         tab_text (tbl, heading_columns + 1,
-                   heading_rows + j + v * ll_count (&fctr->result_list),
-                   TAB_RIGHT | TAT_PRINTF,
-                   "%g%%", n * 100.0 / result->metrics[v].n);
+         tab_text_format (tbl, heading_columns + 1,
+                           heading_rows + j + v * ll_count (&fctr->result_list),
+                           TAB_RIGHT,
+                           "%g%%", n * 100.0 / result->metrics[v].n);
 
          /* Total Missing */
-         tab_float (tbl, heading_columns + 2,
+         tab_double (tbl, heading_columns + 2,
                     heading_rows + j + v * ll_count (&fctr->result_list),
                     TAB_LEFT,
                     result->metrics[v].n - n,
-                    8, 0);
+                    wfmt);
 
-         tab_text (tbl, heading_columns + 3,
-                   heading_rows + j + v * ll_count (&fctr->result_list),
-                   TAB_RIGHT | TAT_PRINTF,
-                   "%g%%",
-                   (result->metrics[v].n - n) * 100.0 / result->metrics[v].n
-                   );
+         tab_text_format (tbl, heading_columns + 3,
+                           heading_rows + j + v * ll_count (&fctr->result_list),
+                           TAB_RIGHT,
+                           "%g%%",
+                           (result->metrics[v].n - n) * 100.0 / result->metrics[v].n
+                           );
 
          /* Total Valid + Missing */
-         tab_float (tbl, heading_columns + 4,
+         tab_double (tbl, heading_columns + 4,
                     heading_rows + j + v * ll_count (&fctr->result_list),
                     TAB_LEFT,
                     result->metrics[v].n,
-                    8, 0);
+                    wfmt);
 
-         tab_text (tbl, heading_columns + 5,
-                   heading_rows + j + v * ll_count (&fctr->result_list),
-                   TAB_RIGHT | TAT_PRINTF,
-                   "%g%%",
-                   (result->metrics[v].n) * 100.0 / result->metrics[v].n
-                   );
+         tab_text_format (tbl, heading_columns + 5,
+                           heading_rows + j + v * ll_count (&fctr->result_list),
+                           TAB_RIGHT,
+                           "%g%%",
+                           ((result->metrics[v].n) * 100.0
+                            / result->metrics[v].n));
 
          ++j;
        }
@@ -1464,7 +1482,7 @@ show_descriptives (const struct variable **dependent_var,
   tbl = tab_create (n_cols, n_rows, 0);
   tab_headers (tbl, heading_columns, 0, heading_rows, 0);
 
-  tab_dim (tbl, tab_natural_dimensions);
+  tab_dim (tbl, tab_natural_dimensions, NULL);
 
   /* Outline the box */
   tab_box (tbl,
@@ -1523,7 +1541,7 @@ show_descriptives (const struct variable **dependent_var,
              struct string vstr;
              ds_init_empty (&vstr);
              var_append_value_name (fctr->indep_var[0],
-                                    result->value[0], &vstr);
+                                    &result->value[0], &vstr);
 
              tab_text (tbl, 1,
                        heading_rows + row_var_start + i * DESCRIPTIVE_ROWS,
@@ -1540,11 +1558,11 @@ show_descriptives (const struct variable **dependent_var,
                    TAB_LEFT,
                    _("Mean"));
 
-         tab_text (tbl, n_cols - 4,
-                   heading_rows + row_var_start + 1 + i * DESCRIPTIVE_ROWS,
-                   TAB_LEFT | TAT_PRINTF,
-                   _("%g%% Confidence Interval for Mean"),
-                   cmd.n_cinterval[0]);
+         tab_text_format (tbl, n_cols - 4,
+                           heading_rows + row_var_start + 1 + i * DESCRIPTIVE_ROWS,
+                           TAB_LEFT,
+                           _("%g%% Confidence Interval for Mean"),
+                           cmd.n_cinterval[0]);
 
          tab_text (tbl, n_cols - 3,
                    heading_rows + row_var_start + 1 + i * DESCRIPTIVE_ROWS,
@@ -1557,9 +1575,8 @@ show_descriptives (const struct variable **dependent_var,
                    _("Upper Bound"));
 
          tab_text (tbl, n_cols - 4,
-                   heading_rows + row_var_start + 3 + i * DESCRIPTIVE_ROWS,
-                   TAB_LEFT | TAT_PRINTF,
-                   _("5%% Trimmed Mean"));
+                    heading_rows + row_var_start + 3 + i * DESCRIPTIVE_ROWS,
+                    TAB_LEFT, _("5% Trimmed Mean"));
 
          tab_text (tbl, n_cols - 4,
                    heading_rows + row_var_start + 4 + i * DESCRIPTIVE_ROWS,
@@ -1610,93 +1627,93 @@ show_descriptives (const struct variable **dependent_var,
 
          /* Now the statistics ... */
 
-         tab_float (tbl, n_cols - 2,
+         tab_double (tbl, n_cols - 2,
                    heading_rows + row_var_start + i * DESCRIPTIVE_ROWS,
                     TAB_CENTER,
                     result->metrics[v].mean,
-                    8, 2);
+                    NULL);
 
-         tab_float (tbl, n_cols - 1,
+         tab_double (tbl, n_cols - 1,
                    heading_rows + row_var_start + i * DESCRIPTIVE_ROWS,
                     TAB_CENTER,
                     result->metrics[v].se_mean,
-                    8, 3);
+                    NULL);
 
 
-         tab_float (tbl, n_cols - 2,
+         tab_double (tbl, n_cols - 2,
                     heading_rows + row_var_start + 1 + i * DESCRIPTIVE_ROWS,
                     TAB_CENTER,
                     result->metrics[v].mean - t *
                      result->metrics[v].se_mean,
-                    8, 3);
+                    NULL);
 
-         tab_float (tbl, n_cols - 2,
+         tab_double (tbl, n_cols - 2,
                     heading_rows + row_var_start + 2 + i * DESCRIPTIVE_ROWS,
                     TAB_CENTER,
                     result->metrics[v].mean + t *
                      result->metrics[v].se_mean,
-                    8, 3);
+                    NULL);
 
 
-         tab_float (tbl, n_cols - 2,
+         tab_double (tbl, n_cols - 2,
                     heading_rows + row_var_start + 3 + i * DESCRIPTIVE_ROWS,
                     TAB_CENTER,
                     trimmed_mean_calculate ((struct trimmed_mean *) result->metrics[v].trimmed_mean),
-                    8, 2);
+                    NULL);
 
 
-         tab_float (tbl, n_cols - 2,
+         tab_double (tbl, n_cols - 2,
                     heading_rows + row_var_start + 4 + i * DESCRIPTIVE_ROWS,
                     TAB_CENTER,
                     percentile_calculate (result->metrics[v].quartiles[1], percentile_algorithm),
-                    8, 2);
+                    NULL);
 
 
-         tab_float (tbl, n_cols - 2,
+         tab_double (tbl, n_cols - 2,
                     heading_rows + row_var_start + 5 + i * DESCRIPTIVE_ROWS,
                     TAB_CENTER,
                     result->metrics[v].variance,
-                    8, 3);
+                    NULL);
 
-         tab_float (tbl, n_cols - 2,
+         tab_double (tbl, n_cols - 2,
                     heading_rows + row_var_start + 6 + i * DESCRIPTIVE_ROWS,
                     TAB_CENTER,
                     sqrt (result->metrics[v].variance),
-                    8, 3);
+                    NULL);
 
-         tab_float (tbl, n_cols - 2,
+         tab_double (tbl, n_cols - 2,
                     heading_rows + row_var_start + 10 + i * DESCRIPTIVE_ROWS,
                     TAB_CENTER,
                     percentile_calculate (result->metrics[v].quartiles[2],
                                           percentile_algorithm) -
                     percentile_calculate (result->metrics[v].quartiles[0],
                                           percentile_algorithm),
-                    8, 2);
+                    NULL);
 
 
-         tab_float (tbl, n_cols - 2,
+         tab_double (tbl, n_cols - 2,
                     heading_rows + row_var_start + 11 + i * DESCRIPTIVE_ROWS,
                     TAB_CENTER,
                     result->metrics[v].skewness,
-                    8, 3);
+                    NULL);
 
-         tab_float (tbl, n_cols - 2,
+         tab_double (tbl, n_cols - 2,
                     heading_rows + row_var_start + 12 + i * DESCRIPTIVE_ROWS,
                     TAB_CENTER,
                     result->metrics[v].kurtosis,
-                    8, 3);
+                    NULL);
 
-         tab_float (tbl, n_cols - 1,
+         tab_double (tbl, n_cols - 1,
                     heading_rows + row_var_start + 11 + i * DESCRIPTIVE_ROWS,
                     TAB_CENTER,
                     calc_seskew (result->metrics[v].n),
-                    8, 3);
+                    NULL);
 
-         tab_float (tbl, n_cols - 1,
+         tab_double (tbl, n_cols - 1,
                     heading_rows + row_var_start + 12 + i * DESCRIPTIVE_ROWS,
                     TAB_CENTER,
                     calc_sekurt (result->metrics[v].n),
-                    8, 3);
+                    NULL);
 
          {
            struct extremum *minimum, *maximum ;
@@ -1707,23 +1724,23 @@ show_descriptives (const struct variable **dependent_var,
            maximum = ll_data (max_ll, struct extremum, ll);
            minimum = ll_data (min_ll, struct extremum, ll);
 
-           tab_float (tbl, n_cols - 2,
+           tab_double (tbl, n_cols - 2,
                       heading_rows + row_var_start + 7 + i * DESCRIPTIVE_ROWS,
                       TAB_CENTER,
                       minimum->value,
-                      8, 3);
+                      NULL);
 
-           tab_float (tbl, n_cols - 2,
+           tab_double (tbl, n_cols - 2,
                       heading_rows + row_var_start + 8 + i * DESCRIPTIVE_ROWS,
                       TAB_CENTER,
                       maximum->value,
-                      8, 3);
+                      NULL);
 
-           tab_float (tbl, n_cols - 2,
+           tab_double (tbl, n_cols - 2,
                       heading_rows + row_var_start + 9 + i * DESCRIPTIVE_ROWS,
                       TAB_CENTER,
                       maximum->value - minimum->value,
-                      8, 3);
+                      NULL);
          }
        }
     }
@@ -1777,7 +1794,7 @@ show_extremes (const struct variable **dependent_var,
   tbl = tab_create (n_cols, n_rows, 0);
   tab_headers (tbl, heading_columns, 0, heading_rows, 0);
 
-  tab_dim (tbl, tab_natural_dimensions);
+  tab_dim (tbl, tab_natural_dimensions, NULL);
 
   /* Outline the box */
   tab_box (tbl,
@@ -1830,15 +1847,15 @@ show_extremes (const struct variable **dependent_var,
 
          for ( e = 1; e <= cmd.st_n; ++e )
            {
-             tab_text (tbl, n_cols - 3,
-                       heading_rows + row_var_start + row_result_start + e - 1,
-                       TAB_RIGHT | TAT_PRINTF,
-                       _("%d"), e);
-
-             tab_text (tbl, n_cols - 3,
-                       heading_rows + row_var_start + row_result_start + cmd.st_n + e - 1,
-                       TAB_RIGHT | TAT_PRINTF,
-                       _("%d"), e);
+             tab_text_format (tbl, n_cols - 3,
+                               heading_rows + row_var_start + row_result_start + e - 1,
+                               TAB_RIGHT,
+                               "%d", e);
+
+             tab_text_format (tbl, n_cols - 3,
+                               heading_rows + row_var_start + row_result_start + cmd.st_n + e - 1,
+                               TAB_RIGHT,
+                               "%d", e);
            }
 
 
@@ -1850,18 +1867,19 @@ show_extremes (const struct variable **dependent_var,
 
              while (weight-- > 0 && e < cmd.st_n)
                {
-                 tab_float (tbl, n_cols - 1,
+                 tab_double (tbl, n_cols - 1,
                             heading_rows + row_var_start + row_result_start + cmd.st_n + e,
                             TAB_RIGHT,
                             minimum->value,
-                            8, 2);
+                            NULL);
 
 
-                 tab_float (tbl, n_cols - 2,
-                            heading_rows + row_var_start + row_result_start + cmd.st_n + e,
+                 tab_fixed (tbl, n_cols - 2,
+                            heading_rows + row_var_start +
+                            row_result_start + cmd.st_n + e,
                             TAB_RIGHT,
                             minimum->location,
-                            8, 0);
+                            10, 0);
                  ++e;
                }
 
@@ -1877,18 +1895,20 @@ show_extremes (const struct variable **dependent_var,
 
              while (weight-- > 0 && e < cmd.st_n)
                {
-                 tab_float (tbl, n_cols - 1,
-                            heading_rows + row_var_start + row_result_start + e,
+                 tab_double (tbl, n_cols - 1,
+                            heading_rows + row_var_start +
+                             row_result_start + e,
                             TAB_RIGHT,
                             maximum->value,
-                            8, 2);
+                            NULL);
 
 
-                 tab_float (tbl, n_cols - 2,
-                            heading_rows + row_var_start + row_result_start + e,
+                 tab_fixed (tbl, n_cols - 2,
+                            heading_rows + row_var_start +
+                            row_result_start + e,
                             TAB_RIGHT,
                             maximum->location,
-                            8, 0);
+                            10, 0);
                  ++e;
                }
 
@@ -1901,7 +1921,7 @@ show_extremes (const struct variable **dependent_var,
              struct string vstr;
              ds_init_empty (&vstr);
              var_append_value_name (fctr->indep_var[0],
-                                    result->value[0], &vstr);
+                                    &result->value[0], &vstr);
 
              tab_text (tbl, 1,
                        heading_rows + row_var_start + row_result_start,
@@ -1979,7 +1999,7 @@ show_percentiles (const struct variable **dependent_var,
   tbl = tab_create (n_cols, n_rows, 0);
   tab_headers (tbl, heading_columns, 0, heading_rows, 0);
 
-  tab_dim (tbl, tab_natural_dimensions);
+  tab_dim (tbl, tab_natural_dimensions, NULL);
 
   /* Outline the box */
   tab_box (tbl,
@@ -2033,7 +2053,7 @@ show_percentiles (const struct variable **dependent_var,
              struct string vstr;
              ds_init_empty (&vstr);
              var_append_value_name (fctr->indep_var[0],
-                                    result->value[0], &vstr);
+                                    &result->value[0], &vstr);
 
              tab_text (tbl, 1,
                        heading_rows + row_var_start + i * PERCENTILE_ROWS,
@@ -2065,12 +2085,12 @@ show_percentiles (const struct variable **dependent_var,
          for (j = 0; j < n_percentiles; ++j)
            {
              double hinge = SYSMIS;
-             tab_float (tbl, n_cols - n_percentiles + j,
+             tab_double (tbl, n_cols - n_percentiles + j,
                         heading_rows + row_var_start + i * PERCENTILE_ROWS,
                         TAB_CENTER,
                         percentile_calculate (result->metrics[v].ptl[j],
                                               percentile_algorithm),
-                        8, 2
+                        NULL
                         );
 
              if ( result->metrics[v].ptl[j]->ptile == 0.5)
@@ -2081,11 +2101,11 @@ show_percentiles (const struct variable **dependent_var,
                hinge = hinges[2];
 
              if ( hinge != SYSMIS)
-               tab_float (tbl, n_cols - n_percentiles + j,
+               tab_double (tbl, n_cols - n_percentiles + j,
                           heading_rows + row_var_start + 1 + i * PERCENTILE_ROWS,
                           TAB_CENTER,
                           hinge,
-                          8, 2
+                          NULL
                           );
 
            }
@@ -2099,11 +2119,10 @@ show_percentiles (const struct variable **dependent_var,
 
   for (i = 0 ; i < n_percentiles; ++i )
     {
-      tab_text (tbl, n_cols - n_percentiles + i, 1,
-               TAB_CENTER | TAT_TITLE | TAT_PRINTF,
-               _("%g"),
-               subc_list_double_at (&percentile_list, i)
-               );
+      tab_text_format (tbl, n_cols - n_percentiles + i, 1,
+                       TAB_CENTER | TAT_TITLE,
+                       _("%g"),
+                       subc_list_double_at (&percentile_list, i));
 
 
     }
@@ -2136,13 +2155,13 @@ factor_to_string_concise (const struct xfactor *fctr,
 {
   if (fctr->indep_var[0])
     {
-      var_append_value_name (fctr->indep_var[0], result->value[0], str);
+      var_append_value_name (fctr->indep_var[0], &result->value[0], str);
 
       if ( fctr->indep_var[1] )
        {
          ds_put_cstr (str, ",");
 
-         var_append_value_name (fctr->indep_var[1], result->value[1], str);
+         var_append_value_name (fctr->indep_var[1], &result->value[1], str);
 
          ds_put_cstr (str, ")");
        }
@@ -2160,14 +2179,14 @@ factor_to_string (const struct xfactor *fctr,
     {
       ds_put_format (str, "(%s = ", var_get_name (fctr->indep_var[0]));
 
-      var_append_value_name (fctr->indep_var[0], result->value[0], str);
+      var_append_value_name (fctr->indep_var[0], &result->value[0], str);
 
       if ( fctr->indep_var[1] )
        {
          ds_put_cstr (str, ",");
          ds_put_format (str, "%s = ", var_get_name (fctr->indep_var[1]));
 
-         var_append_value_name (fctr->indep_var[1], result->value[1], str);
+         var_append_value_name (fctr->indep_var[1], &result->value[1], str);
        }
       ds_put_cstr (str, ")");
     }