Fixed bug in ISAMB's utility function decode_ptr. With gcc -O3 on some
[idzebra-moved-to-github.git] / isamb / isamb.c
index 294683d..dd2f84a 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: isamb.c,v 1.76 2005-04-13 13:03:47 adam Exp $
-   Copyright (C) 1995-2005
+/* $Id: isamb.c,v 1.84 2006-09-26 12:56:33 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 <stdlib.h>
@@ -157,14 +157,13 @@ static void encode_ptr(char **dst, zint pos)
 
 #define decode_item_len decode_ptr
 #if ISAMB_PTR_CODEC
-static void decode_ptr(const char **src1, zint *pos)
+static void decode_ptr(const char **src, zint *pos)
 {
-    const unsigned char **src = (const unsigned char **) src1;
     zint d = 0;
     unsigned char c;
     unsigned r = 0;
 
-    while (((c = *(*src)++) & 128))
+    while (((c = *(const unsigned char *)((*src)++)) & 128))
     {
         d += ((zint) (c & 127) << r);
        r += 7;
@@ -196,7 +195,7 @@ ISAMB isamb_open(BFiles bfs, const char *name, int writeflag, ISAMC_M *method,
     isamb->skipped_numbers = 0;
     isamb->returned_numbers = 0;
     for (i = 0; i<ISAMB_MAX_LEVEL; i++)
-      isamb->skipped_nodes[i] = isamb->accessed_nodes[i] = 0;
+       isamb->skipped_nodes[i] = isamb->accessed_nodes[i] = 0;
 
     assert(cache == 0);
     isamb->file = xmalloc(sizeof(*isamb->file) * isamb->no_cat);
@@ -299,7 +298,7 @@ static void flush_blocks (ISAMB b, int cat)
     }
 }
 
-static int cache_block (ISAMB b, ISAM_P pos, char *userbuf, int wr)
+static int cache_block (ISAMB b, ISAM_P pos, unsigned char *userbuf, int wr)
 {
     int cat = (int) (pos&CAT_MASK);
     int off = (int) (((pos/CAT_MAX) & 
@@ -456,7 +455,7 @@ static struct ISAMB_block *open_block(ISAMB b, ISAM_P pos)
             abort();
         }
     }
-    p->bytes = p->buf + offset;
+    p->bytes = (char *)p->buf + offset;
     p->leaf = p->buf[0];
     p->size = (p->buf[1] + 256 * p->buf[2]) - offset;
     if (p->size < 0)
@@ -465,7 +464,7 @@ static struct ISAMB_block *open_block(ISAMB b, ISAM_P pos)
                 p->size, pos);
     }
     assert (p->size >= 0);
-    src = p->buf + 3;
+    src = (char*) p->buf + 3;
     decode_ptr(&src, &p->no_items);
 
     p->offset = 0;
@@ -509,7 +508,7 @@ struct ISAMB_block *new_block (ISAMB b, int leaf, int cat)
     p->cat = cat;
     b->file[cat].head_dirty = 1;
     memset (p->buf, 0, b->file[cat].head.block_size);
-    p->bytes = p->buf + b->file[cat].head.block_offset;
+    p->bytes = (char*)p->buf + b->file[cat].head.block_offset;
     p->leaf = leaf;
     p->size = 0;
     p->dirty = 1;
@@ -592,7 +591,7 @@ void close_block(ISAMB b, struct ISAMB_block *p)
     {
        int offset = b->file[p->cat].head.block_offset;
         int size = p->size + offset;
-       char *dst =  p->buf + 3;
+       char *dst =  (char*)p->buf + 3;
         assert (p->size >= 0);
        
        /* memset becuase encode_ptr usually does not write all bytes */
@@ -732,11 +731,12 @@ int insert_int (ISAMB b, struct ISAMB_block *p, void *lookahead_item,
         p->size = dst - dst_buf;
         assert (p->size >= 0);
 
-
         if (p->size <= b->file[p->cat].head.block_max)
         {
            /* it fits OK in this block */
             memcpy (startp, dst_buf, dst - dst_buf);
+
+           close_block(b, sub_p2);
         }
         else
         {
@@ -754,6 +754,9 @@ int insert_int (ISAMB b, struct ISAMB_block *p, void *lookahead_item,
             src = dst_buf;
             endp = dst;
 
+           p->dirty = 1;
+           close_block(b, sub_p2);
+
             half = src + b->file[p->cat].head.block_size/2;
             decode_ptr(&src, &pos);
 
@@ -807,8 +810,7 @@ int insert_int (ISAMB b, struct ISAMB_block *p, void *lookahead_item,
            (*sp)->no_items = p->no_items - no_items_first_half;
            p->no_items = no_items_first_half;
         }
-        p->dirty = 1;
-        close_block(b, sub_p2);
+       p->dirty = 1;
     }
     close_block(b, sub_p1);
     (*b->method->codec.stop)(c1);
@@ -1799,10 +1801,10 @@ int isamb_pp_forward (ISAMB_PP pp, void *buf, const void *untilbuf)
 void isamb_pp_pos(ISAMB_PP pp, double *current, double *total)
 { /* return an estimate of the current position and of the total number of */
   /* occureences in the isam tree, based on the current leaf */
-    struct ISAMB_block *p = pp->block[pp->level];
     assert(total);
     assert(current);
-    assert(p->leaf);
+    
+    /* if end-of-stream PP may not be leaf */
 
     *total = (double) (pp->block[0]->no_items);
     *current = (double) pp->returned_numbers;
@@ -1944,3 +1946,11 @@ again:
     }
     return 1;
 }
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+