From 8456bd3e19e2d0f4694ad97ecdc737a82c3d0816 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Tue, 1 Aug 2006 09:28:04 +0000 Subject: [PATCH] Fixed yaz_marc_write_iso2709 to honor character set conversion. --- src/marcdisp.c | 22 ++++++++++++++++------ test/tst_record_conv.c | 38 +++++++++++++++++++++++++++++++++++--- 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/src/marcdisp.c b/src/marcdisp.c index 2b06b2a..1680ea5 100644 --- a/src/marcdisp.c +++ b/src/marcdisp.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2006, Index Data ApS * See the file LICENSE for details. * - * $Id: marcdisp.c,v 1.31 2006-07-06 10:17:53 adam Exp $ + * $Id: marcdisp.c,v 1.32 2006-08-01 09:28:04 adam Exp $ */ /** @@ -590,7 +590,7 @@ int yaz_marc_write_iso2709(yaz_marc_t mt, WRBUF wr) int length_implementation; int data_offset = 0; const char *leader = 0; - WRBUF wr_dir, wr_head; + WRBUF wr_dir, wr_head, wr_data_tmp; int base_address; for (n = mt->nodes; n; n = n->next) @@ -610,6 +610,7 @@ int yaz_marc_write_iso2709(yaz_marc_t mt, WRBUF wr) if (!atoi_n_check(leader+22, 1, &length_implementation)) return -1; + wr_data_tmp = wrbuf_alloc(); wr_dir = wrbuf_alloc(); for (n = mt->nodes; n; n = n->next) { @@ -621,12 +622,20 @@ int yaz_marc_write_iso2709(yaz_marc_t mt, WRBUF wr) wrbuf_printf(wr_dir, "%.3s", n->u.datafield.tag); data_length += indicator_length; for (s = n->u.datafield.subfields; s; s = s->next) - data_length += 1+strlen(s->code_data); + { + wrbuf_rewind(wr_data_tmp); + wrbuf_iconv_puts(wr_data_tmp, mt->iconv_cd, s->code_data); + data_length += 1+wrbuf_len(wr_data_tmp); + } data_length++; break; case YAZ_MARC_CONTROLFIELD: wrbuf_printf(wr_dir, "%.3s", n->u.controlfield.tag); - data_length += strlen(n->u.controlfield.data); + + wrbuf_rewind(wr_data_tmp); + wrbuf_iconv_puts(wr_data_tmp, mt->iconv_cd, + n->u.controlfield.data); + data_length += wrbuf_len(wr_data_tmp); data_length++; break; case YAZ_MARC_COMMENT: @@ -662,6 +671,7 @@ int yaz_marc_write_iso2709(yaz_marc_t mt, WRBUF wr) wrbuf_write(wr, wrbuf_buf(wr_dir), wrbuf_len(wr_dir)); wrbuf_free(wr_head, 1); wrbuf_free(wr_dir, 1); + wrbuf_free(wr_data_tmp, 1); for (n = mt->nodes; n; n = n->next) { @@ -674,12 +684,12 @@ int yaz_marc_write_iso2709(yaz_marc_t mt, WRBUF wr) for (s = n->u.datafield.subfields; s; s = s->next) { wrbuf_printf(wr, "%c", ISO2709_IDFS); - wrbuf_puts(wr, s->code_data); + wrbuf_iconv_puts(wr, mt->iconv_cd, s->code_data); } wrbuf_printf(wr, "%c", ISO2709_FS); break; case YAZ_MARC_CONTROLFIELD: - wrbuf_puts(wr, n->u.controlfield.data); + wrbuf_iconv_puts(wr, mt->iconv_cd, n->u.controlfield.data); wrbuf_printf(wr, "%c", ISO2709_FS); break; case YAZ_MARC_COMMENT: diff --git a/test/tst_record_conv.c b/test/tst_record_conv.c index 358b73d..3606db2 100644 --- a/test/tst_record_conv.c +++ b/test/tst_record_conv.c @@ -2,7 +2,7 @@ * Copyright (C) 2005-2006, Index Data ApS * See the file LICENSE for details. * - * $Id: tst_record_conv.c,v 1.9 2006-07-06 10:17:55 adam Exp $ + * $Id: tst_record_conv.c,v 1.10 2006-08-01 09:28:04 adam Exp $ * */ #include @@ -206,7 +206,7 @@ static int conv_convert_test(yaz_record_conv_t p, return ret; } -static void tst_convert() +static void tst_convert1() { yaz_record_conv_t p = 0; const char *marcxml_rec = @@ -289,6 +289,37 @@ static void tst_convert() yaz_record_conv_destroy(p); } +static void tst_convert2() +{ + yaz_record_conv_t p = 0; + const char *marcxml_rec = + "\n" + " 00080nam a22000498a 4500\n" + " 11224466 \n" + " \n" + " københavn\n" + " \n" + "\n"; + const char *iso2709_rec = + "\x30\x30\x30\x37\x37\x6E\x61\x6D\x20\x61\x32\x32\x30\x30\x30\x34" + "\x39\x38\x61\x20\x34\x35\x30\x30\x30\x30\x31\x30\x30\x31\x33\x30" + "\x30\x30\x30\x30\x30\x31\x30\x30\x30\x31\x34\x30\x30\x30\x31\x33" + "\x1E\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x20\x20" + "\x1F\x61\x6b\xb2\x62\x65\x6e\x68\x61\x76\x6e\x1E\x1D"; + + YAZ_CHECK(conv_configure_test("" + "" + "", + 0, &p)); + YAZ_CHECK(conv_convert_test(p, marcxml_rec, iso2709_rec)); + yaz_record_conv_destroy(p); +} + #endif int main(int argc, char **argv) @@ -299,7 +330,8 @@ int main(int argc, char **argv) tst_configure(); #endif #if YAZ_HAVE_XSLT - tst_convert(); + tst_convert1(); + tst_convert2(); #endif YAZ_CHECK_TERM; } -- 1.7.10.4