X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fsort.c;h=01e955334c9480cccc47f385519367d490e41d5e;hb=d87ef24cc012a5eb67bb98fad972d29f36f18f48;hp=4d64b32474412bd3fcd1682ab0f572315fa5bc99;hpb=e947f08aea815968ef993d572977e271fa3ad4da;p=pspp-builds.git diff --git a/src/math/sort.c b/src/math/sort.c index 4d64b324..01e95533 100644 --- a/src/math/sort.c +++ b/src/math/sort.c @@ -18,31 +18,33 @@ 02110-1301, USA. */ #include + #include "sort.h" -#include -#include + +#include #include +#include #include #include -#include -#include -#include + +#include #include #include -#include +#include +#include +#include +#include #include - +#include +#include +#include +#include #include -#include #include -#include -#include #include "gettext.h" #define _(msgid) gettext (msgid) -#include - /* These should only be changed for testing purposes. */ int min_buffers = 64; int max_buffers = INT_MAX; @@ -55,24 +57,11 @@ static struct casefile *do_internal_sort (struct casereader *, static struct casefile *do_external_sort (struct casereader *, const struct sort_criteria *); -/* Gets ready to sort the active file, either in-place or to a - separate casefile. */ -static bool +/* Get ready to sort the active file. */ +static void prepare_to_sort_active_file (void) { - bool ok; - - /* Cancel temporary transformations and PROCESS IF. */ - if (temporary != 0) - cancel_temporary (); - expr_free (process_if_expr); - process_if_expr = NULL; - - /* Make sure source cases are in a storage source. */ - ok = procedure (NULL, NULL); - assert (case_source_is_class (vfm_source, &storage_source_class)); - - return ok; + proc_cancel_temporary_transformations (); } /* Sorts the active file in-place according to CRITERIA. @@ -80,21 +69,35 @@ prepare_to_sort_active_file (void) int sort_active_file_in_place (const struct sort_criteria *criteria) { - struct casefile *src, *dst; + struct casefile *in, *out; + + prepare_to_sort_active_file (); + if (!procedure (NULL, NULL)) + return 0; - if (!prepare_to_sort_active_file ()) + in = proc_capture_output (); + out = sort_execute (casefile_get_destructive_reader (in), criteria); + if (out == NULL) return 0; - src = storage_source_get_casefile (vfm_source); - dst = sort_execute (casefile_get_destructive_reader (src), criteria); - free_case_source (vfm_source); - vfm_source = NULL; + proc_set_source (storage_source_create (out)); + return 1; +} - if (dst == NULL) - return 0; +/* Data passed to sort_to_casefile_callback(). */ +struct sort_to_casefile_cb_data + { + const struct sort_criteria *criteria; + struct casefile *output; + }; - vfm_source = storage_source_create (dst); - return 1; +/* Sorts casefile CF according to the criteria in CB_DATA. */ +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); + return cb_data->output != NULL; } /* Sorts the active file to a separate casefile. If successful, @@ -103,13 +106,18 @@ sort_active_file_in_place (const struct sort_criteria *criteria) struct casefile * sort_active_file_to_casefile (const struct sort_criteria *criteria) { - struct casefile *src; + struct sort_to_casefile_cb_data cb_data; - if (!prepare_to_sort_active_file ()) - return NULL; + prepare_to_sort_active_file (); - src = storage_source_get_casefile (vfm_source); - return sort_execute (casefile_get_reader (src), criteria); + cb_data.criteria = criteria; + cb_data.output = NULL; + if (!multipass_procedure (sort_to_casefile_callback, &cb_data)) + { + casefile_destroy (cb_data.output); + return NULL; + } + return cb_data.output; } @@ -302,8 +310,6 @@ struct initial_run_state int okay; /* Zero if an error has been encountered. */ }; -static const struct case_sink_class sort_sink_class; - static bool destroy_initial_run_state (struct initial_run_state *); static void process_case (struct initial_run_state *, const struct ccase *, size_t);