Added better compression.
[idzebra-moved-to-github.git] / index / kcompare.c
index 2d7e720..d592e1d 100644 (file)
@@ -4,7 +4,10 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: kcompare.c,v $
- * Revision 1.18  1996-10-29 14:09:44  adam
+ * Revision 1.19  1996-12-11 12:08:00  adam
+ * Added better compression.
+ *
+ * Revision 1.18  1996/10/29 14:09:44  adam
  * Use of cisam system - enabled if setting isamc is 1.
  *
  * Revision 1.17  1996/06/04 10:18:58  adam
@@ -129,24 +132,24 @@ int key_qsort_compare (const void *p1, const void *p2)
     return cp1[l] - cp2[l];
 }
 
-struct iscz_code_info {
+struct iscz1_code_info {
     struct it_key key;
 };
 
-static void *iscz_code_start (int mode)
+static void *iscz1_code_start (int mode)
 {
-    struct iscz_code_info *p = xmalloc (sizeof(*p));
+    struct iscz1_code_info *p = xmalloc (sizeof(*p));
     p->key.sysno = 0;
     p->key.seqno = 0;
     return p;
 }
 
-static void iscz_code_stop (int mode, void *p)
+static void iscz1_code_stop (int mode, void *p)
 {
     xfree (p);
 }
 
-void iscz_encode_int (unsigned d, char **dst)
+void iscz1_encode_int (unsigned d, char **dst)
 {
     unsigned char *bp = (unsigned char*) *dst;
 
@@ -173,7 +176,7 @@ void iscz_encode_int (unsigned d, char **dst)
     *dst = (char *) bp;
 }
 
-int isxz_decode_int (unsigned char **src)
+int iscz1_decode_int (unsigned char **src)
 {
     unsigned c = *(*src)++;
     switch (c & 192)
@@ -192,10 +195,49 @@ int isxz_decode_int (unsigned char **src)
     c = (c << 8) + *(*src)++;
     return c;
 }
+#if 1
+static void iscz1_code_item (int mode, void *vp, char **dst, char **src)
+{
+    struct iscz1_code_info *p = vp;
+    struct it_key tkey;
+    int d;
 
-static void iscz_code_item (int mode, void *vp, char **dst, char **src)
+    if (mode == ISAMC_ENCODE)
+    {
+        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
+    {
+        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
+static void iscz1_code_item (int mode, void *vp, char **dst, char **src)
 {
-    struct iscz_code_info *p = vp;
+    struct iscz1_code_info *p = vp;
     struct it_key tkey;
     int d;
 
@@ -203,30 +245,31 @@ static void iscz_code_item (int mode, void *vp, char **dst, char **src)
     {
         memcpy (&tkey, *src, sizeof(struct it_key));
         d = tkey.sysno - p->key.sysno;
-        iscz_encode_int (d, dst);
+        iscz1_encode_int (d, dst);
         if (d)
         {
             p->key.sysno = tkey.sysno;
             p->key.seqno = 0;
         }
-        iscz_encode_int (tkey.seqno - p->key.seqno, dst);
+        iscz1_encode_int (tkey.seqno - p->key.seqno, dst);
         p->key.seqno = tkey.seqno;
         (*src) += sizeof(struct it_key);
     }
     else
     {
-        d = isxz_decode_int ((unsigned char **) src);
+        d = iscz1_decode_int ((unsigned char **) src);
         if (d)
         {
             p->key.sysno += d;
             p->key.seqno = 0;
         }
-        d = isxz_decode_int ((unsigned char **) src);
+        d = iscz1_decode_int ((unsigned char **) src);
         p->key.seqno += d;
         memcpy (*dst, &p->key, sizeof(struct it_key));
         (*dst) += sizeof(struct it_key);
     }
 }
+#endif
 
 ISAMC_M key_isamc_m (void)
 {
@@ -239,9 +282,9 @@ ISAMC_M key_isamc_m (void)
 
     me->compare_item = key_compare;
 
-    me->code_start = iscz_code_start;
-    me->code_item = iscz_code_item;
-    me->code_stop = iscz_code_stop;
+    me->code_start = iscz1_code_start;
+    me->code_item = iscz1_code_item;
+    me->code_stop = iscz1_code_stop;
 
     me->debug = atoi(res_get_def (common_resource, "isamcDebug", "0"));