X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fmath%2Fsort.c;h=01e955334c9480cccc47f385519367d490e41d5e;hb=321aff454c80b141d1d85fc1e3ea0c4eb05ab437;hp=c20b809aceddcce2f606b675c151b805e4d22ee7;hpb=77e551d23575da6b89f866612ab39c2b0497c9be;p=pspp diff --git a/src/math/sort.c b/src/math/sort.c index c20b809ace..01e955334c 100644 --- a/src/math/sort.c +++ b/src/math/sort.c @@ -18,25 +18,29 @@ 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) @@ -53,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. @@ -78,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, @@ -101,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; } @@ -300,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);