X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fkcompare.c;h=00050c72e34d5757d69faef08475ba43a31fc0ab;hb=c33ea56e3771c3b80ba66ef8fda3a09cad171ebb;hp=e874af18cacdb63df776717ff46d2336a504d70c;hpb=2e4e9c6def27f1e1463dcb6f205fab6a98054f38;p=idzebra-moved-to-github.git diff --git a/index/kcompare.c b/index/kcompare.c index e874af1..00050c7 100644 --- a/index/kcompare.c +++ b/index/kcompare.c @@ -1,6 +1,6 @@ -/* $Id: kcompare.c,v 1.47 2004-08-04 08:35:23 adam Exp $ - Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 - Index Data Aps +/* $Id: kcompare.c,v 1.61 2006-08-16 13:16:36 adam Exp $ + Copyright (C) 1995-2006 + Index Data ApS This file is part of the Zebra server. @@ -15,9 +15,9 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Zebra; see the file LICENSE.zebra. If not, write to the -Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ #include @@ -27,19 +27,19 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "index.h" -#if IT_KEY_NEW -#define INT_CODEC_NEW 1 +#ifdef __GNUC__ +#define CODEC_INLINE inline #else -#define INT_CODEC_NEW 0 +#define CODEC_INLINE #endif -#define CODEC_INLINE inline -void key_logdump_txt (int logmask, const void *p, const char *txt) +void key_logdump_txt(int logmask, const void *p, const char *txt) { struct it_key key; + if (!txt) + txt = "(none)"; if (p) { -#if IT_KEY_NEW char formstr[128]; int i; @@ -48,33 +48,27 @@ void key_logdump_txt (int logmask, const void *p, const char *txt) *formstr = '\0'; for (i = 0; ilen; if (((struct it_key *) p2)->len > l) l = ((struct it_key *) p2)->len; - assert (l <= 4 && l > 0); + assert (l <= IT_KEY_LEVEL_MAX && l > 0); for (i = 0; i < l; i++) { if (((struct it_key *) p1)->mem[i] != ((struct it_key *) p2)->mem[i]) @@ -85,46 +79,25 @@ int key_compare_it (const void *p1, const void *p2) 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) - return 2; - else - return -2; - } - if (((struct it_key *) p1)->seqno != ((struct it_key *) p2)->seqno) - { - if (((struct it_key *) p1)->seqno > ((struct it_key *) p2)->seqno) - return 1; - 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; + int i, l; memcpy (&i1, p1, sizeof(i1)); memcpy (&i2, p2, sizeof(i2)); -#if IT_KEY_NEW - int i, l = i1.len; + l = i1.len; if (i2.len > l) l = i2.len; - assert (l <= 4 && l > 0); + assert (l <= IT_KEY_LEVEL_MAX && l > 0); for (i = 0; i < l; i++) { if (i1.mem[i] != i2.mem[i]) @@ -135,34 +108,21 @@ int key_compare (const void *p1, const void *p2) return i-l; } } -#else - if (i1.sysno != i2.sysno) - { - if (i1.sysno > i2.sysno) - return 2; - else - return -2; - } - if (i1.seqno != i2.seqno) - { - if (i1.seqno > i2.seqno) - return 1; - else - return -1; - } -#endif return 0; } -int key_get_seq(const void *p) +zint key_get_seq(const void *p) { struct it_key k; memcpy (&k, p, sizeof(k)); -#if IT_KEY_NEW return k.mem[k.len-1]; -#else - return k.seqno; -#endif +} + +zint key_get_segment(const void *p) +{ + struct it_key k; + memcpy (&k, p, sizeof(k)); + return k.mem[k.len-2]; } int key_qsort_compare (const void *p1, const void *p2) @@ -192,28 +152,21 @@ void *iscz1_start (void) return p; } -#if IT_KEY_NEW void key_init(struct it_key *key) { int i; key->len = 0; - for (i = 0; imem[i] = 0; } -#endif void iscz1_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++) + 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) @@ -221,7 +174,6 @@ void iscz1_stop (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) { @@ -229,10 +181,10 @@ static CODEC_INLINE void iscz1_encode_int (zint d, char **dst) while (d > 127) { - *bp++ = 128 | (d & 127); + *bp++ = (unsigned) (128 | (d & 127)); d = d >> 7; } - *bp++ = d; + *bp++ = (unsigned) d; *dst = (char *) bp; } @@ -251,73 +203,13 @@ static CODEC_INLINE zint iscz1_decode_int (unsigned char **src) d += ((zint) 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; - - if (d <= 63) - *bp++ = d; - else if (d <= 16383) - { - *bp++ = 64 | (d>>8); - *bp++ = d & 255; - } - else if (d <= 4194303) - { - *bp++ = 128 | (d>>16); - *bp++ = (d>>8) & 255; - *bp++ = d & 255; - } - else - { - *bp++ = 192 | (d>>24); - *bp++ = (d>>16) & 255; - *bp++ = (d>>8) & 255; - *bp++ = d & 255; - } - *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)++; - switch (c & 192) - { - case 0: - return c; - case 64: - return ((c & 63) << 8) + *(*src)++; - case 128: - c = ((c & 63) << 8) + *(*src)++; - c = (c << 8) + *(*src)++; - return c; - } - if (c&32) /* expand sign bit to high bits */ - c = ((c | 63) << 8) + *(*src)++; - else - c = ((c & 63) << 8) + *(*src)++; - c = (c << 8) + *(*src)++; - c = (c << 8) + *(*src)++; - - return c; -} -#endif void iscz1_encode (void *vp, char **dst, const 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 @@ -328,10 +220,10 @@ void iscz1_encode (void *vp, char **dst, const char **src) 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); + assert(tkey.len > 0 && tkey.len <= IT_KEY_LEVEL_MAX); for (i = 0; i < tkey.len; i++) { d = tkey.mem[i] - p->key.mem[i]; @@ -358,35 +250,14 @@ void iscz1_encode (void *vp, char **dst, const char **src) 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; - } - 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); + + int leader = (int) iscz1_decode_int ((unsigned char **) src); i = leader & 7; if (leader & 64) p->key.mem[i] += iscz1_decode_int ((unsigned char **) src); @@ -397,18 +268,6 @@ void iscz1_decode (void *vp, char **dst, const char **src) 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); - } - 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) @@ -431,7 +290,7 @@ ISAMS_M *key_isams_m (Res res, ISAMS_M *me) ISAMC_M *key_isamc_m (Res res, ISAMC_M *me) { - isc_getmethod (me); + isamc_getmethod (me); me->compare_item = key_compare; me->log_item = key_logdump_txt; @@ -486,3 +345,11 @@ int key_SU_decode (int *ch, const unsigned char *out) return len; } +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +