-/* $Id: isamb.c,v 1.78 2005-04-25 10:42:08 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.
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>
#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;
}
}
-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) &
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)
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;
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;
{
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 */
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
{
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);
(*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);
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);
}
return 1;
}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+