X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fsort.c;h=01e955334c9480cccc47f385519367d490e41d5e;hb=d87ef24cc012a5eb67bb98fad972d29f36f18f48;hp=8b06867fd07848c6ace781ca459716d708fab494;hpb=0d7b430cd1cef60b963a54307622d6f4aa8efeb4;p=pspp-builds.git diff --git a/src/math/sort.c b/src/math/sort.c index 8b06867f..01e95533 100644 --- a/src/math/sort.c +++ b/src/math/sort.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -40,7 +41,6 @@ #include #include #include -#include #include "gettext.h" #define _(msgid) gettext (msgid) @@ -57,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. @@ -82,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, @@ -105,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; } @@ -304,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);