Reworked settings so as to use one large struct instead of lots of static
[pspp-builds.git] / src / language / stats / frequencies.q
index 681d2161f10c85c29c647449e01ef424db9eb1a4..e7509052b05b2aa93dfadbe3eb72a6cc97383e35 100644 (file)
@@ -38,7 +38,6 @@
 #include <language/command.h>
 #include <language/dictionary/split-file.h>
 #include <language/lexer/lexer.h>
-#include <libpspp/alloc.h>
 #include <libpspp/array.h>
 #include <libpspp/bit-vector.h>
 #include <libpspp/compiler.h>
@@ -59,6 +58,7 @@
 #include "freq.h"
 
 #include "minmax.h"
+#include "xalloc.h"
 
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
@@ -538,10 +538,11 @@ precalc (struct casereader *input, struct dataset *ds)
   struct ccase c;
   size_t i;
 
-  if (!casereader_peek (input, 0, &c))
-    return;
-  output_split_file_values (ds, &c);
-  case_destroy (&c);
+  if (casereader_peek (input, 0, &c))
+    {
+      output_split_file_values (ds, &c);
+      case_destroy (&c);
+    }
 
   pool_destroy (data_pool);
   data_pool = pool_create ();
@@ -636,12 +637,12 @@ postcalc (void)
 }
 
 /* Returns the comparison function that should be used for
-   sorting a frequency table by FRQ_SORT using VAR_TYPE
-   variables. */
+   sorting a frequency table by FRQ_SORT using VAL_TYPE
+   values. */
 static hsh_compare_func *
-get_freq_comparator (int frq_sort, enum var_type var_type)
+get_freq_comparator (int frq_sort, enum val_type val_type)
 {
-  bool is_numeric = var_type == VAR_NUMERIC;
+  bool is_numeric = val_type == VAL_NUMERIC;
   switch (frq_sort)
     {
     case FRQ_AVALUE:
@@ -765,7 +766,7 @@ frq_custom_variables (struct lexer *lexer, struct dataset *ds, struct cmd_freque
       vf->groups = NULL;
       vf->width = var_get_width (v);
       vf->print = *var_get_print_format (v);
-      if (vf->width > MAX_SHORT_STRING && get_algorithm () == COMPATIBLE)
+      if (vf->width > MAX_SHORT_STRING && settings_get_algorithm () == COMPATIBLE)
         {
           enum fmt_type type = var_get_print_format (v)->type;
           vf->width = MAX_SHORT_STRING;
@@ -1256,7 +1257,7 @@ calc_stats (const struct variable *v, double d[frq_n_stats])
          double tp;
          if ( percentiles[i].flag2  ) continue ;
 
-         if ( get_algorithm() != COMPATIBLE )
+         if ( settings_get_algorithm () != COMPATIBLE )
            tp =
              (ft->valid_cases - 1) *  percentiles[i].p;
          else
@@ -1307,7 +1308,7 @@ calc_stats (const struct variable *v, double d[frq_n_stats])
       double s;
 
       double dummy;
-      if ( get_algorithm() != COMPATIBLE )
+      if ( settings_get_algorithm () != COMPATIBLE )
        {
          s = modf((ft->valid_cases - 1) * percentiles[i].p , &dummy);
        }
@@ -1498,7 +1499,7 @@ freq_tab_to_slice_array(const struct freq_tab *frq_tab,
     {
       const struct freq *frq = &frq_tab->valid[i];
 
-      slices[i].label = var_get_value_name (var, frq->value);
+      var_append_value_name (var, frq->value, &slices[i].label);
       slices[i].magnetude = frq->count;
     }
 
@@ -1512,12 +1513,17 @@ static void
 do_piechart(const struct variable *var, const struct freq_tab *frq_tab)
 {
   struct slice *slices;
-  int n_slices;
+  int n_slices, i;
 
   slices = freq_tab_to_slice_array(frq_tab, var, &n_slices);
 
   piechart_plot(var_to_string(var), slices, n_slices);
 
+  for (i = 0 ; i < n_slices ; ++i )
+    {
+      ds_destroy (&slices[i].label);
+    }
+
   free(slices);
 }