Finish converting struct variable to an opaque type. In this
[pspp-builds.git] / src / language / stats / frequencies.q
index 929f987aa093a2c6609f1c5e3fe769feaa08305e..f614bcf9970c0219b21e59e874db61862a9afed3 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <data/case.h>
 #include <data/dictionary.h>
+#include <data/format.h>
 #include <data/procedure.h>
 #include <data/settings.h>
 #include <data/value-labels.h>
@@ -269,9 +270,7 @@ struct var_freqs
 static inline struct var_freqs *
 get_var_freqs (const struct variable *v)
 {
-  assert (v != NULL);
-  assert (v->aux != NULL);
-  return v->aux;
+  return var_get_aux (v);
 }
 
 static void determine_charts (void);
@@ -516,7 +515,7 @@ calc (const struct ccase *c, void *aux UNUSED, const struct dataset *ds)
   for (i = 0; i < n_variables; i++)
     {
       const struct variable *v = v_variables[i];
-      const union value *val = case_data (c, v->fv);
+      const union value *val = case_data (c, v);
       struct var_freqs *vf = get_var_freqs (v);
       struct freq_tab *ft = &vf->tab;
 
@@ -585,7 +584,7 @@ precalc (const struct ccase *first, void *aux UNUSED, const struct dataset *ds)
           hsh_hash_func *hash;
          hsh_compare_func *compare;
 
-         if (v->type == NUMERIC) 
+         if (var_is_numeric (v))
             {
               hash = hash_value_numeric;
               compare = compare_value_numeric_a; 
@@ -695,23 +694,22 @@ postcalc (void *aux UNUSED, const struct dataset *ds  UNUSED)
    sorting a frequency table by FRQ_SORT using VAR_TYPE
    variables. */
 static hsh_compare_func *
-get_freq_comparator (int frq_sort, int var_type) 
+get_freq_comparator (int frq_sort, enum var_type var_type) 
 {
-  /* Note that q2c generates tags beginning with 1000. */
-  switch (frq_sort | (var_type << 16))
+  bool is_numeric = var_type == VAR_NUMERIC;
+  switch (frq_sort)
     {
-    case FRQ_AVALUE | (NUMERIC << 16):  return compare_value_numeric_a;
-    case FRQ_AVALUE | (ALPHA << 16):    return compare_value_alpha_a;
-    case FRQ_DVALUE | (NUMERIC << 16):  return compare_value_numeric_d;
-    case FRQ_DVALUE | (ALPHA << 16):    return compare_value_alpha_d;
-    case FRQ_AFREQ | (NUMERIC << 16):   return compare_freq_numeric_a;
-    case FRQ_AFREQ | (ALPHA << 16):     return compare_freq_alpha_a;
-    case FRQ_DFREQ | (NUMERIC << 16):   return compare_freq_numeric_d;
-    case FRQ_DFREQ | (ALPHA << 16):     return compare_freq_alpha_d;
-    default: NOT_REACHED ();
+    case FRQ_AVALUE:
+      return is_numeric ? compare_value_numeric_a : compare_value_alpha_a;
+    case FRQ_DVALUE:
+      return is_numeric ? compare_value_numeric_d : compare_value_alpha_d;
+    case FRQ_AFREQ:
+      return is_numeric ? compare_freq_numeric_a : compare_freq_alpha_a;
+    case FRQ_DFREQ:
+      return is_numeric ? compare_freq_numeric_d : compare_freq_alpha_d;
+    default:
+      NOT_REACHED ();
     }
-
-  return 0;
 }
 
 /* Returns true iff the value in struct freq F is non-missing
@@ -722,7 +720,7 @@ not_missing (const void *f_, const void *v_)
   const struct freq *f = f_;
   const struct variable *v = v_;
 
-  return !mv_is_value_missing (&v->miss, f->v);
+  return !var_is_value_missing (v, f->v);
 }
 
 /* Summarizes the frequency table data for variable V. */
@@ -738,7 +736,7 @@ postprocess_freq_tab (struct variable *v)
 
   ft = &get_var_freqs (v)->tab;
   assert (ft->mode == FRQM_GENERAL);
-  compare = get_freq_comparator (cmd.sort, v->type);
+  compare = get_freq_comparator (cmd.sort, var_get_type (v));
 
   /* Extract data from hash table. */
   count = hsh_count (ft->data);
@@ -840,16 +838,16 @@ frq_custom_variables (struct lexer *lexer, struct dataset *ds, struct cmd_freque
       struct variable *v = v_variables[i];
       struct var_freqs *vf;
 
-      if (v->aux != NULL)
+      if (var_get_aux (v) != NULL)
        {
          msg (SE, _("Variable %s specified multiple times on VARIABLES "
-                    "subcommand."), v->name);
+                    "subcommand."), var_get_name (v));
          return 0;
        }
-      if (mode == FRQM_INTEGER && v->type != NUMERIC)
+      if (mode == FRQM_INTEGER && !var_is_numeric (v))
         {
           msg (SE, _("Integer mode specified, but %s is not a numeric "
-                     "variable."), v->name);
+                     "variable."), var_get_name (v));
           return 0;
         }
 
