Fixed yaz_marc_write_iso2709 to honor character set conversion.
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 1 Aug 2006 09:28:04 +0000 (09:28 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 1 Aug 2006 09:28:04 +0000 (09:28 +0000)
src/marcdisp.c
test/tst_record_conv.c

index 2b06b2a..1680ea5 100644 (file)
@@ -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:
index 358b73d..3606db2 100644 (file)
@@ -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 <yaz/record_conv.h>
@@ -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 =
+        "<record xmlns=\"http://www.loc.gov/MARC21/slim\">\n"
+        "  <leader>00080nam a22000498a 4500</leader>\n"
+        "  <controlfield tag=\"001\">   11224466 </controlfield>\n"
+        "  <datafield tag=\"010\" ind1=\" \" ind2=\" \">\n"
+        "    <subfield code=\"a\">k&#xf8;benhavn</subfield>\n"
+        "  </datafield>\n"
+        "</record>\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("<convert>"
+                                  "<marc"
+                                  " inputcharset=\"utf-8\""
+                                  " outputcharset=\"marc-8\""
+                                  " inputformat=\"xml\""
+                                  " outputformat=\"marc\""
+                                  "/>"
+                                  "</convert>",
+                                  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;
 }