+struct yaz_marc_t_ {
+ WRBUF wr;
+ WRBUF own_wr;
+ WRBUF user_wr;
+ int xml;
+ int debug;
+};
+
+yaz_marc_t yaz_marc_create(void)
+{
+ yaz_marc_t mt = xmalloc(sizeof(*mt));
+ mt->xml = YAZ_MARC_LINE;
+ mt->debug = 0;
+ mt->wr = 0;
+ mt->own_wr = wrbuf_alloc();
+ mt->user_wr = 0;
+ return mt;
+}
+
+void yaz_marc_destroy(yaz_marc_t mt)
+{
+ if (!mt)
+ return ;
+ wrbuf_free (mt->own_wr, 1);
+ xfree (mt);
+}
+
+static void marc_cdata (yaz_marc_t mt, const char *buf, size_t len)
+{
+ size_t i;
+ for (i = 0; i<len; i++)
+ {
+ if (mt->xml)
+ {
+ switch (buf[i]) {
+ case '<':
+ wrbuf_puts(mt->wr, "<");
+ break;
+ case '>':
+ wrbuf_puts(mt->wr, ">");
+ break;
+ case '&':
+ wrbuf_puts(mt->wr, "&");
+ break;
+ default:
+ wrbuf_putc(mt->wr, buf[i]);
+ }
+ }
+ else
+ wrbuf_putc(mt->wr, buf[i]);
+ }
+}
+
+#if 0
+static void marc_cdata (yaz_marc_t mt, const char *buf, size_t len)
+{
+ if (!mt->cd)
+ marc_cdata2 (mt, buf, len);
+ else
+ {
+ char outbuf[12];
+ size_t inbytesleft = len;
+ const char *inp = buf;
+
+ while (inbytesleft)
+ {
+ size_t outbytesleft = sizeof(outbuf);
+ char *outp = outbuf;
+ size_t r = yaz_iconv (mt->cd, (char**) &inp, &inbytesleft,
+ &outp, &outbytesleft);
+ if (r == (size_t) (-1))
+ {
+ int e = yaz_iconv_error(mt->cd);
+ if (e != YAZ_ICONV_E2BIG)
+ break;
+ }
+ marc_cdata2 (mt, outbuf, outp - outbuf);
+ }
+ }
+}
+#endif
+
+static int yaz_marc_decode_int (yaz_marc_t mt, const char *buf, int bsize)