+
+ if (mt->xml == YAZ_MARC_ISO2709)
+ {
+ WRBUF wr_head = wrbuf_alloc();
+ WRBUF wr_dir = wrbuf_alloc();
+ WRBUF wr_tmp = wrbuf_alloc();
+
+ int data_p = 0;
+ /* second pass. create directory for ISO2709 output */
+ for (entry_p = 24; buf[entry_p] != ISO2709_FS; )
+ {
+ int data_length, data_offset, end_offset;
+ int i, sz1, sz2;
+
+ wrbuf_write(wr_dir, buf+entry_p, 3);
+ entry_p += 3;
+
+ data_length = atoi_n (buf+entry_p, length_data_entry);
+ entry_p += length_data_entry;
+ data_offset = atoi_n (buf+entry_p, length_starting);
+ entry_p += length_starting;
+ i = data_offset + base_address;
+ end_offset = i+data_length-1;
+
+ while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS &&
+ i < end_offset)
+ i++;
+ sz1 = 1+i - (data_offset + base_address);
+ if (mt->iconv_cd)
+ {
+ sz2 = wrbuf_iconv_write(wr_tmp, mt->iconv_cd,
+ buf + data_offset+base_address, sz1);
+ wrbuf_rewind(wr_tmp);
+ }
+ else
+ sz2 = sz1;
+ wrbuf_printf(wr_dir, "%0*d", length_data_entry, sz2);
+ wrbuf_printf(wr_dir, "%0*d", length_starting, data_p);
+ data_p += sz2;
+ }
+ wrbuf_putc(wr_dir, ISO2709_FS);
+ wrbuf_printf(wr_head, "%05d", data_p+1 + base_address);
+ wrbuf_write(wr_head, buf+5, 7);
+ wrbuf_printf(wr_head, "%05d", base_address);
+ wrbuf_write(wr_head, buf+17, 7);
+
+ wrbuf_write(wr, wrbuf_buf(wr_head), 24);
+ wrbuf_write(wr, wrbuf_buf(wr_dir), wrbuf_len(wr_dir));
+ wrbuf_free(wr_head, 1);
+ wrbuf_free(wr_dir, 1);
+ wrbuf_free(wr_tmp, 1);
+ }
+ /* third pass. create data output */