X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fsort.c;h=827c2314f2e6e54ceab3a3cb597fbc8287993e31;hb=19d0debdc5b72e1bb6c79956403a4d3bc054f300;hp=90bbdf64028057bb1f5a2d7eca6f764146ee7bb6;hpb=e16d30a43af6ada7b8846f48a55eb3cb8f4e5f22;p=pspp-builds.git diff --git a/src/math/sort.c b/src/math/sort.c index 90bbdf64..827c2314 100644 --- a/src/math/sort.c +++ b/src/math/sort.c @@ -44,6 +44,8 @@ #include #include +#include "minmax.h" + #include "gettext.h" #define _(msgid) gettext (msgid) @@ -59,30 +61,25 @@ static struct casefile *do_internal_sort (struct casereader *, static struct casefile *do_external_sort (struct casereader *, const struct sort_criteria *); -/* Get ready to sort the active file. */ -static void -prepare_to_sort_active_file (void) -{ - proc_cancel_temporary_transformations (); -} /* Sorts the active file in-place according to CRITERIA. Returns true if successful. */ bool -sort_active_file_in_place (const struct sort_criteria *criteria) +sort_active_file_in_place (struct dataset *ds, + const struct sort_criteria *criteria) { struct casefile *in, *out; - prepare_to_sort_active_file (); - if (!procedure (NULL, NULL)) + proc_cancel_temporary_transformations (ds); + if (!procedure (ds, NULL, NULL)) return false; - in = proc_capture_output (); + in = proc_capture_output (ds); out = sort_execute (casefile_get_destructive_reader (in), criteria); if (out == NULL) return false; - proc_set_source (storage_source_create (out)); + proc_set_source (ds, storage_source_create (out)); return true; } @@ -98,7 +95,7 @@ static bool sort_to_casefile_callback (const struct casefile *cf, void *cb_data_) { struct sort_to_casefile_cb_data *cb_data = cb_data_; - cb_data->output = sort_execute (casefile_get_reader (cf), cb_data->criteria); + cb_data->output = sort_execute (casefile_get_reader (cf, NULL), cb_data->criteria); return cb_data->output != NULL; } @@ -106,15 +103,16 @@ sort_to_casefile_callback (const struct casefile *cf, void *cb_data_) returns the sorted casefile. Returns a null pointer on failure. */ struct casefile * -sort_active_file_to_casefile (const struct sort_criteria *criteria) +sort_active_file_to_casefile (struct dataset *ds, + const struct sort_criteria *criteria) { struct sort_to_casefile_cb_data cb_data; - prepare_to_sort_active_file (); + proc_cancel_temporary_transformations (ds); cb_data.criteria = criteria; cb_data.output = NULL; - if (!multipass_procedure (sort_to_casefile_callback, &cb_data)) + if (!multipass_procedure (ds, sort_to_casefile_callback, &cb_data)) { casefile_destroy (cb_data.output); return NULL; @@ -143,7 +141,7 @@ struct indexed_case unsigned long idx; /* Index to allow for stable sorting. */ }; -static int compare_indexed_cases (const void *, const void *, void *); +static int compare_indexed_cases (const void *, const void *, const void *); /* If the data is in memory, do an internal sort and return a new casefile for the data. Otherwise, return a null pointer. */ @@ -204,9 +202,9 @@ do_internal_sort (struct casereader *reader, at A and B, with a "last resort" comparison for stability, and returns a strcmp()-type result. */ static int -compare_indexed_cases (const void *a_, const void *b_, void *criteria_) +compare_indexed_cases (const void *a_, const void *b_, const void *criteria_) { - struct sort_criteria *criteria = criteria_; + const struct sort_criteria *criteria = criteria_; const struct indexed_case *a = a_; const struct indexed_case *b = b_; int result = compare_record (&a->c, &b->c, criteria); @@ -313,16 +311,17 @@ struct initial_run_state }; static bool destroy_initial_run_state (struct initial_run_state *); -static void process_case (struct initial_run_state *, const struct ccase *, - size_t); +static void process_case (struct initial_run_state *, + const struct ccase *, size_t); static int allocate_cases (struct initial_run_state *); static void output_record (struct initial_run_state *); static void start_run (struct initial_run_state *); static void end_run (struct initial_run_state *); static int compare_record_run (const struct record_run *, const struct record_run *, - struct initial_run_state *); -static int compare_record_run_minheap (const void *, const void *, void *); + const struct initial_run_state *); +static int compare_record_run_minheap (const void *, const void *, + const void *); /* Reads cases from READER and composes initial runs in XSRT. */ static int @@ -365,7 +364,8 @@ write_runs (struct external_sort *xsrt, struct casereader *reader) /* Add a single case to an initial run. */ static void -process_case (struct initial_run_state *irs, const struct ccase *c, size_t idx) +process_case (struct initial_run_state *irs, const struct ccase *c, + size_t idx) { struct record_run *rr; @@ -484,7 +484,7 @@ compare_record (const struct ccase *a, const struct ccase *b, static int compare_record_run (const struct record_run *a, const struct record_run *b, - struct initial_run_state *irs) + const struct initial_run_state *irs) { int result = a->run < b->run ? -1 : a->run > b->run; if (result == 0) @@ -498,7 +498,7 @@ compare_record_run (const struct record_run *a, on the current record according to SCP, but in descending order. */ static int -compare_record_run_minheap (const void *a, const void *b, void *irs) +compare_record_run_minheap (const void *a, const void *b, const void *irs) { return -compare_record_run (a, b, irs); } @@ -589,7 +589,7 @@ merge (struct external_sort *xsrt) { while (xsrt->run_cnt > 1) { - int order = min (MAX_MERGE_ORDER, xsrt->run_cnt); + int order = MIN (MAX_MERGE_ORDER, xsrt->run_cnt); int idx = choose_merge (xsrt->runs, xsrt->run_cnt, order); xsrt->runs[idx] = merge_once (xsrt, xsrt->runs + idx, order); remove_range (xsrt->runs, xsrt->run_cnt, sizeof *xsrt->runs,