+ reckeys.buf_used = dst - reckeys.buf;
+}
+
+static void flushRecordKeys (SYSNO sysno, int cmd, struct recKeys *reckeys,
+ const char *databaseName)
+{
+ int off = 0;
+ while (off < reckeys->buf_used)
+ {
+ const char *src = reckeys->buf + off;
+ char attrSet;
+ short attrUse;
+ struct it_key key;
+
+ memcpy (&attrSet, src, sizeof(attrSet));
+ src += sizeof(attrSet);
+
+ memcpy (&attrUse, src, sizeof(attrUse));
+ src += sizeof(attrUse);
+
+ if (key_buf_used + 1024 > (ptr_top-ptr_i)*sizeof(char*))
+ key_flush ();
+ ++ptr_i;
+ key_buf[ptr_top-ptr_i] = (char*)key_buf + key_buf_used;
+ key_buf_used += index_word_prefix ((char*)key_buf + key_buf_used,
+ attrSet, attrUse, databaseName);
+ while (*src)
+ ((char*)key_buf) [key_buf_used++] = index_char_cvt (*src++);
+ src++;
+ ((char*)key_buf) [key_buf_used++] = '\0';
+
+ ((char*) key_buf)[key_buf_used++] = cmd;
+
+ memcpy (&key.seqno, src, sizeof(key.seqno));
+ src += sizeof(key.seqno);
+ key.sysno = sysno;
+ memcpy ((char*)key_buf + key_buf_used, &key, sizeof(key));
+ key_buf_used += sizeof(key);
+ off = src - reckeys->buf;
+ }
+ assert (off == reckeys->buf_used);
+}
+
+static const char **searchRecordKey (struct recKeys *reckeys,
+ int attrSetS, int attrUseS)
+{
+ static const char *ws[32];
+ int off = 0;
+ int startSeq = -1;
+ int i;
+
+ for (i = 0; i<32; i++)
+ ws[i] = NULL;
+
+ while (off < reckeys->buf_used)
+ {
+ const char *src = reckeys->buf + off;
+ char attrSet;
+ short attrUse;
+ int seqno;
+ const char *wstart;
+
+ memcpy (&attrSet, src, sizeof(attrSet));
+ src += sizeof(attrSet);
+
+ memcpy (&attrUse, src, sizeof(attrUse));
+ src += sizeof(attrUse);
+
+ wstart = src;
+ while (*src++)
+ ;
+
+ memcpy (&seqno, src, sizeof(seqno));
+ src += sizeof(seqno);
+
+#if 0
+ logf (LOG_LOG, "(%d,%d) %d %s", attrSet, attrUse, seqno, wstart);
+#endif
+ if (attrUseS == attrUse && attrSetS == attrSet)
+ {
+ int woff;
+
+
+ if (startSeq == -1)
+ startSeq = seqno;
+ woff = seqno - startSeq;
+ if (woff >= 0 && woff < 31)
+ ws[woff] = wstart;
+ }
+
+ off = src - reckeys->buf;
+ }
+ assert (off == reckeys->buf_used);
+ return ws;
+}
+
+static void addRecordKeyAny (const RecWord *p)
+{
+ if (p->attrSet != 1 || p->attrUse != 1016)
+ {
+ RecWord w;
+
+ memcpy (&w, p, sizeof(w));
+ w.attrSet = 1;
+ w.attrUse = 1016;
+ addRecordKey (&w);
+ }
+ addRecordKey (p);
+}
+
+static char *file_buf;
+static int file_offset;
+static int file_bufsize;
+
+static void file_read_start (int fd)
+{
+ file_offset = 0;
+ file_buf = xmalloc (4096);
+ file_bufsize = read (fd, file_buf, 4096);
+}
+
+static void file_read_stop (int fd)
+{
+ xfree (file_buf);
+}
+
+static int file_read (int fd, char *buf, size_t count)
+{
+ int l = file_bufsize - file_offset;
+
+ if (count > l)