ctx->pool = mp_new(4096);
clist_init(&ctx->bucket_list);
- /* FIXME: There should be a way how to detect size of the input file */
/* FIXME: Remember to test sorting of empty files */
// Create bucket containing the source
else
bin->fb = ctx->in_fb;
bin->ident = "in";
- bin->size = ~(u64)0;
+ bin->size = ctx->in_size;
bin->hash_bits = ctx->hash_bits;
clist_add_tail(&ctx->bucket_list, &bin->n);
+ SORT_XTRACE(2, "Input size: %s", (ctx->in_size == ~(u64)0 ? (byte*)"unknown" : F_BSIZE(bin)));
// Create bucket for the output
struct sort_bucket *bout = sbuck_new(ctx);
* Input (choose one of these):
*
* SORT_INPUT_FILE file of a given name
- * SORT_INPUT_FB fastbuf stream
+ * SORT_INPUT_FB seekable fastbuf stream
+ * SORT_INPUT_PIPE non-seekable fastbuf stream
* SORT_INPUT_PRESORT custom presorter. Calls function
* int PREFIX_presort(struct fastbuf *dest, void *buf, size_t bufsize);
* to get successive batches of pre-sorted data.
*
* SORT_UNIQUE all items have distinct keys (checked in debug mode)
*
- * FIXME: Maybe implement these:
- * ??? SORT_DELETE_INPUT a C expression, if true, the input files are
- * deleted as soon as possible
- * ??? SORT_ALIGNED
- *
* The function generated:
*
* <outfb> PREFIX_SORT(<in>, <out> [,<range>]), where:
#ifdef SORT_INPUT_FILE
ctx.in_fb = bopen(in, O_RDONLY, sorter_stream_bufsize);
+ ctx.in_size = bfilesize(ctx.in_fb);
#elif defined(SORT_INPUT_FB)
ctx.in_fb = in;
+ ctx.in_size = bfilesize(in);
+#elif defined(SORT_INPUT_PIPE)
+ ctx.in_fb = in;
+ ctx.in_size = ~(u64)0;
#elif defined(SORT_INPUT_PRESORT)
ASSERT(!in);
ctx.custom_presort = P(presort);
+ ctx.in_size = ~(u64)0;
#else
#error No input given.
#endif