X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fmarcdisp.c;h=6eeccb3ae10005cf700cd526441f3d559b8166b7;hb=5c167071ae977b217670e573d18c112634e8aa63;hp=f77482f2d7eedcbcbe64c80d483bd565de982666;hpb=b479a755bb3329922d9d3fb496ba828716a7e40e;p=yaz-moved-to-github.git diff --git a/src/marcdisp.c b/src/marcdisp.c index f77482f..6eeccb3 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.47 2007-02-23 10:15:01 adam Exp $ */ /** @@ -26,6 +26,7 @@ #include #include #include +#include #if YAZ_HAVE_XML2 #include @@ -125,6 +126,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); @@ -161,19 +175,9 @@ void yaz_marc_cprintf(yaz_marc_t mt, const char *fmt, ...) { va_list ap; char buf[200]; - va_start(ap, fmt); -#ifdef WIN32 - _vsnprintf(buf, sizeof(buf)-1, fmt, ap); -#else -/* !WIN32 */ -#if HAVE_VSNPRINTF - vsnprintf(buf, sizeof(buf), fmt, ap); -#else - vsprintf(buf, fmt, ap); -#endif -#endif -/* WIN32 */ + va_start(ap, fmt); + yaz_vsnprintf(buf, sizeof(buf)-1, fmt, ap); yaz_marc_add_comment(mt, buf); va_end (ap); } @@ -472,8 +476,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 +484,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 +593,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 +605,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 +634,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 +654,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 +755,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 +770,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 +843,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 +855,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 +907,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: