+ struct it_key i1, i2;
+ int i, l;
+ memcpy (&i1, p1, sizeof(i1));
+ memcpy (&i2, p2, sizeof(i2));
+ 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;
+ }
+ }
+ return 0;
+}
+
+zint key_get_seq(const void *p)
+{
+ struct it_key k;
+ memcpy (&k, p, sizeof(k));
+ return k.mem[k.len-1];
+}
+
+int key_qsort_compare (const void *p1, const void *p2)
+{
+ int r;
+ size_t l;
+ char *cp1 = *(char **) p1;
+ char *cp2 = *(char **) p2;
+
+ if ((r = strcmp (cp1, cp2)))
+ return r;
+ l = strlen(cp1)+1;
+ if ((r = key_compare (cp1+l+1, cp2+l+1)))
+ return r;
+ return cp1[l] - cp2[l];
+}
+
+struct iscz1_code_info {
+ struct it_key key;
+};
+
+void *iscz1_start (void)
+{
+ struct iscz1_code_info *p = (struct iscz1_code_info *)
+ xmalloc (sizeof(*p));
+ iscz1_reset(p);
+ return p;
+}
+
+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;
+}
+
+void iscz1_reset (void *vp)
+{
+ struct iscz1_code_info *p = (struct iscz1_code_info *) vp;
+ int i;
+ p->key.len = 0;
+ for (i = 0; i< IT_KEY_LEVEL_MAX; i++)
+ p->key.mem[i] = 0;
+}
+
+void iscz1_stop (void *p)
+{
+ xfree (p);
+}
+
+/* small encoder that works with unsigneds of any length */
+static CODEC_INLINE void iscz1_encode_int (zint d, char **dst)
+{
+ unsigned char *bp = (unsigned char*) *dst;
+
+ while (d > 127)