X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fmarcdisp.c;h=02f3d3ed7427b40ce8ea9ff190700a80b505fd69;hb=60b5f5ba6f34ef79b037eb8af1e2554d9842bb10;hp=f415bc711b5b9296cf3d4c285db17927a91cb32c;hpb=af364b92610b4b6b424b696064bf4564e653693d;p=yaz-moved-to-github.git diff --git a/src/marcdisp.c b/src/marcdisp.c index f415bc7..02f3d3e 100644 --- a/src/marcdisp.c +++ b/src/marcdisp.c @@ -1,8 +1,8 @@ /* - * Copyright (C) 1995-2006, Index Data ApS + * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: marcdisp.c,v 1.41 2007-01-02 07:01:56 quinn Exp $ + * $Id: marcdisp.c,v 1.44 2007-01-18 14:45:05 adam Exp $ */ /** @@ -125,6 +125,27 @@ 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) + { +#if 1 + 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); +#else + int pos = wr->pos; + wrbuf_iconv_puts(wr, mt->iconv_cd, " "); + if (pos != wr->pos) + wr->pos--; + yaz_iconv(mt->iconv_cd, 0, 0, 0, 0); +#endif + } +} + static int marc_exec_leader(const char *leader_spec, char *leader, size_t size); @@ -472,8 +493,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 +501,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 +610,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 +622,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; @@ -682,6 +704,7 @@ int yaz_marc_write_xml(yaz_marc_t mt, xmlNode **root_ptr, const char *leader = 0; xmlNode *record_ptr; xmlNsPtr ns_record; + WRBUF wr_cdata = 0; for (n = mt->nodes; n; n = n->next) if (n->which == YAZ_MARC_LEADER) @@ -695,6 +718,8 @@ int yaz_marc_write_xml(yaz_marc_t mt, xmlNode **root_ptr, if (!atoi_n_check(leader+11, 1, &identifier_length)) return -1; + wr_cdata = wrbuf_alloc(); + record_ptr = xmlNewNode(0, BAD_CAST "record"); *root_ptr = record_ptr; @@ -731,8 +756,6 @@ int yaz_marc_write_xml(yaz_marc_t mt, xmlNode **root_ptr, } for (s = n->u.datafield.subfields; s; s = s->next) { - char code_val[8]; - xmlNode *ptr_subfield; /* if identifier length is 2 (most MARCs), the code is a single character .. However we've @@ -742,24 +765,29 @@ int yaz_marc_write_xml(yaz_marc_t mt, xmlNode **root_ptr, : cdata_one_character(mt, s->code_data); - if (using_code_len >= sizeof(code_val)-1) - continue; - + 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 (s->code_data + using_code_len)); - - memcpy(code_val, s->code_data, using_code_len); - code_val[using_code_len] = '\0'; + BAD_CAST "subfield", BAD_CAST wrbuf_cstr(wr_cdata)); - xmlNewProp(ptr_subfield, BAD_CAST "code", BAD_CAST code_val); + wrbuf_rewind(wr_cdata); + wrbuf_iconv_write(wr_cdata, mt->iconv_cd, + s->code_data, using_code_len); + xmlNewProp(ptr_subfield, BAD_CAST "code", + BAD_CAST wrbuf_cstr(wr_cdata)); } break; 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 n->u.controlfield.data); + BAD_CAST wrbuf_cstr(wr_cdata)); xmlNewProp(ptr, BAD_CAST "tag", BAD_CAST n->u.controlfield.tag); break; @@ -773,6 +801,7 @@ int yaz_marc_write_xml(yaz_marc_t mt, xmlNode **root_ptr, break; } } + wrbuf_destroy(wr_cdata); return 0; #else return -1; @@ -827,6 +856,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, ' '); @@ -838,6 +868,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; @@ -889,17 +920,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: