X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmarcdisp.c;h=9037b5b76a201c73f5d730471e3a5565ed1660b9;hb=259d7eb2a0c31853affc5147d1d57223345a1625;hp=f77482f2d7eedcbcbe64c80d483bd565de982666;hpb=b479a755bb3329922d9d3fb496ba828716a7e40e;p=yaz-moved-to-github.git diff --git a/src/marcdisp.c b/src/marcdisp.c index f77482f..9037b5b 100644 --- a/src/marcdisp.c +++ b/src/marcdisp.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: marcdisp.c,v 1.43 2007-01-06 16:08:04 adam Exp $ + * $Id: marcdisp.c,v 1.46 2007-02-17 10:53:05 adam Exp $ */ /** @@ -125,6 +125,19 @@ NMEM yaz_marc_get_nmem(yaz_marc_t mt) return mt->nmem; } +static void marc_iconv_reset(yaz_marc_t mt, WRBUF wr) +{ + if (mt->iconv_cd) + { + char outbuf[12]; + size_t outbytesleft = sizeof(outbuf); + char *outp = outbuf; + size_t r = yaz_iconv(mt->iconv_cd, 0, 0, &outp, &outbytesleft); + if (r != (size_t) (-1)) + wrbuf_write(wr, outbuf, outp - outbuf); + } +} + static int marc_exec_leader(const char *leader_spec, char *leader, size_t size); @@ -472,8 +485,7 @@ int yaz_marc_write_line(yaz_marc_t mt, WRBUF wr) wrbuf_iconv_puts(wr, mt->iconv_cd, " "); wrbuf_iconv_puts(wr, mt->iconv_cd, s->code_data + using_code_len); - wrbuf_iconv_puts(wr, mt->iconv_cd, " "); - wr->pos--; + marc_iconv_reset(mt, wr); } wrbuf_puts (wr, mt->endline_str); break; @@ -481,8 +493,7 @@ int yaz_marc_write_line(yaz_marc_t mt, WRBUF wr) wrbuf_printf(wr, "%s", n->u.controlfield.tag); wrbuf_iconv_puts(wr, mt->iconv_cd, " "); wrbuf_iconv_puts(wr, mt->iconv_cd, n->u.controlfield.data); - wrbuf_iconv_puts(wr, mt->iconv_cd, " "); - wr->pos--; + marc_iconv_reset(mt, wr); wrbuf_puts (wr, mt->endline_str); break; case YAZ_MARC_COMMENT: @@ -591,6 +602,7 @@ static int yaz_marc_write_marcxml_ns1(yaz_marc_t mt, WRBUF wr, wrbuf_iconv_write_cdata(wr, mt->iconv_cd, s->code_data + using_code_len, strlen(s->code_data + using_code_len)); + marc_iconv_reset(mt, wr); wrbuf_iconv_puts(wr, mt->iconv_cd, ""); wrbuf_puts(wr, "\n"); } @@ -602,6 +614,8 @@ static int yaz_marc_write_marcxml_ns1(yaz_marc_t mt, WRBUF wr, strlen(n->u.controlfield.tag)); wrbuf_iconv_puts(wr, mt->iconv_cd, "\">"); wrbuf_iconv_puts(wr, mt->iconv_cd, n->u.controlfield.data); + + marc_iconv_reset(mt, wr); wrbuf_iconv_puts(wr, mt->iconv_cd, ""); wrbuf_puts(wr, "\n"); break; @@ -629,6 +643,7 @@ static int yaz_marc_write_marcxml_ns(yaz_marc_t mt, WRBUF wr, { if (mt->write_using_libxml2) { +#if YAZ_HAVE_XML2 int ret; xmlNode *root_ptr; @@ -648,6 +663,9 @@ static int yaz_marc_write_marcxml_ns(yaz_marc_t mt, WRBUF wr, xmlFreeDoc(doc); } return ret; +#else + return -1; +#endif } else return yaz_marc_write_marcxml_ns1(mt, wr, ns, format, type); @@ -746,7 +764,7 @@ int yaz_marc_write_xml(yaz_marc_t mt, xmlNode **root_ptr, wrbuf_rewind(wr_cdata); wrbuf_iconv_puts(wr_cdata, mt->iconv_cd, s->code_data + using_code_len); - + marc_iconv_reset(mt, wr_cdata); ptr_subfield = xmlNewTextChild( ptr, ns_record, BAD_CAST "subfield", BAD_CAST wrbuf_cstr(wr_cdata)); @@ -761,7 +779,8 @@ int yaz_marc_write_xml(yaz_marc_t mt, xmlNode **root_ptr, case YAZ_MARC_CONTROLFIELD: wrbuf_rewind(wr_cdata); wrbuf_iconv_puts(wr_cdata, mt->iconv_cd, n->u.controlfield.data); - + marc_iconv_reset(mt, wr_cdata); + ptr = xmlNewTextChild(record_ptr, ns_record, BAD_CAST "controlfield", BAD_CAST wrbuf_cstr(wr_cdata)); @@ -833,6 +852,7 @@ int yaz_marc_write_iso2709(yaz_marc_t mt, WRBUF wr) /* write dummy IDFS + content */ wrbuf_iconv_putchar(wr_data_tmp, mt->iconv_cd, ' '); wrbuf_iconv_puts(wr_data_tmp, mt->iconv_cd, s->code_data); + marc_iconv_reset(mt, wr_data_tmp); } /* write dummy FS (makes MARC-8 to become ASCII) */ wrbuf_iconv_putchar(wr_data_tmp, mt->iconv_cd, ' '); @@ -844,6 +864,7 @@ int yaz_marc_write_iso2709(yaz_marc_t mt, WRBUF wr) wrbuf_rewind(wr_data_tmp); wrbuf_iconv_puts(wr_data_tmp, mt->iconv_cd, n->u.controlfield.data); + marc_iconv_reset(mt, wr_data_tmp); wrbuf_iconv_putchar(wr_data_tmp, mt->iconv_cd, ' ');/* field sep */ data_length += wrbuf_len(wr_data_tmp); break; @@ -895,17 +916,13 @@ int yaz_marc_write_iso2709(yaz_marc_t mt, WRBUF wr) { wrbuf_putc(wr, ISO2709_IDFS); wrbuf_iconv_puts(wr, mt->iconv_cd, s->code_data); - /* write dummy blank - makes MARC-8 to become ASCII */ - wrbuf_iconv_putchar(wr, mt->iconv_cd, ' '); - wr->pos--; + marc_iconv_reset(mt, wr); } wrbuf_putc(wr, ISO2709_FS); break; case YAZ_MARC_CONTROLFIELD: wrbuf_iconv_puts(wr, mt->iconv_cd, n->u.controlfield.data); - /* write dummy blank - makes MARC-8 to become ASCII */ - wrbuf_iconv_putchar(wr, mt->iconv_cd, ' '); - wr->pos--; + marc_iconv_reset(mt, wr); wrbuf_putc(wr, ISO2709_FS); break; case YAZ_MARC_COMMENT: