Rewrite expression code.
[pspp-builds.git] / src / sort.c
index 33c5651d9bd8b225a5d144bc35953a5333c00150..a77c5a8298f22d387e628be51850ba00627acf19 100644 (file)
@@ -29,7 +29,7 @@
 #include "casefile.h"
 #include "command.h"
 #include "error.h"
-#include "expr.h"
+#include "expressions/public.h"
 #include "lexer.h"
 #include "misc.h"
 #include "settings.h"
@@ -334,10 +334,10 @@ compare_case_dblptrs (const void *a_, const void *b_, void *criteria_)
 static int
 compare_initial_runs (const void *a_, const void *b_, void *aux UNUSED) 
 {
-  const struct casefile *a = a_;
-  const struct casefile *b = b_;
-  unsigned long a_case_cnt = casefile_get_case_cnt (a);
-  unsigned long b_case_cnt = casefile_get_case_cnt (b);
+  struct casefile *const *a = a_;
+  struct casefile *const *b = b_;
+  unsigned long a_case_cnt = casefile_get_case_cnt (*a);
+  unsigned long b_case_cnt = casefile_get_case_cnt (*b);
   
   return a_case_cnt > b_case_cnt ? -1 : a_case_cnt < b_case_cnt;
 }
@@ -752,7 +752,9 @@ merge (struct external_sort *xsrt)
   make_heap (xsrt->initial_runs, xsrt->run_cnt, sizeof *xsrt->initial_runs,
              compare_initial_runs, NULL);
   dummy_run_cnt = mod (1 - (int) xsrt->run_cnt, max_order - 1);
-  assert (max_order == 1
+
+  assert (max_order > 0);
+  assert (max_order <= 2
           || (xsrt->run_cnt + dummy_run_cnt) % (max_order - 1) == 1);
   while (xsrt->run_cnt > 1)
     {
@@ -830,7 +832,7 @@ merge_once (struct merge_state *mrg,
 
   for (i = 0; i < run_cnt; i++) 
     {
-      input_readers[i] = casefile_get_reader (input_runs[i]);
+      input_readers[i] = casefile_get_destructive_reader (input_runs[i]);
       if (!casereader_read_xfer (input_readers[i], &input_cases[i]))
         {
           run_cnt--;
@@ -854,17 +856,18 @@ merge_once (struct merge_state *mrg,
           min_idx = i;
 
       /* Write minimum to output file. */
-      casefile_append_xfer (output_casefile, &input_cases[i]);
+      casefile_append_xfer (output_casefile, &input_cases[min_idx]);
 
-      if (!casereader_read_xfer (input_readers[i], &input_cases[i]))
+      if (!casereader_read_xfer (input_readers[min_idx],
+                                 &input_cases[min_idx]))
         {
-          casereader_destroy (input_readers[i]);
-          casefile_destroy (input_runs[i]);
+          casereader_destroy (input_readers[min_idx]);
+          casefile_destroy (input_runs[min_idx]);
 
           run_cnt--;
-          input_runs[i] = input_runs[run_cnt--];
-          input_readers[i] = input_readers[run_cnt--];
-          input_cases[i] = input_cases[run_cnt--];
+          input_runs[min_idx] = input_runs[run_cnt];
+          input_readers[min_idx] = input_readers[run_cnt];
+          input_cases[min_idx] = input_cases[run_cnt];
         } 
     }