-/* $Id: kcompare.c,v 1.48 2004-08-04 09:00:00 adam Exp $
+/* $Id: kcompare.c,v 1.46.2.1 2004-08-06 09:30:57 adam Exp $
Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
Index Data Aps
#include "index.h"
-#if IT_KEY_NEW
-#define INT_CODEC_NEW 1
-#else
#define INT_CODEC_NEW 0
+#ifdef __GNUC__
+#define CODEC_INLINE inline
+#else
+#define CODEC_INLINE inline
#endif
-#define CODEC_INLINE inline
void key_logdump_txt (int logmask, const void *p, const char *txt)
{
struct it_key key;
if (p)
{
-#if IT_KEY_NEW
- char formstr[128];
- int i;
-
- memcpy (&key, p, sizeof(key));
- assert(key.len > 0 && key.len <= IT_KEY_LEVEL_MAX);
- *formstr = '\0';
- for (i = 0; i<key.len; i++)
- {
- sprintf(formstr + strlen(formstr), ZINT_FORMAT, key.mem[i]);
- if (i)
- strcat(formstr, " ");
- }
- logf (logmask, "%s %s", formstr, txt);
-#else
-/* !IT_KEY_NEW */
memcpy (&key, p, sizeof(key));
- logf (logmask, "%7d:%-4d %s", key.sysno, key.seqno, txt);
-#endif
+ logf (logmask, "%7d:%-4d %s", key.sysno, key.seqno,txt);
}
else
logf(logmask, " (null) %s",txt);
void key_logdump (int logmask, const void *p)
{
- key_logdump_txt(logmask, p, "");
+ key_logdump_txt(logmask,p,"");
}
int key_compare_it (const void *p1, const void *p2)
{
-#if IT_KEY_NEW
- int i, l = ((struct it_key *) p1)->len;
- if (((struct it_key *) p2)->len > l)
- l = ((struct it_key *) p2)->len;
- assert (l <= 4 && l > 0);
- for (i = 0; i < l; i++)
- {
- if (((struct it_key *) p1)->mem[i] != ((struct it_key *) p2)->mem[i])
- {
- if (((struct it_key *) p1)->mem[i] > ((struct it_key *) p2)->mem[i])
- return l-i;
- else
- return i-l;
- }
- }
-#else
if (((struct it_key *) p1)->sysno != ((struct it_key *) p2)->sysno)
{
if (((struct it_key *) p1)->sysno > ((struct it_key *) p2)->sysno)
else
return -1;
}
-#endif
return 0;
}
char *key_print_it (const void *p, char *buf)
{
-#if IT_KEY_NEW
- strcpy(buf, "");
-#else
const struct it_key *i = p;
sprintf (buf, "%d:%d", i->sysno, i->seqno);
-#endif
return buf;
}
int key_compare (const void *p1, const void *p2)
{
struct it_key i1, i2;
-#if IT_KEY_NEW
- int i, l;
-#endif
memcpy (&i1, p1, sizeof(i1));
memcpy (&i2, p2, sizeof(i2));
-#if IT_KEY_NEW
- l = i1.len;
- if (i2.len > l)
- l = i2.len;
- assert (l <= 4 && l > 0);
- for (i = 0; i < l; i++)
- {
- if (i1.mem[i] != i2.mem[i])
- {
- if (i1.mem[i] > i2.mem[i])
- return l-i;
- else
- return i-l;
- }
- }
-#else
if (i1.sysno != i2.sysno)
{
if (i1.sysno > i2.sysno)
else
return -1;
}
-#endif
return 0;
}
{
struct it_key k;
memcpy (&k, p, sizeof(k));
-#if IT_KEY_NEW
- return k.mem[k.len-1];
-#else
return k.seqno;
-#endif
}
int key_qsort_compare (const void *p1, const void *p2)
struct it_key key;
};
-void *iscz1_start (void)
+void *iscz1_code_start (int mode)
{
struct iscz1_code_info *p = (struct iscz1_code_info *)
xmalloc (sizeof(*p));
- iscz1_reset(p);
+ p->key.sysno = 0;
+ p->key.seqno = 0;
return p;
}
-#if IT_KEY_NEW
-void key_init(struct it_key *key)
-{
- int i;
- key->len = 0;
- for (i = 0; i<IT_KEY_LEVEL_MAX; i++)
- key->mem[i] = 0;
-}
-#endif
-
-void iscz1_reset (void *vp)
+void iscz1_code_reset (void *vp)
{
struct iscz1_code_info *p = (struct iscz1_code_info *) vp;
-#if IT_KEY_NEW
- int i;
- p->key.len = 0;
- for (i = 0; i< IT_KEY_LEVEL_MAX; i++)
- p->key.mem[i] = 0;
-#else
p->key.sysno = 0;
p->key.seqno = 0;
-#endif
}
-void iscz1_stop (void *p)
+void iscz1_code_stop (int mode, void *p)
{
xfree (p);
}
-#if INT_CODEC_NEW
-/* small encoder that works with unsigneds of any length */
-static CODEC_INLINE void iscz1_encode_int (zint d, char **dst)
+#if INT_CODEC_NEW
+static CODEC_INLINE void iscz1_encode_int (unsigned d, char **dst)
{
unsigned char *bp = (unsigned char*) *dst;
*dst = (char *) bp;
}
-/* small decoder that works with unsigneds of any length */
-static CODEC_INLINE zint iscz1_decode_int (unsigned char **src)
+static CODEC_INLINE int iscz1_decode_int (unsigned char **src)
{
- zint d = 0;
+ unsigned d = 0;
unsigned char c;
unsigned r = 0;
while (((c = *(*src)++) & 128))
{
- d += ((zint) (c&127) << r);
+ d += ((c&127) << r);
r += 7;
}
- d += ((zint) c << r);
+ d += (c << r);
return d;
}
#else
/* ! INT_CODEC_NEW */
-/* old encoder that works with unsigneds up to 30 bits */
static CODEC_INLINE void iscz1_encode_int (unsigned d, char **dst)
{
unsigned char *bp = (unsigned char*) *dst;
*dst = (char *) bp;
}
-/* old decoder that works with unsigneds up to 30 bits */
static CODEC_INLINE int iscz1_decode_int (unsigned char **src)
{
unsigned c = *(*src)++;
}
#endif
-void iscz1_encode (void *vp, char **dst, const char **src)
+void iscz1_code_item (int mode, void *vp, char **dst, char **src)
{
struct iscz1_code_info *p = (struct iscz1_code_info *) vp;
struct it_key tkey;
-#if IT_KEY_NEW
- zint d;
- int i;
-#else
int d;
-#endif
- /* 1
- 3, 2, 9, 12
- 3, 2, 10, 2
- 4, 1
-
- if diff is 0, then there is more ...
- if diff is non-zero, then _may_ be more
- */
- memcpy (&tkey, *src, sizeof(struct it_key));
-#if IT_KEY_NEW
- /* deal with leader + delta encoding .. */
- d = 0;
- assert(tkey.len > 0 && tkey.len <= 4);
- for (i = 0; i < tkey.len; i++)
+ if (mode == ISAMC_ENCODE)
{
- d = tkey.mem[i] - p->key.mem[i];
- if (d || i == tkey.len-1)
- { /* all have been equal until now, now make delta .. */
- p->key.mem[i] = tkey.mem[i];
- if (d > 0)
- {
- iscz1_encode_int (i + (tkey.len << 3) + 64, dst);
- i++;
- iscz1_encode_int (d, dst);
- }
- else
- {
- iscz1_encode_int (i + (tkey.len << 3), dst);
- }
- break;
- }
- }
- /* rest uses absolute encoding ... */
- for (; i < tkey.len; i++)
- {
- iscz1_encode_int (tkey.mem[i], dst);
- p->key.mem[i] = tkey.mem[i];
- }
- (*src) += sizeof(struct it_key);
-#else
- d = tkey.sysno - p->key.sysno;
- if (d)
- {
- iscz1_encode_int (2*tkey.seqno + 1, dst);
- iscz1_encode_int (d, dst);
- p->key.sysno += d;
- p->key.seqno = tkey.seqno;
+ memcpy (&tkey, *src, sizeof(struct it_key));
+ d = tkey.sysno - p->key.sysno;
+ if (d)
+ {
+ iscz1_encode_int (2*tkey.seqno + 1, dst);
+ iscz1_encode_int (d, dst);
+ p->key.sysno += d;
+ p->key.seqno = tkey.seqno;
+ }
+ else
+ {
+ iscz1_encode_int (2*(tkey.seqno - p->key.seqno), dst);
+ p->key.seqno = tkey.seqno;
+ }
+ (*src) += sizeof(struct it_key);
}
else
{
- iscz1_encode_int (2*(tkey.seqno - p->key.seqno), dst);
- p->key.seqno = tkey.seqno;
- }
- (*src) += sizeof(struct it_key);
-#endif
-}
-
-void iscz1_decode (void *vp, char **dst, const char **src)
-{
- struct iscz1_code_info *p = (struct iscz1_code_info *) vp;
-#if IT_KEY_NEW
- int i;
-#else
- int d;
-#endif
-
-#if IT_KEY_NEW
- int leader = iscz1_decode_int ((unsigned char **) src);
- i = leader & 7;
- if (leader & 64)
- p->key.mem[i] += iscz1_decode_int ((unsigned char **) src);
- else
- p->key.mem[i] = iscz1_decode_int ((unsigned char **) src);
- p->key.len = (leader >> 3) & 7;
- while (++i < p->key.len)
- p->key.mem[i] = iscz1_decode_int ((unsigned char **) src);
- memcpy (*dst, &p->key, sizeof(struct it_key));
- (*dst) += sizeof(struct it_key);
-#else
- d = iscz1_decode_int ((unsigned char **) src);
- if (d & 1)
- {
- p->key.seqno = d>>1;
- p->key.sysno += iscz1_decode_int ((unsigned char **) src);
+ d = iscz1_decode_int ((unsigned char **) src);
+ if (d & 1)
+ {
+ p->key.seqno = d>>1;
+ p->key.sysno += iscz1_decode_int ((unsigned char **) src);
+ }
+ else
+ p->key.seqno += d>>1;
+ memcpy (*dst, &p->key, sizeof(struct it_key));
+ (*dst) += sizeof(struct it_key);
}
- else
- p->key.seqno += d>>1;
- memcpy (*dst, &p->key, sizeof(struct it_key));
- (*dst) += sizeof(struct it_key);
-#endif
}
ISAMS_M *key_isams_m (Res res, ISAMS_M *me)
me->compare_item = key_compare;
me->log_item = key_logdump_txt;
- me->codec.start = iscz1_start;
- me->codec.decode = iscz1_decode;
- me->codec.encode = iscz1_encode;
- me->codec.stop = iscz1_stop;
- me->codec.reset = iscz1_reset;
+ me->code_start = iscz1_code_start;
+ me->code_item = iscz1_code_item;
+ me->code_stop = iscz1_code_stop;
me->debug = atoi(res_get_def (res, "isamsDebug", "0"));
me->compare_item = key_compare;
me->log_item = key_logdump_txt;
- me->codec.start = iscz1_start;
- me->codec.decode = iscz1_decode;
- me->codec.encode = iscz1_encode;
- me->codec.stop = iscz1_stop;
- me->codec.reset = iscz1_reset;
+ me->code_start = iscz1_code_start;
+ me->code_item = iscz1_code_item;
+ me->code_stop = iscz1_code_stop;
+ me->code_reset = iscz1_code_reset;
me->debug = atoi(res_get_def (res, "isamcDebug", "0"));
return me;
}
+ISAMD_M *key_isamd_m (Res res, ISAMD_M *me)
+{
+ me = isamd_getmethod (me);
+
+ me->compare_item = key_compare;
+ me->log_item = key_logdump_txt;
+
+ me->code_start = iscz1_code_start;
+ me->code_item = iscz1_code_item;
+ me->code_stop = iscz1_code_stop;
+ me->code_reset = iscz1_code_reset;
+
+ me->debug = atoi(res_get_def (res, "isamdDebug", "0"));
+
+ return me;
+}
+
int key_SU_encode (int ch, char *out)
{
int i;