X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fsorter.h;h=ed82eb34893fad81c80350a06975d264267b56da;hb=bed5fbc254249bffa909516d82091ff68b1a5b63;hp=b3110c5ae026769aab2688f2cb42a92a423ef2e9;hpb=f402f3167f83d81d672261a618483570a433f367;p=libucw.git diff --git a/lib/sorter.h b/lib/sorter.h index b3110c5a..ed82eb34 100644 --- a/lib/sorter.h +++ b/lib/sorter.h @@ -1,5 +1,5 @@ /* - * Sherlock Library -- Universal Sorter + * UCW Library -- Universal Sorter * * (c) 2001--2004 Martin Mares * (c) 2004 Robert Spalek @@ -50,7 +50,7 @@ * int PREFIX_compare(SORT_KEY *a, *b) * compare two keys, result like strcmp * int PREFIX_fetch_key(struct fastbuf *f, SORT_KEY *k) - * fetch next key, returns 1=ok, 0=eof + * fetch next key, returns nonzero=ok, 0=eof * void PREFIX_copy_data(struct fastbuf *src, *dest, SORT_KEY *k) * write just fetched key k to dest and copy all data * belonging to this key from src to dest. @@ -85,23 +85,7 @@ * undef'd. */ -/* Declarations of externals from sorter.c */ - -#ifndef SORT_DECLS_READ -#define SORT_DECLS_READ - -extern uns sorter_trace; -extern uns sorter_presort_bufsize; -extern uns sorter_stream_bufsize; - -extern uns sorter_pass_counter; - -#endif /* !SORT_DECLS_READ */ - -/* The sorter proper */ - -#ifndef SORT_DECLARE_ONLY - +#include "lib/sorter-globals.h" #include "lib/fastbuf.h" #include #include @@ -279,7 +263,7 @@ P(presort)(struct fastbuf **fb1, struct fastbuf **fb2) struct fastbuf *tbuf; uns buf_items = sorter_presort_bufsize / sizeof(SORT_KEY); uns run_count = 0; - SORT_KEY last_out, *array; + SORT_KEY last_out = { }, *array; ASSERT(!*fb2); if (buf_items < 2) @@ -304,7 +288,7 @@ P(presort)(struct fastbuf **fb1, struct fastbuf **fb2) { run_count++; #ifdef SORT_UP_TO - if (sorter_presort_bufsize < SORT_UP_TO) + if (sorter_presort_bufsize < (uns) SORT_UP_TO) #endif SWAP(out1, out2, tbuf); if (!out1) @@ -417,7 +401,7 @@ P(presort)(struct fastbuf **fb1, struct fastbuf **fb2) } for(;;) { - current = (byte *) ALIGN((addr_int_t) current, CPU_STRUCT_ALIGN); + current = (byte *) ALIGN_TO((addr_int_t) current, CPU_STRUCT_ALIGN); if (current + sizeof(*this) > bufend) break; this = (SORT_NODE *) current; @@ -531,15 +515,20 @@ struct fastbuf *fb1, struct fastbuf *fb2 do P(pass)(&fb1, &fb2); while (fb1 && fb2); #else { - sh_off_t run_count = ~0U, max_run_count = 0; + sh_off_t run_count, max_run_count = 0; if (fb1) max_run_count += bfilesize(fb1); if (fb2) max_run_count += bfilesize(fb2); +#ifdef SORT_PRESORT + run_count = max_run_count / sorter_presort_bufsize; +#else + run_count = max_run_count; +#endif if (SORT_UP_TO) max_run_count /= SORT_UP_TO; do - run_count = P(pass)(&fb1, &fb2, run_count < max_run_count); + run_count = P(pass)(&fb1, &fb2, (run_count+1)/2 <= max_run_count); while (fb1 && fb2); } #endif @@ -574,5 +563,3 @@ struct fastbuf *fb1, struct fastbuf *fb2 #undef SORT_OUTPUT_FB #undef SORT_PRESORT #undef SORT_UP_TO - -#endif /* !SORT_DECLARE_ONLY */