Make the expression code a little nicer and fix bugs found
[pspp] / src / frequencies.q
index 44393a89bbe765ad473afaa63a1af1a4cc72a9f5..e7657b64189b7a254c6d1e9b4e38605ddf61a688 100644 (file)
@@ -24,7 +24,7 @@
 */
 
 #include <config.h>
-#include <assert.h>
+#include "error.h"
 #include <math.h>
 #include <stdlib.h>
 #include "alloc.h"
@@ -211,7 +211,6 @@ internal_cmd_frequencies (void)
   for (i = 0; i < dict_get_var_cnt (default_dict); i++)
     dict_get_var(default_dict, i)->p.frq.used = 0;
 
-  lex_match_id ("FREQUENCIES");
   if (!parse_frequencies (&cmd))
     return CMD_FAILURE;
 
@@ -246,7 +245,7 @@ internal_cmd_frequencies (void)
     cmd.sort = FRQ_AVALUE;
 
   /* Do it! */
-  procedure (precalc, calc, postcalc, NULL);
+  procedure_with_splits (precalc, calc, postcalc, NULL);
 
   return CMD_SUCCESS;
 }
@@ -518,6 +517,8 @@ get_freq_comparator (int frq_sort, int var_type)
   return 0;
 }
 
+/* Returns nonzero iff the value in struct freq F is non-missing
+   for variable V. */
 static int
 not_missing (const void *f_, void *v_) 
 {
@@ -527,8 +528,9 @@ not_missing (const void *f_, void *v_)
   return !is_missing (&f->v, v);
 }
 
+/* Summarizes the frequency table data for variable V. */
 static void
-postprocess_freq_tab (struct variable * v)
+postprocess_freq_tab (struct variable *v)
 {
   hsh_compare_func *compare;
   struct freq_tab *ft;
@@ -575,11 +577,13 @@ postprocess_freq_tab (struct variable * v)
     }
 }
 
+/* Frees the frequency table for variable V. */
 static void
 cleanup_freq_tab (struct variable *v)
 {
   assert (v->p.frq.tab.mode == FRQM_GENERAL);
   free (v->p.frq.tab.valid);
+  hsh_destroy (v->p.frq.tab.data);
 }
 
 /* Parses the VARIABLES subcommand, adding to
@@ -588,7 +592,7 @@ static int
 frq_custom_variables (struct cmd_frequencies *cmd UNUSED)
 {
   int mode;
-  int min, max;
+  int min = 0, max = 0;
 
   int old_n_variables = n_variables;
   int i;
@@ -715,8 +719,11 @@ frq_custom_grouped (struct cmd_frequencies *cmd UNUSED)
                return 0;
              }
          }
-       else
-         nl = 0;
+       else 
+          {
+            nl = 0;
+            dl = NULL;
+          }
 
        for (i = 0; i < n; i++)
          {