X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fsort.c;h=90bbdf64028057bb1f5a2d7eca6f764146ee7bb6;hb=032126b098a3600655156bd26ded365953c5283e;hp=1d2257b246ded9d0f33f1aa3d42ad5ea40592ef5;hpb=81fff61a96bece351e381ad3fef8ab1248a952ba;p=pspp-builds.git diff --git a/src/math/sort.c b/src/math/sort.c index 1d2257b2..90bbdf64 100644 --- a/src/math/sort.c +++ b/src/math/sort.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -62,28 +64,26 @@ static void prepare_to_sort_active_file (void) { proc_cancel_temporary_transformations (); - expr_free (process_if_expr); - process_if_expr = NULL; } /* Sorts the active file in-place according to CRITERIA. - Returns nonzero if successful. */ -int + Returns true if successful. */ +bool sort_active_file_in_place (const struct sort_criteria *criteria) { struct casefile *in, *out; prepare_to_sort_active_file (); if (!procedure (NULL, NULL)) - return 0; + return false; in = proc_capture_output (); out = sort_execute (casefile_get_destructive_reader (in), criteria); if (out == NULL) - return 0; + return false; proc_set_source (storage_source_create (out)); - return 1; + return true; } /* Data passed to sort_to_casefile_callback(). */ @@ -114,8 +114,11 @@ sort_active_file_to_casefile (const struct sort_criteria *criteria) cb_data.criteria = criteria; cb_data.output = NULL; - multipass_procedure (sort_to_casefile_callback, &cb_data); - + if (!multipass_procedure (sort_to_casefile_callback, &cb_data)) + { + casefile_destroy (cb_data.output); + return NULL; + } return cb_data.output; } @@ -160,7 +163,7 @@ do_internal_sort (struct casereader *reader, return NULL; case_cnt = casefile_get_case_cnt (src); - dst = casefile_create (casefile_get_value_cnt (src)); + dst = fastfile_create (casefile_get_value_cnt (src)); if (case_cnt != 0) { struct indexed_case *cases = nmalloc (sizeof *cases, case_cnt); @@ -172,7 +175,7 @@ do_internal_sort (struct casereader *reader, { bool ok = casereader_read_xfer (reader, &cases[i].c); if (!ok) - abort (); + NOT_REACHED (); cases[i].idx = i; } @@ -182,7 +185,7 @@ do_internal_sort (struct casereader *reader, for (i = 0; i < case_cnt; i++) casefile_append_xfer (dst, &cases[i].c); if (casefile_error (dst)) - abort (); + NOT_REACHED (); free (cases); } @@ -506,7 +509,7 @@ start_run (struct initial_run_state *irs) { irs->run++; irs->case_cnt = 0; - irs->casefile = casefile_create (irs->xsrt->value_cnt); + irs->casefile = fastfile_create (irs->xsrt->value_cnt); casefile_to_disk (irs->casefile); case_nullify (&irs->last_output); } @@ -671,7 +674,7 @@ merge_once (struct external_sort *xsrt, } /* Create output file. */ - output = casefile_create (xsrt->value_cnt); + output = fastfile_create (xsrt->value_cnt); casefile_to_disk (output); /* Merge. */