- ISAMC_PP pp;
- char f_item[128], *f_item_ptr;
- int f_more;
- int cat = 0;
- int nextpos;
-
- char i_item[128], *i_item_ptr;
- int i_more, insertMode;
-
- char r_item_buf[128];
- int r_offset = ISAMC_BLOCK_OFFSET;
- int r_dirty = 0;
- char *r_ptr[100];
- int r_ptri = 0;
- int r_start = 0;
- void *r_clientData = (*is->method->code_start)();
-
- /* rewind and read first item from file */
- pp = isc_position (is, ipos);
- f_item_ptr = f_item;
- f_more = isc_read_item (pp, &f_item_ptr);
- cat = pp->cat;
-
- /* read first item from i */
- i_item_ptr = i_item;
- i_more = (*data->read_item)(data->clientData, &i_item_ptr, &insertMode);
-
- while (f_more || i_more)
- {
- int cmp;
- char *r_item = r_item_buf;
-
- if (!f_more)
- cmp = -1;
- else if (!i_more)
- cmp = 1;
- else
- cmp = (*is->method->compare_item)(i_item, f_item);
- if (cmp == 0) /* insert i=f */
- {
- if (!insertMode)
- {
- r_item = NULL;
- r_dirty = 1;
- }
- else
- memcpy (r_item, f_item, f_item_ptr - f_item);
-
- /* move i */
- i_item_ptr = i_item;
- i_more = (*data->read_item)(data->clientData, &i_item_ptr,
- &insertMode);
- /* move f */
- f_item_ptr = f_item;
- f_more = isc_read_item (pp, &f_item_ptr);
- }
- else if (cmp > 0) /* insert f */
- {
- memcpy (r_item, f_item, f_item_ptr - f_item);
- /* move f */
- f_item_ptr = f_item;
- f_more = isc_read_item (pp, &f_item_ptr);
- }
- else /* insert i */
- {
- if (!insertMode) /* delete item which isn't there? */
- {
- logf (LOG_FATAL, "Inconsistent register");
- abort ();
- }
- memcpy (r_item, i_item, i_item_ptr - i_item);
- r_dirty = 1;
- /* move i */
- i_item_ptr = i_item;
- i_more = (*data->read_item)(data->clientData, &i_item_ptr,
- &insertMode);
- }
- /* check for end of input block condition */
-
- if (r_item) /* insert resulting item? */
- {
- char *r_out_ptr = is->r_buf + r_offset;
- int new_offset;
- int border = is->method->filecat[cat].initsize - r_start;
-
- (*is->method->code_item)(r_clientData, &r_out_ptr, &r_item);
- new_offset = r_out_ptr - is->r_buf;