X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fsort.c;h=d68ee45b2a71aebee306bac68a4e7818ed482c6c;hb=027eba771a7ef9d25e97f0026d6469ea34c06523;hp=515793d3b43ee2b5698ee30c0d32e2b3f65e2644;hpb=c740d75bc7e22114c5cc5747d0e9460546d8566c;p=pspp-builds.git diff --git a/src/sort.c b/src/sort.c index 515793d3..d68ee45b 100644 --- a/src/sort.c +++ b/src/sort.c @@ -18,6 +18,7 @@ 02111-1307, USA. */ #include +#include "sort.h" #include #include #include @@ -30,7 +31,6 @@ #include "heap.h" #include "lexer.h" #include "misc.h" -#include "sort.h" #include "str.h" #include "var.h" #include "vfm.h" @@ -111,7 +111,7 @@ parse_sort_variables (void) int prev_nv_sort = nv_sort; int order = SRT_ASCEND; - if (!parse_variables (&default_dict, &v_sort, &nv_sort, + if (!parse_variables (default_dict, &v_sort, &nv_sort, PV_NO_DUPLICATE | PV_APPEND | PV_NO_SCRATCH)) return 0; if (lex_match ('(')) @@ -215,13 +215,16 @@ do_internal_sort (int separate) return 0; } -/* Compares the NV_SORT variables in V_SORT[] between the `case_list's - at _A and _B, and returns a strcmp()-type result. */ +/* Compares the NV_SORT variables in V_SORT[] between the + `case_list's at A and B, and returns a strcmp()-type + result. */ static int -compare_case_lists (const void *pa, const void *pb) +compare_case_lists (const void *a_, const void *b_) { - struct case_list *a = *(struct case_list **) pa; - struct case_list *b = *(struct case_list **) pb; + struct case_list *const *pa = a_; + struct case_list *const *pb = b_; + struct case_list *a = *pa; + struct case_list *b = *pb; struct variable *v; int result = 0; int i; @@ -232,27 +235,21 @@ compare_case_lists (const void *pa, const void *pb) if (v->type == NUMERIC) { - if (approx_ne (a->c.data[v->fv].f, b->c.data[v->fv].f)) - { - result = (a->c.data[v->fv].f > b->c.data[v->fv].f) ? 1 : -1; - break; - } + double af = a->c.data[v->fv].f; + double bf = b->c.data[v->fv].f; + + result = af < bf ? -1 : af > bf; } else - { - result = memcmp (a->c.data[v->fv].s, b->c.data[v->fv].s, v->width); - if (result != 0) - break; - } - } + result = memcmp (a->c.data[v->fv].s, b->c.data[v->fv].s, v->width); - if (v->p.srt.order == SRT_ASCEND) - return result; - else - { - assert (v->p.srt.order == SRT_DESCEND); - return -result; + if (result != 0) + break; } + + if (v->p.srt.order == SRT_DESCEND) + result = -result; + return result; } /* External sort. */ @@ -488,7 +485,8 @@ allocate_cases (void) { /* This is the size of one case. */ const int case_size = (sizeof (struct repl_sel_tree) - + sizeof (union value) * (default_dict.nval - 1) + + (sizeof (union value) + * (dict_get_value_cnt (default_dict) - 1)) + sizeof (struct repl_sel_tree *)); x = NULL; @@ -504,7 +502,8 @@ allocate_cases (void) for (i = 0; i < x_max; i++) { x[i] = malloc (sizeof (struct repl_sel_tree) - + sizeof (union value) * (default_dict.nval - 1)); + + (sizeof (union value) + * (dict_get_value_cnt (default_dict) - 1))); if (x[i] == NULL) break; } @@ -730,7 +729,8 @@ write_initial_runs (int separate) J->rn = 0; J->fe = x[(x_max + j) / 2]; J->fi = x[j / 2]; - memset (J->record, 0, default_dict.nval * sizeof (union value)); + memset (J->record, 0, + dict_get_value_cnt (default_dict) * sizeof (union value)); } } @@ -917,10 +917,11 @@ merge (void) order = MAX_MERGE_ORDER; if (x_max / order < MIN_BUFFER_SIZE_RECS) order = x_max / MIN_BUFFER_SIZE_RECS; - else if (x_max / order * sizeof (union value) * default_dict.nval + else if (x_max / order * sizeof (union value) * dict_get_value_cnt (default_dict) < MIN_BUFFER_SIZE_BYTES) order = x_max / (MIN_BUFFER_SIZE_BYTES - / (sizeof (union value) * (default_dict.nval - 1))); + / (sizeof (union value) + * (dict_get_value_cnt (default_dict) - 1))); /* Make sure the order of merge is bounded. */ if (order < 2) @@ -1061,8 +1062,8 @@ merge_once (int run_index[], int run_length[], int n_runs) buffered[i] = min (records_per_buffer, run_length[i]); for (j = 0; j < buffered[i]; j++) if ((int) fread (x[j + ofs]->record, sizeof (union value), - default_dict.nval, handle[i]) - != default_dict.nval) + dict_get_value_cnt (default_dict), handle[i]) + != dict_get_value_cnt (default_dict)) { sprintf (tmp_extname, "%08x", run_index[i]); if (ferror (handle[i])) @@ -1090,8 +1091,9 @@ merge_once (int run_index[], int run_length[], int n_runs) min = i; if ((int) fwrite (x[buffer_ptr[min]]->record, sizeof (union value), - default_dict.nval, handle[N_INPUT_BUFFERS]) - != default_dict.nval) + dict_get_value_cnt (default_dict), + handle[N_INPUT_BUFFERS]) + != dict_get_value_cnt (default_dict)) { sprintf (tmp_extname, "%08x", run_index[i]); msg (SE, _("%s: Error writing temporary file in " @@ -1119,8 +1121,9 @@ merge_once (int run_index[], int run_length[], int n_runs) buffered[min] = min (records_per_buffer, run_length[min]); for (j = 0; j < buffered[min]; j++) if ((int) fread (x[j + ofs]->record, sizeof (union value), - default_dict.nval, handle[min]) - != default_dict.nval) + dict_get_value_cnt (default_dict), + handle[min]) + != dict_get_value_cnt (default_dict)) { sprintf (tmp_extname, "%08x", run_index[min]); if (ferror (handle[min])) @@ -1213,7 +1216,7 @@ lossage: /* Reads all the records from the source stream and passes them to write_case(). */ -void +static void sort_stream_read (void) { read_sort_output (write_case); @@ -1357,7 +1360,7 @@ sort_stream_write (void) } /* Switches mode from sink to source. */ -void +static void sort_stream_mode (void) { /* If this is not done, then we get the following source/sink pairs: