]> mj.ucw.cz Git - libucw.git/commitdiff
Remember size of the input file.
authorMartin Mares <mj@ucw.cz>
Fri, 9 Feb 2007 21:10:36 +0000 (22:10 +0100)
committerMartin Mares <mj@ucw.cz>
Fri, 9 Feb 2007 21:10:36 +0000 (22:10 +0100)
lib/sorter/common.h
lib/sorter/govern.c
lib/sorter/sorter.h

index 74e648d62c0b4e40923a5e162a3a77bca9b9c22a..5e71be66e0f18cfb316660237f411ee01b26bb9a 100644 (file)
@@ -32,6 +32,7 @@ struct sort_context {
   struct fastbuf *in_fb;
   struct fastbuf *out_fb;
   uns hash_bits;
+  u64 in_size;
 
   struct mempool *pool;
   clist bucket_list;
index d8006e423ea7118f4d46a70d358517133a56a3c1..3aed985f13748918ad9a8f451697f666d0d49e7d 100644 (file)
@@ -134,7 +134,6 @@ sorter_run(struct sort_context *ctx)
   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
@@ -145,9 +144,10 @@ sorter_run(struct sort_context *ctx)
   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);
index 367f36115e1556884ccab7984404cd97a5eb8994..d9ae7a00db4572bbd09d92810e53d7c6458b1856 100644 (file)
@@ -68,7 +68,8 @@
  *  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:
@@ -200,11 +196,17 @@ static struct fastbuf *P(sort)(
 
 #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