@@ -867,12 +865,13 @@ frq_custom_variables (struct lexer *lexer, struct dataset *ds, struct cmd_freque
         vf->tab.vector = NULL;
       vf->n_groups = 0;
       vf->groups = NULL;
-      vf->width = v->width;
-      vf->print = v->print;
+      vf->width = var_get_width (v);
+      vf->print = *var_get_print_format (v);
       if (vf->width > MAX_SHORT_STRING && get_algorithm () == COMPATIBLE) 
         {
+          enum fmt_type type = var_get_print_format (v)->type;
           vf->width = MAX_SHORT_STRING;
-          vf->print.w = MAX_SHORT_STRING * (v->print.type == FMT_AHEX ? 2 : 1);
+          vf->print.w = MAX_SHORT_STRING * (type == FMT_AHEX ? 2 : 1);
         }
     }
   return 1;
@@ -932,16 +931,16 @@ frq_custom_grouped (struct lexer *lexer, struct dataset *ds, struct cmd_frequenc
           }
 
        for (i = 0; i < n; i++)
-          if (v[i]->aux == NULL)
+          if (var_get_aux (v[i]) == NULL)
             msg (SE, _("Variables %s specified on GROUPED but not on "
-                       "VARIABLES."), v[i]->name);
+                       "VARIABLES."), var_get_name (v[i]));
           else 
             {
               struct var_freqs *vf = get_var_freqs (v[i]);
                 
               if (vf->groups != NULL)
                 msg (SE, _("Variables %s specified multiple times on GROUPED "
-                           "subcommand."), v[i]->name);
+                           "subcommand."), var_get_name (v[i]));
               else
                 {
                   vf->n_groups = nl;
@@ -1144,9 +1143,9 @@ full_dim (struct tab_table *t, struct outp_driver *d)
   int i;
 
   if (lab)
-    t->w[0] = min (tab_natural_width (t, d, 0), d->prop_em_width * 15);
+    t->w[0] = MIN (tab_natural_width (t, d, 0), d->prop_em_width * 15);
   for (i = lab; i < lab + 5; i++)
-    t->w[i] = max (tab_natural_width (t, d, i), d->prop_em_width * 8);
+    t->w[i] = MAX (tab_natural_width (t, d, i), d->prop_em_width * 8);
   for (i = 0; i < t->nr; i++)
     t->h[i] = d->font_height;
 }
@@ -1216,7 +1215,7 @@ dump_full (struct variable *v)
 
       if (lab)
        {
-         const char *label = val_labs_find (v->val_labs, f->v[0]);
+         const char *label = var_lookup_value_label (v, &f->v[0]);
          if (label != NULL)
            tab_text (t, 0, r, TAB_LEFT, label);
        }
@@ -1234,7 +1233,7 @@ dump_full (struct variable *v)
 
       if (lab)
        {
-         const char *label = val_labs_find (v->val_labs, f->v[0]);
+         const char *label = var_lookup_value_label (v, &f->v[0]);
          if (label != NULL)
            tab_text (t, 0, r, TAB_LEFT, label);
        }
