Scan using string attributes
[idzebra-moved-to-github.git] / isamb / isamb.c
index ab657d7..af6d202 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: isamb.c,v 1.72 2005-03-05 09:19:15 adam Exp $
+/* $Id: isamb.c,v 1.75 2005-03-21 17:20:54 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -141,10 +141,10 @@ static void encode_ptr(char **dst, zint pos)
 
     while (pos > 127)
     {
-         *bp++ = 128 | (pos & 127);
+         *bp++ = (unsigned char) (128 | (pos & 127));
          pos = pos >> 7;
     }
-    *bp++ = pos;
+    *bp++ = (unsigned char) pos;
     *dst = (char *) bp;
 }
 #else
@@ -266,9 +266,9 @@ ISAMB isamb_open(BFiles bfs, const char *name, int writeflag, ISAMC_M *method,
            decode_ptr(&src, &isamb->file[i].head.first_block);
            decode_ptr(&src, &isamb->file[i].head.last_block);
            decode_ptr(&src, &zint_tmp);
-           isamb->file[i].head.block_size = zint_tmp;
+           isamb->file[i].head.block_size = (int) zint_tmp;
            decode_ptr(&src, &zint_tmp);
-           isamb->file[i].head.block_max = zint_tmp;
+           isamb->file[i].head.block_max = (int) zint_tmp;
            decode_ptr(&src, &isamb->file[i].head.free_list);
        }
         assert (isamb->file[i].head.block_size >= isamb->file[i].head.block_offset);
@@ -839,6 +839,7 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item,
     int cut_item_size = 0;
     int no_items = 0;    /* number of items (total) */
     int no_items_1 = 0;  /* number of items (first half) */
+    int inserted_dst_bytes = 0;
 
     if (p && p->size)
     {
@@ -852,6 +853,7 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item,
         {
             const char *dst_item = 0; /* resulting item to be inserted */
             char *lookahead_next;
+           char *dst_0 = dst;
             int d = -1;
             
             if (lookahead_item)
@@ -877,7 +879,6 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item,
             else
                 dst_item = file_item_buf;
 
-              
             if (!*lookahead_mode && d == 0)
             {
                /* it's a deletion and they match so there is nothing to be
@@ -914,7 +915,8 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item,
             {
                /* we must move the lookahead pointer */
 
-                if (dst > maxp)
+               inserted_dst_bytes += (dst - dst_0);
+                if (inserted_dst_bytes >=  quater)
                    /* no more room. Mark lookahead as "gone".. */
                     lookahead_item = 0;
                 else
@@ -966,17 +968,19 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item,
             }
         }
     }
-    maxp = dst_buf + b->file[b->no_cat-1].head.block_max + quater;
+
     /* this loop runs when we are "appending" to a leaf page. That is
        either it's empty (new) or all file items have been read in
        previous loop */
+
+    maxp = dst_buf + b->file[b->no_cat-1].head.block_max + quater;
     while (lookahead_item)
     {
         char *dst_item;
        const char *src = lookahead_item;
         char *dst_0 = dst;
         
-       /* compare lookahead with max item */
+       /* if we have a lookahead item, we stop if we exceed the value of it */
         if (max_item &&
             (*b->method->compare_item)(max_item, lookahead_item) <= 0)
         {
@@ -1054,6 +1058,7 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item,
        
        /* first half */
         p->size = half1 - dst_buf;
+       assert(p->size <=  b->file[p->cat].head.block_max);
         memcpy (p->bytes, dst_buf, half1 - dst_buf);
        p->no_items = no_items_1;
 
@@ -1069,6 +1074,7 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item,
         memcpy (first_dst, half2, dst - half2);
 
         (*sp2)->size = (first_dst - (*sp2)->bytes) + (dst - half2);
+       assert((*sp2)->size <=  b->file[p->cat].head.block_max);
        (*sp2)->no_items = no_items - no_items_1;
         (*sp2)->dirty = 1;
         p->dirty = 1;
@@ -1269,7 +1275,7 @@ ISAMB_PP isamb_pp_open (ISAMB isamb, ISAMB_P pos, int scope)
     return isamb_pp_open_x(isamb, pos, 0, scope);
 }
 
-void isamb_pp_close_x(ISAMB_PP pp, int *size, int *blocks)
+void isamb_pp_close_x(ISAMB_PP pp, zint *size, zint *blocks)
 {
     int i;
     if (!pp)
@@ -1798,7 +1804,7 @@ void isamb_pp_pos(ISAMB_PP pp, double *current, double *total)
     assert(current);
     assert(p->leaf);
 
-    *total = pp->block[0]->no_items;
+    *total = (double) (pp->block[0]->no_items);
     *current = (double) pp->returned_numbers;
 #if ISAMB_DEBUG
     yaz_log(YLOG_LOG, "isamb_pp_pos returning: cur= %0.1f tot=%0.1f rn="