+ iscz1_encode(keys->codec_handle, &dst, &src);
+
+#if REG_TYPE_PREFIX
+ *dst++ = reg_type;
+#endif
+ memcpy (dst, str, slen);
+ dst += slen;
+ *dst++ = '\0';
+ keys->buf_used = dst - keys->buf;
+}
+#endif
+
+ZEBRA_RES zebra_snippets_rec_keys(ZebraHandle zh,
+#if NEW_REC_KEYS
+ zebra_rec_keys_t reckeys,
+#else
+ struct recKeys *reckeys,
+#endif
+ zebra_snippets *snippets)
+{
+ NMEM nmem = nmem_create();
+
+#if NEW_REC_KEYS
+ if (zebra_rec_keys_rewind(reckeys))
+ {
+ const char *str;
+ size_t slen;
+ struct it_key key;
+ while (zebra_rec_keys_read(reckeys, &str, &slen, &key))
+ {
+ char dst_buf[IT_MAX_WORD];
+ char *dst_term = dst_buf;
+ int ord, seqno;
+ int index_type;
+ assert(key.len <= 4 && key.len > 2);
+ seqno = (int) key.mem[key.len-1];
+ ord = key.mem[0];
+
+ zebraExplain_lookup_ord(zh->reg->zei, ord, &index_type,
+ 0/* db */, 0/* set */, 0/* use */);
+ assert(index_type);
+ zebra_term_untrans_iconv(zh, nmem, index_type,
+ &dst_term, str);
+ zebra_snippets_append(snippets, seqno, ord, dst_term);
+ nmem_reset(nmem);
+ }
+ }
+#else
+ int off = 0;
+ int seqno = 0;
+ void *decode_handle = iscz1_start();
+ assert(reckeys->buf);
+ while (off < reckeys->buf_used)
+ {
+ const char *src = reckeys->buf + off;
+ struct it_key key;
+ char *dst = (char*) &key;
+ char dst_buf[IT_MAX_WORD];
+ char *dst_term = dst_buf;
+ int index_type = 0, ord;
+
+ iscz1_decode(decode_handle, &dst, &src);
+ assert(key.len <= 4 && key.len > 2);
+
+ seqno = (int) key.mem[key.len-1];
+ ord = key.mem[0];
+
+ zebraExplain_lookup_ord(zh->reg->zei, ord, &index_type,
+ 0/* db */, 0/* set */, 0/* use */);
+ assert(index_type);
+ zebra_term_untrans_iconv(zh, nmem, index_type,
+ &dst_term, src);
+ zebra_snippets_append(snippets, seqno, ord, dst_term);
+ while (*src++)
+ ;
+ off = src - reckeys->buf;
+ nmem_reset(nmem);
+ }
+ iscz1_stop(decode_handle);
+#endif
+ nmem_destroy(nmem);
+ return ZEBRA_OK;
+}
+
+void print_rec_keys(ZebraHandle zh,
+#if NEW_REC_KEYS
+ zebra_rec_keys_t reckeys
+#else
+ struct recKeys *reckeys
+#endif
+)
+{
+#if NEW_REC_KEYS
+ yaz_log(YLOG_LOG, "print_rec_keys");
+ if (zebra_rec_keys_rewind(reckeys))
+ {
+ const char *str;
+ size_t slen;
+ struct it_key key;
+ while (zebra_rec_keys_read(reckeys, &str, &slen, &key))
+ {
+ char dst_buf[IT_MAX_WORD];
+ int seqno;
+ int index_type;
+ const char *db = 0;
+ assert(key.len <= 4 && key.len > 2);
+
+ zebraExplain_lookup_ord(zh->reg->zei,
+ key.mem[0], &index_type, &db, 0, 0);
+
+ seqno = (int) key.mem[key.len-1];
+
+ zebra_term_untrans(zh, index_type, dst_buf, str);
+
+ yaz_log(YLOG_LOG, "ord=" ZINT_FORMAT " seqno=%d term=%s",
+ key.mem[0], seqno, dst_buf);
+ }
+ }
+#else
+ int off = 0;
+ int seqno = 0;
+ void *decode_handle = iscz1_start();
+ yaz_log(YLOG_LOG, "print_rec_keys buf=%p sz=%d", reckeys->buf,
+ reckeys->buf_used);
+ assert(reckeys->buf);
+ while (off < reckeys->buf_used)
+ {
+ const char *src = reckeys->buf + off;
+ struct it_key key;
+ char *dst = (char*) &key;
+ char dst_buf[IT_MAX_WORD];
+ int index_type;
+ const char *db = 0;
+
+ iscz1_decode(decode_handle, &dst, &src);
+ assert(key.len <= 4 && key.len > 2);
+
+ seqno = (int) key.mem[key.len-1];
+
+ zebraExplain_lookup_ord(zh->reg->zei,
+ key.mem[0], &index_type, &db, 0, 0);
+
+ zebra_term_untrans(zh, index_type, dst_buf, src);
+
+ yaz_log(YLOG_LOG, "ord=" ZINT_FORMAT " seqno=%d term=%s",
+ key.mem[0], seqno, dst_buf);
+ while (*src++)
+ ;
+ off = src - reckeys->buf;
+ }
+ iscz1_stop(decode_handle);
+#endif
+}
+
+void extract_add_index_string (RecWord *p, const char *str, int length)
+{
+ struct it_key key;
+
+ ZebraHandle zh = p->extractCtrl->handle;
+ ZebraExplainInfo zei = zh->reg->zei;
+ int ch;
+
+ if (p->index_name)
+ {
+ ch = zebraExplain_lookup_attr_str(zei, p->index_type, p->index_name);
+ if (ch < 0)
+ ch = zebraExplain_add_attr_str(zei, p->index_type, p->index_name);
+ }
+ else
+ {
+#if NATTR
+ return;
+#else
+ ch = zebraExplain_lookup_attr_su(zei, p->index_type,
+ p->attrSet, p->attrUse);
+ if (ch < 0)
+ ch = zebraExplain_add_attr_su(zei, p->index_type,
+ p->attrSet, p->attrUse);
+#endif
+ }
+ key.len = 4;
+ key.mem[0] = ch;
+ key.mem[1] = p->record_id;
+ key.mem[2] = p->section_id;
+ key.mem[3] = p->seqno;