]> mj.ucw.cz Git - libucw.git/blobdiff - lib/sorter/sorter.h
Remember size of the input file.
[libucw.git] / lib / sorter / sorter.h
index a380bec786bea3d50660e8624b0905d751a377c0..d9ae7a00db4572bbd09d92810e53d7c6458b1856 100644 (file)
  *  Unification:
  *
  *  SORT_UNIFY         merge items with identical keys, needs the following functions:
  *  Unification:
  *
  *  SORT_UNIFY         merge items with identical keys, needs the following functions:
- *  void PREFIX_write_merged(struct fastbuf *f, SORT_KEY **keys, uns n, byte *buf)
+ *  void PREFIX_write_merged(struct fastbuf *f, SORT_KEY **keys, void **data, uns n, void *buf)
  *                     takes n records in memory with keys which compare equal and writes
  *                     takes n records in memory with keys which compare equal and writes
- *                     a single record to the given fastbuf. Data for each key can
- *                     be accessed by the SORT_GET_DATA(*key) macro. `buf' points
- *                     to a buffer which is guaranteed to hold all given records.
+ *                     a single record to the given fastbuf. `buf' points to a buffer which
+ *                     is guaranteed to hold all given records.
  *  void PREFIX_copy_merged(SORT_KEY **keys, struct fastbuf **data, uns n, struct fastbuf *dest)
  *                     takes n records with keys in memory and data in fastbufs and writes
  *                     a single record.
  *  void PREFIX_copy_merged(SORT_KEY **keys, struct fastbuf **data, uns n, struct fastbuf *dest)
  *                     takes n records with keys in memory and data in fastbufs and writes
  *                     a single record.
  *  Input (choose one of these):
  *
  *  SORT_INPUT_FILE    file of a given name
  *  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
  *  SORT_INPUT_PRESORT custom presorter. Calls function
- *  int PREFIX_presort(struct fastbuf *dest, byte *buf, size_t bufsize);
+ *  int PREFIX_presort(struct fastbuf *dest, void *buf, size_t bufsize);
  *                     to get successive batches of pre-sorted data.
  *                     The function is passed a page-aligned presorting buffer.
  *                     It returns 1 on success or 0 on EOF.
  *                     to get successive batches of pre-sorted data.
  *                     The function is passed a page-aligned presorting buffer.
  *                     It returns 1 on success or 0 on EOF.
  *
  *  SORT_UNIQUE                all items have distinct keys (checked in debug mode)
  *
  *
  *  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:
  *  The function generated:
  *
  *  <outfb> PREFIX_SORT(<in>, <out> [,<range>]), where:
@@ -169,7 +164,7 @@ static inline int P(hash) (P(key) *x)
 
 static inline void P(copy_data)(P(key) *key, struct fastbuf *in, struct fastbuf *out)
 {
 
 static inline void P(copy_data)(P(key) *key, struct fastbuf *in, struct fastbuf *out)
 {
-  bwrite(out, key, sizeof(P(key)));
+  P(write_key)(out, key);
 #ifdef SORT_VAR_DATA
   bbcopy(in, out, SORT_DATA_SIZE(*key));
 #else
 #ifdef SORT_VAR_DATA
   bbcopy(in, out, SORT_DATA_SIZE(*key));
 #else
@@ -201,11 +196,17 @@ static struct fastbuf *P(sort)(
 
 #ifdef SORT_INPUT_FILE
   ctx.in_fb = bopen(in, O_RDONLY, sorter_stream_bufsize);
 
 #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;
 #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);
 #elif defined(SORT_INPUT_PRESORT)
   ASSERT(!in);
   ctx.custom_presort = P(presort);
+  ctx.in_size = ~(u64)0;
 #else
 #error No input given.
 #endif
 #else
 #error No input given.
 #endif
@@ -243,6 +244,7 @@ static struct fastbuf *P(sort)(
   return ctx.out_fb;
 }
 
   return ctx.out_fb;
 }
 
+#undef SORT_PREFIX
 #undef SORT_KEY
 #undef SORT_KEY_REGULAR
 #undef SORT_KEY_SIZE
 #undef SORT_KEY
 #undef SORT_KEY_REGULAR
 #undef SORT_KEY_SIZE