* 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
* 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
{
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);
#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);