X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fsorter.h;h=d1f059fccec58f0240748dc7dc0777cb78eaa27d;hb=9fbdf10b4915874aad2eb98087293e5c721d3eb2;hp=be2e80a33b12dade3daffafc9683626998d7b5c0;hpb=78d7afe64ca18c0cf679aec89d611641f5cbe872;p=libucw.git diff --git a/lib/sorter.h b/lib/sorter.h index be2e80a3..d1f059fc 100644 --- a/lib/sorter.h +++ b/lib/sorter.h @@ -21,6 +21,8 @@ * deleted as soon as possible * SORT_INPUT_FILE input is a file with this name * SORT_INPUT_FB input is a fastbuf stream + * (can be safely NULL if you want to treat original + * input in a different way by file read functions) * SORT_INPUT_FBPAIR input is a pair of fastbuf streams * (not supported by the presorter) * SORT_OUTPUT_FILE output is a file with this name @@ -46,9 +48,11 @@ * fetch data belonging to a just fetched key and store * them to memory following the key, but not over limit. * Returns a pointer to first byte after the data - * or NULL if the data don't fit. - * Important: keys carrying no data must be position - * independent. + * or NULL if the data don't fit. For variable-length + * keys, it can use the rest of SORT_KEY and even return + * pointer before end of the key. + * Important: before PREFIX_fetch_item() succeeds, the key + * must be position independent, the sorter can copy it. * void PREFIX_store_item(struct fastbuf *f, SORT_KEY *k) * [used only with SORT_PRESORT] * write key and all its data read with PREFIX_fetch_data @@ -159,7 +163,7 @@ P(pass)(struct fastbuf **fb1, struct fastbuf **fb2) { P(merge_data)(in1, in2, out1, kin1, kin2); SWAP(kin1, kprev1, ktmp); - next1 = P(fetch_key)(in1, kin1); /* FIXME: Re-use other code? */ + next1 = P(fetch_key)(in1, kin1); run1 = next1 && (P(compare)(kprev1, kin1) LESS 0); SWAP(kin2, kprev2, ktmp); next2 = P(fetch_key)(in2, kin2); @@ -372,14 +376,14 @@ struct fastbuf *fb1, struct fastbuf *fb2 #ifdef SORT_INPUT_FILE struct fastbuf *fb1, *fb2; fb1 = bopen(inname, O_RDONLY, sorter_stream_bufsize); -#ifdef SORT_DELETE_INPUT - fb1->is_temp_file = SORT_DELETE_INPUT; -#endif fb2 = NULL; #elif defined(SORT_INPUT_FB) struct fastbuf *fb2 = NULL; #endif +#ifdef SORT_DELETE_INPUT + fb1->is_temp_file = SORT_DELETE_INPUT; +#endif sorter_pass_counter = 1; #ifdef SORT_PRESORT P(presort)(&fb1, &fb2);