/[pspp]/pspp/src/sort.c
ViewVC logotype

Diff of /pspp/src/sort.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.22 by jmd, Thu Jan 6 12:55:44 2005 UTC revision 1.23 by blp, Sun Jan 9 07:59:48 2005 UTC
# Line 334  compare_case_dblptrs (const void *a_, co Line 334  compare_case_dblptrs (const void *a_, co
334  static int  static int
335  compare_initial_runs (const void *a_, const void *b_, void *aux UNUSED)  compare_initial_runs (const void *a_, const void *b_, void *aux UNUSED)
336  {  {
337    const struct casefile *a = a_;    struct casefile *const *a = a_;
338    const struct casefile *b = b_;    struct casefile *const *b = b_;
339    unsigned long a_case_cnt = casefile_get_case_cnt (a);    unsigned long a_case_cnt = casefile_get_case_cnt (*a);
340    unsigned long b_case_cnt = casefile_get_case_cnt (b);    unsigned long b_case_cnt = casefile_get_case_cnt (*b);
341        
342    return a_case_cnt > b_case_cnt ? -1 : a_case_cnt < b_case_cnt;    return a_case_cnt > b_case_cnt ? -1 : a_case_cnt < b_case_cnt;
343  }  }
# Line 753  merge (struct external_sort *xsrt) Line 753  merge (struct external_sort *xsrt)
753               compare_initial_runs, NULL);               compare_initial_runs, NULL);
754    dummy_run_cnt = mod (1 - (int) xsrt->run_cnt, max_order - 1);    dummy_run_cnt = mod (1 - (int) xsrt->run_cnt, max_order - 1);
755    
756    assert( max_order > 0 );    assert (max_order > 0);
757    assert (max_order <= 2    assert (max_order <= 2
758            || (xsrt->run_cnt + dummy_run_cnt) % (max_order - 1) == 1);            || (xsrt->run_cnt + dummy_run_cnt) % (max_order - 1) == 1);
759    while (xsrt->run_cnt > 1)    while (xsrt->run_cnt > 1)
# Line 832  merge_once (struct merge_state *mrg, Line 832  merge_once (struct merge_state *mrg,
832    
833    for (i = 0; i < run_cnt; i++)    for (i = 0; i < run_cnt; i++)
834      {      {
835        input_readers[i] = casefile_get_reader (input_runs[i]);        input_readers[i] = casefile_get_destructive_reader (input_runs[i]);
836        if (!casereader_read_xfer (input_readers[i], &input_cases[i]))        if (!casereader_read_xfer (input_readers[i], &input_cases[i]))
837          {          {
838            run_cnt--;            run_cnt--;
# Line 856  merge_once (struct merge_state *mrg, Line 856  merge_once (struct merge_state *mrg,
856            min_idx = i;            min_idx = i;
857    
858        /* Write minimum to output file. */        /* Write minimum to output file. */
859        casefile_append_xfer (output_casefile, &input_cases[i]);        casefile_append_xfer (output_casefile, &input_cases[min_idx]);
860    
861        if (!casereader_read_xfer (input_readers[i], &input_cases[i]))        if (!casereader_read_xfer (input_readers[min_idx],
862                                     &input_cases[min_idx]))
863          {          {
864            casereader_destroy (input_readers[i]);            casereader_destroy (input_readers[min_idx]);
865            casefile_destroy (input_runs[i]);            casefile_destroy (input_runs[min_idx]);
866    
867            run_cnt--;            run_cnt--;
868            input_runs[i] = input_runs[run_cnt--];            input_runs[min_idx] = input_runs[run_cnt];
869            input_readers[i] = input_readers[run_cnt--];            input_readers[min_idx] = input_readers[run_cnt];
870            input_cases[i] = input_cases[run_cnt--];            input_cases[min_idx] = input_cases[run_cnt];
871          }          }
872      }      }
873    

Legend:
Removed from v.1.22  
changed lines
  Added in v.1.23

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26