@@ -1258,9 +1257,8 @@ dump_full (struct variable *v)
   tab_float (t, 2 + lab, r, TAB_NONE, 100.0, 5, 1);
   tab_float (t, 3 + lab, r, TAB_NONE, 100.0, 5, 1);
 
-  tab_title (t, "%s: %s", v->name, v->label ? v->label : "");
+  tab_title (t, "%s", var_to_string (v));
   tab_submit (t);
-
 }
 
 /* Sets the widths of all the columns and heights of all the rows in
@@ -1268,14 +1266,14 @@ dump_full (struct variable *v)
 static void
 condensed_dim (struct tab_table *t, struct outp_driver *d)
 {
-  int cum_w = max (outp_string_width (d, _("Cum"), OUTP_PROPORTIONAL),
-                  max (outp_string_width (d, _("Cum"), OUTP_PROPORTIONAL),
+  int cum_w = MAX (outp_string_width (d, _("Cum"), OUTP_PROPORTIONAL),
+                  MAX (outp_string_width (d, _("Cum"), OUTP_PROPORTIONAL),
                        outp_string_width (d, "000", OUTP_PROPORTIONAL)));
 
   int i;
 
   for (i = 0; i < 2; i++)
-    t->w[i] = max (tab_natural_width (t, d, i), d->prop_em_width * 8);
+    t->w[i] = MAX (tab_natural_width (t, d, i), d->prop_em_width * 8);
   for (i = 2; i < 4; i++)
     t->w[i] = cum_w;
   for (i = 0; i < t->nr; i++)
@@ -1334,7 +1332,7 @@ dump_condensed (struct variable *v)
           cmd.spaces == FRQ_SINGLE ? -1 : TAL_GAP, TAL_1,
           0, 0, 3, r - 1);
   tab_hline (t, TAL_2, 0, 3, 2);
-  tab_title (t, "%s: %s", v->name, v->label ? v->label : "");
+  tab_title (t, "%s", var_to_string (v));
   tab_columns (t, SOM_COL_DOWN, 1);
   tab_submit (t);
 }
@@ -1518,13 +1516,13 @@ dump_statistics (struct variable *v, int show_varname)
   if ( implicit_50th && n_percentiles > 0 ) 
     --n_percentiles;
 
-  if (v->type == ALPHA)
+  if (var_is_alpha (v))
     return;
   ft = &get_var_freqs (v)->tab;
   if (ft->n_valid == 0)
     {
       msg (SW, _("No valid data for variable %s; statistics not displayed."),
-          v->name);
+          var_get_name (v));
       return;
     }
   calc_stats (v, stat_value);
@@ -1571,12 +1569,7 @@ dump_statistics (struct variable *v, int show_varname)
 
   tab_columns (t, SOM_COL_DOWN, 1);
   if (show_varname)
-    {
-      if (v->label)
-       tab_title (t, "%s: %s", v->name, v->label);
-      else
-       tab_title (t, "%s", v->name);
-    }
+    tab_title (t, "%s", var_to_string (v));
   else
     tab_flags (t, SOMF_NO_TITLE);
 
@@ -1603,7 +1596,7 @@ freq_tab_to_hist(const struct freq_tab *ft, const struct variable *var)
   /* Find out the extremes of the x value */
   for ( frq = hsh_first(fh, &hi); frq != 0; frq = hsh_next(fh, &hi) ) 
     {
-      if ( mv_is_value_missing(&var->miss, frq->v))
+      if ( var_is_value_missing(var, frq->v))
        continue;
 
       if ( frq->v[0].f < x_min ) x_min = frq->v[0].f ;
@@ -1648,7 +1641,7 @@ freq_tab_to_slice_array(const struct freq_tab *frq_tab,
     {
       const struct freq *frq = &frq_tab->valid[i];
 
-      slices[i].label = value_to_string(frq->v, var);
+      slices[i].label = var_get_value_name (var, frq->v);
 
       slices[i].magnetude = frq->c;
     }