X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fdata%2Fprocedure.c;h=a779771ca427d1e55befa6d51b955fe1b1bb98ce;hb=a37754c18dee3d5941e5fe041b2c1fa1a3370157;hp=1b1e628b1ed745fa96610e4d54572875f250c22e;hpb=c489ad9041918ca8c80dadceade988daab1d25f8;p=pspp diff --git a/src/data/procedure.c b/src/data/procedure.c index 1b1e628b1e..a779771ca4 100644 --- a/src/data/procedure.c +++ b/src/data/procedure.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -168,7 +169,7 @@ multipass_procedure (bool (*proc_func) (const struct casefile *, void *aux), struct multipass_aux_data aux_data; bool ok; - aux_data.casefile = casefile_create (dict_get_next_value_idx (default_dict)); + aux_data.casefile = fastfile_create (dict_get_next_value_idx (default_dict)); aux_data.proc_func = proc_func; aux_data.aux = aux; @@ -219,7 +220,8 @@ internal_procedure (bool (*case_func) (const struct ccase *, void *), wc_data.case_func = case_func; wc_data.aux = aux; create_trns_case (&wc_data.trns_case, default_dict); - case_create (&wc_data.sink_case, dict_get_next_value_idx (default_dict)); + case_create (&wc_data.sink_case, + dict_get_compacted_value_cnt (default_dict)); wc_data.cases_written = 0; ok = proc_source->class->read (proc_source, @@ -458,7 +460,6 @@ lagged_case (int n_before) /* Represents auxiliary data for handling SPLIT FILE. */ struct split_aux_data { - size_t case_count; /* Number of cases so far. */ struct ccase prev_case; /* Data in previous case. */ /* Callback functions. */ @@ -498,7 +499,6 @@ procedure_with_splits (void (*begin_func) (const struct ccase *, void *aux), struct split_aux_data split_aux; bool ok; - split_aux.case_count = 0; case_nullify (&split_aux.prev_case); split_aux.begin_func = begin_func; split_aux.proc_func = proc_func; @@ -520,10 +520,10 @@ split_procedure_case_func (const struct ccase *c, void *split_aux_) struct split_aux_data *split_aux = split_aux_; /* Start a new series if needed. */ - if (split_aux->case_count == 0 + if (case_is_null (&split_aux->prev_case) || !equal_splits (c, &split_aux->prev_case)) { - if (split_aux->case_count > 0 && split_aux->end_func != NULL) + if (!case_is_null (&split_aux->prev_case) && split_aux->end_func != NULL) split_aux->end_func (split_aux->func_aux); case_destroy (&split_aux->prev_case); @@ -533,7 +533,6 @@ split_procedure_case_func (const struct ccase *c, void *split_aux_) split_aux->begin_func (&split_aux->prev_case, split_aux->func_aux); } - split_aux->case_count++; return (split_aux->proc_func == NULL || split_aux->proc_func (c, split_aux->func_aux)); } @@ -544,7 +543,7 @@ split_procedure_end_func (void *split_aux_) { struct split_aux_data *split_aux = split_aux_; - if (split_aux->case_count > 0 && split_aux->end_func != NULL) + if (!case_is_null (&split_aux->prev_case) && split_aux->end_func != NULL) split_aux->end_func (split_aux->func_aux); return true; } @@ -620,7 +619,7 @@ multipass_split_case_func (const struct ccase *c, void *aux_) ok = multipass_split_output (aux); /* Start a new casefile. */ - aux->casefile = casefile_create (dict_get_next_value_idx (default_dict)); + aux->casefile = fastfile_create (dict_get_next_value_idx (default_dict)); } return casefile_append (aux->casefile, c) && ok; @@ -802,6 +801,7 @@ void proc_done (void) { discard_variables (); + dict_destroy (default_dict); } /* Sets SINK as the destination for procedure output from the @@ -875,7 +875,7 @@ add_case_limit_trns (void) *CASES_REMAINING. */ static int case_limit_trns_proc (void *cases_remaining_, - struct ccase *c UNUSED, int case_nr UNUSED) + struct ccase *c UNUSED, casenum_t case_nr UNUSED) { size_t *cases_remaining = cases_remaining_; if (*cases_remaining > 0) @@ -914,7 +914,7 @@ add_filter_trns (void) /* FILTER transformation. */ static int filter_trns_proc (void *filter_var_, - struct ccase *c UNUSED, int case_nr UNUSED) + struct ccase *c UNUSED, casenum_t case_nr UNUSED) { struct variable *filter_var = filter_var_;