+ if (!p)
+ return -1;
+ src = p->bytes + ISAMB_DATA_OFFSET;
+ endp = p->bytes + p->size;
+
+ }
+ while (p && src != endp)
+ {
+ char file_item_buf[DST_ITEM_MAX];
+ char *file_item = file_item_buf;
+
+ (*b->method->code_item)(ISAMC_DECODE, c1, &file_item, &src);
+ if (new_item)
+ {
+ int d = (*b->method->compare_item)(file_item_buf, new_item);
+ if (d > 0)
+ {
+ char *item_ptr = (char*) new_item;
+ (*b->method->code_item)(ISAMC_ENCODE, c2, &dst, &item_ptr);
+ new_item = 0;
+ p->dirty = 1;
+ }
+ else if (d == 0)
+ {
+ new_item = 0;
+ }
+ }
+ file_item = file_item_buf;
+ (*b->method->code_item)(ISAMC_ENCODE, c2, &dst, &file_item);
+ }
+ if (new_item)
+ {
+ char *item_ptr = (char*) new_item;
+ (*b->method->code_item)(ISAMC_ENCODE, c2, &dst, &item_ptr);
+ new_item = 0;
+ if (p)
+ p->dirty = 1;
+ }
+ new_size = dst - dst_buf + ISAMB_DATA_OFFSET;
+ if (p && new_size > p->size)
+ {
+ yaz_log (LOG_LOG, "resize %d -> %d", p->size, new_size);
+ close_block (b, p);
+ /* delete it too!! */
+ p = 0; /* make a new one anyway */
+ }