Fixed a borderline case isamb_forward
authorHeikki Levanto <heikki@indexdata.dk>
Tue, 1 Jun 2004 14:50:59 +0000 (14:50 +0000)
committerHeikki Levanto <heikki@indexdata.dk>
Tue, 1 Jun 2004 14:50:59 +0000 (14:50 +0000)
index/extract.c
index/kinput.c
isamb/isamb.c
rset/rsisamb.c

index 76c2182..61028b5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: extract.c,v 1.152 2004-06-01 12:56:14 adam Exp $
+/* $Id: extract.c,v 1.153 2004-06-01 14:50:59 heikki Exp $
    Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
    Index Data Aps
 
@@ -1284,9 +1284,9 @@ void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno,
         if (zh->reg->key_buf_used + 1024 > 
             (zh->reg->ptr_top -zh->reg->ptr_i)*sizeof(char*))
             extract_flushWriteKeys (zh,0);
-       assert(zh->reg->ptr_i >= 0);
+        assert(zh->reg->ptr_i >= 0);
         ++(zh->reg->ptr_i);
-       assert(zh->reg->ptr_i > 0);
+        assert(zh->reg->ptr_i > 0);
         (zh->reg->key_buf)[zh->reg->ptr_top - zh->reg->ptr_i] =
            (char*)zh->reg->key_buf + zh->reg->key_buf_used;
 #if SU_SCHEME
index b9d7305..21cb27e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: kinput.c,v 1.57 2004-01-22 15:40:25 heikki Exp $
+/* $Id: kinput.c,v 1.58 2004-06-01 14:50:59 heikki Exp $
    Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
    Index Data Aps
 
@@ -363,10 +363,11 @@ static void key_heap_insert (struct heap_info *hi, const char *buf, int nbytes,
 static int heap_read_one_raw (struct heap_info *hi, char *name, char *key)
 {
     ZebraHandle zh=hi->zh;
-    int ptr_i = zh->reg->ptr_i--;
+    int ptr_i = zh->reg->ptr_i;
     char *cp;
     if (!ptr_i)
         return 0;
+    --(zh->reg->ptr_i);
     cp=(zh->reg->key_buf)[zh->reg->ptr_top - ptr_i];
     logf (LOG_DEBUG, " raw: i=%d top=%d cp=%p", ptr_i, zh->reg->ptr_top,cp);
     strcpy(name, cp);
index 59d0b26..33a3691 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: isamb.c,v 1.31 2004-06-01 13:46:41 adam Exp $
+/* $Id: isamb.c,v 1.32 2004-06-01 14:51:00 heikki Exp $
    Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
    Index Data Aps
 
@@ -27,7 +27,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include <assert.h>
 
 #ifndef ISAMB_DEBUG
-#define ISAMB_DEBUG 0
+#define ISAMB_DEBUG 1
 #endif
 
 struct ISAMB_head {
@@ -1065,7 +1065,7 @@ int isamb_pp_read (ISAMB_PP pp, void *buf)
     (*pp->isamb->method->code_item)(ISAMC_DECODE, p->decodeClientData,
                                     &dst, &src);
     p->offset = src - (char*) p->bytes;
-    key_logdump_txt(LOG_DEBUG,buf, "isamb_pp_read returning 1");
+    /* key_logdump_txt(LOG_DEBUG,buf, "isamb_pp_read returning 1"); */
     return 1;
 }
 
@@ -1103,6 +1103,7 @@ int isamb_pp_forward (ISAMB_PP pp, void *buf, const void *untilbuf)
     int item_len;
     int pos;
     int nxtpos;
+    int descending=0; /* used to prevent a border condition error */
     if (!p)
         return 0;
 #if ISAMB_DEBUG
@@ -1114,7 +1115,7 @@ int isamb_pp_forward (ISAMB_PP pp, void *buf, const void *untilbuf)
 
     while (1)
     {
-        while ( p->offset == p->size) 
+        while ( (p->offset == p->size) && !descending )
         {  /* end of this block - climb higher */
 #if ISAMB_DEBUG
             logf(LOG_DEBUG,"isamb_pp_forward climbing from l=%d",
@@ -1180,6 +1181,7 @@ int isamb_pp_forward (ISAMB_PP pp, void *buf, const void *untilbuf)
                 logf(LOG_DEBUG,"isambb_pp_forward descending l=%d p=%d ",
                             pp->level, pos);
 #endif
+                descending=1; /* prevent climbing for a while */
                 ++(pp->level);
                 p = open_block(pp->isamb,pos);
                 pp->block[pp->level] = p ;
index 0de7cd5..c9579be 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: rsisamb.c,v 1.6 2004-06-01 12:32:19 heikki Exp $
+/* $Id: rsisamb.c,v 1.7 2004-06-01 14:51:00 heikki Exp $
    Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
    Index Data Aps
 
@@ -164,6 +164,7 @@ static int r_forward(RSET ct, RSFD rfd, void *buf, int *term_index,
     key_logdump(LOG_DEBUG, buf);
 
     i=isamb_pp_forward(pinfo->pt, buf, untilbuf);
+    logf (LOG_DEBUG, "rset_rsisamb_forward returning %d",i);
     return i;
 }