X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fmarcdisp.c;h=f77482f2d7eedcbcbe64c80d483bd565de982666;hb=951fce6496397a6d8c11e15ab5b60b46abc43467;hp=3079d81b172f2ec314b7a184d48bc9cf3611feb4;hpb=861f9deb72bd92679ea08d528b40993ada55cdb9;p=yaz-moved-to-github.git diff --git a/src/marcdisp.c b/src/marcdisp.c index 3079d81..f77482f 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.40 2006-12-18 10:33:22 adam Exp $ + * $Id: marcdisp.c,v 1.43 2007-01-06 16:08:04 adam Exp $ */ /** @@ -682,6 +682,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,10 +696,13 @@ 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; ns_record = xmlNewNs(record_ptr, BAD_CAST ns, 0); + xmlSetNs(record_ptr, ns_record); if (format) xmlNewProp(record_ptr, BAD_CAST "format", BAD_CAST format); @@ -730,8 +734,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 @@ -741,24 +743,28 @@ 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); 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); + 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; @@ -772,6 +778,7 @@ int yaz_marc_write_xml(yaz_marc_t mt, xmlNode **root_ptr, break; } } + wrbuf_destroy(wr_cdata); return 0; #else return -1;