Extend MARC-8 to handle ESC-G0 EACC. Fix conversion order for MARCXML
[yaz-moved-to-github.git] / test / tsticonv.c
index 6410e57..1799002 100644 (file)
@@ -1,8 +1,8 @@
 /*
- * Copyright (c) 2002-2003, Index Data
+ * Copyright (c) 2002-2004, Index Data
  * See the file LICENSE for details.
  *
- * $Id: tsticonv.c,v 1.1 2003-10-27 12:21:38 adam Exp $
+ * $Id: tsticonv.c,v 1.2 2004-03-15 21:39:06 adam Exp $
  */
 
 #if HAVE_CONFIG_H
@@ -16,7 +16,7 @@
 #include <yaz/yaz-util.h>
 
 /* some test strings in ISO-8859-1 format */
-const char *buf[] = {
+static const char *iso_8859_1_a[] = {
     "ax" ,
     "\330",
     "eneb\346r",
@@ -25,8 +25,8 @@ const char *buf[] = {
     "\xfbr",
     0 };
 
-/* some test strings in MARC-8 format */
-const char *marc8_strings[] = {
+/* same test strings in MARC-8 format */
+static const char *marc8_a[] = {
     "ax",   
     "\xa2",          /* latin capital letter o with stroke */
     "eneb\xb5r",     /* latin small letter ae */
@@ -36,16 +36,21 @@ const char *marc8_strings[] = {
     0
 };
 
-static void marc8_tst()
+static void marc8_tst_a()
 {
     int i;
     yaz_iconv_t cd;
 
     cd = yaz_iconv_open("ISO-8859-1", "MARC8");
-    for (i = 0; buf[i]; i++)
+    if (!cd)
+    {
+       printf("tsticonv 10 yaz_iconv_open failed\n");
+       exit(10);
+    }
+    for (i = 0; iso_8859_1_a[i]; i++)
     {
         size_t r;
-        char *inbuf= (char*) marc8_strings[i];
+        char *inbuf= (char*) marc8_a[i];
         size_t inbytesleft = strlen(inbuf);
         char outbuf0[24];
         char *outbuf = outbuf0;
@@ -56,15 +61,131 @@ static void marc8_tst()
         {
             int e = yaz_iconv_error(cd);
 
-            printf ("tsticonv 6 i=%d e=%d\n", i, e);
-           exit(6);
+            printf ("tsticonv 11 i=%d e=%d\n", i, e);
+           exit(11);
+        }
+        if ((outbuf - outbuf0) != strlen(iso_8859_1_a[i]) 
+            || memcmp(outbuf0, iso_8859_1_a[i],
+                     strlen(iso_8859_1_a[i])))
+        {
+            printf ("tsticonv 12 i=%d\n", i);
+            printf ("buf=%s   out=%s\n", iso_8859_1_a[i], outbuf0);
+           exit(12);
+        }
+    }
+    yaz_iconv_close(cd);
+}
+
+static void marc8_tst_b()
+{
+    static const char *marc8_b[] = {
+       "\033$1" "\x21\x2B\x3B" /* FF1F */ "\033(B" "o",
+       "\033$1" "\x6F\x77\x29" /* AE0E */ "\x6F\x52\x7C" /* c0F4 */ "\033(B",
+       "\033$1"
+       "\x21\x50\x6E"  /* 7CFB */
+       "\x21\x51\x31"  /* 7D71 */
+       "\x21\x3A\x67"  /* 5B89 */
+       "\x21\x33\x22"  /* 5168 */
+       "\x21\x33\x53"  /* 5206 */
+       "\x21\x44\x2B"  /* 6790 */
+       "\033(B",
+       0
+    };
+    static const char *ucs4_b[] = {
+       "\x00\x00\xFF\x1F" "\x00\x00\x00o",
+       "\x00\x00\xAE\x0E" "\x00\x00\xC0\xF4",
+       "\x00\x00\x7C\xFB"
+       "\x00\x00\x7D\x71"
+       "\x00\x00\x5B\x89"
+       "\x00\x00\x51\x68"
+       "\x00\x00\x52\x06"
+       "\x00\x00\x67\x90",
+       0
+    };
+    int i;
+    yaz_iconv_t cd;
+
+    cd = yaz_iconv_open("UCS4", "MARC8");
+    if (!cd)
+    {
+       printf ("tsticonv 20 yaz_iconv_open failed\n");
+       exit(20);
+    }
+    for (i = 0; marc8_b[i]; i++)
+    {
+        size_t r;
+       size_t len;
+       size_t expect_len = (i == 2 ? 24 : 8);
+        char *inbuf= (char*) marc8_b[i];
+        size_t inbytesleft = strlen(inbuf);
+        char outbuf0[24];
+        char *outbuf = outbuf0;
+        size_t outbytesleft = sizeof(outbuf0);
+
+        r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+        if (r == (size_t) (-1))
+        {
+            int e = yaz_iconv_error(cd);
+
+            printf ("tsticonv 21 i=%d e=%d\n", i, e);
+           exit(21);
+        }
+       len = outbuf - outbuf0;
+       if (len != expect_len || memcmp(outbuf0, ucs4_b[i], len))
+        {
+            printf ("tsticonv 22 len=%d gotlen=%d i=%d\n", expect_len, len, i);
+           exit(22);
+        }
+    }
+    yaz_iconv_close(cd);
+}
+
+static void marc8_tst_c()
+{
+    static const char *ucs4_c[] = {
+       "\x00\x00\xFF\x1F\x00\x00\x00o",
+       "\x00\x00\xAE\x0E\x00\x00\xC0\xF4",
+       0
+    };
+    static const char *utf8_c[] = {
+       "\xEF\xBC\x9F\x6F",
+       "\xEA\xB8\x8E\xEC\x83\xB4",
+       0
+    };
+    
+    int i;
+    yaz_iconv_t cd;
+
+    cd = yaz_iconv_open("UTF8", "UCS4");
+    if (!cd)
+    {
+       printf ("tsticonv 30 yaz_iconv_open failed\n");
+       exit(30);
+    }
+    for (i = 0; ucs4_c[i]; i++)
+    {
+        size_t r;
+       size_t len;
+        char *inbuf= (char*) ucs4_c[i];
+        size_t inbytesleft = 8;
+        char outbuf0[24];
+        char *outbuf = outbuf0;
+        size_t outbytesleft = sizeof(outbuf0);
+
+        r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+        if (r == (size_t) (-1))
+        {
+            int e = yaz_iconv_error(cd);
+
+            printf ("tsticonv 31 i=%d e=%d\n", i, e);
+           exit(31);
         }
-        if ((outbuf - outbuf0) != strlen(buf[i]) 
-            || memcmp(outbuf0, buf[i], strlen(buf[i])))
+       len = outbuf - outbuf0;
+       if (len != strlen(utf8_c[i]) || memcmp(outbuf0, utf8_c[i], len))
         {
-            printf ("tsticonv 7 i=%d\n", i);
-            printf ("buf=%s   out=%s\n", buf[i], outbuf0);
-           exit(7);
+            printf ("tsticonv 32 len=%d gotlen=%d i=%d\n",
+                   strlen(utf8_c[i]), len, i);
+           exit(32);
         }
     }
     yaz_iconv_close(cd);
@@ -74,10 +195,10 @@ static void dconvert(int mandatory, const char *tmpcode)
 {
     int i;
     yaz_iconv_t cd;
-    for (i = 0; buf[i]; i++)
+    for (i = 0; iso_8859_1_a[i]; i++)
     {
         size_t r;
-       char *inbuf = (char*) buf[i];
+       char *inbuf = (char*) iso_8859_1_a[i];
        size_t inbytesleft = strlen(inbuf);
        char outbuf0[24];
        char outbuf1[10];
@@ -89,7 +210,7 @@ static void dconvert(int mandatory, const char *tmpcode)
         {
             if (!mandatory)
                 return;
-            printf ("tsticonv 1\n");
+            printf ("tsticonv code=%s 1\n", tmpcode);
            exit(1);
         }
        r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
@@ -97,7 +218,7 @@ static void dconvert(int mandatory, const char *tmpcode)
         {
             int e = yaz_iconv_error(cd);
 
-            printf ("tsticonv 2 e=%d\n", e);
+            printf ("tsticonv code=%s 2 e=%d\n", tmpcode, e);
            exit(2);
         }
        yaz_iconv_close(cd);
@@ -107,7 +228,7 @@ static void dconvert(int mandatory, const char *tmpcode)
         {
             if (!mandatory)
                 return;
-            printf ("tsticonv 3\n");
+            printf ("tsticonv code=%s 3\n", tmpcode);
            exit(3);
         }
        inbuf = outbuf0;
@@ -119,13 +240,15 @@ static void dconvert(int mandatory, const char *tmpcode)
        if (r == (size_t)(-1)) {
             int e = yaz_iconv_error(cd);
 
-            printf ("tsticonv 4 e=%d\n", e);
+            printf ("tsticonv code=%s 4 e=%d\n", tmpcode, e);
            exit(4);
        }
-       if (strlen(buf[i]) == (sizeof(outbuf1) - outbytesleft) &&
-            memcmp(outbuf1, buf[i], strlen(buf[i])))
+       if (strlen(iso_8859_1_a[i]) == 
+           (sizeof(outbuf1) - outbytesleft) &&
+            memcmp(outbuf1, iso_8859_1_a[i],
+                  strlen(iso_8859_1_a[i])))
         {
-            printf ("tsticonv 5\n");
+            printf ("tsticonv code=%s 5\n", tmpcode);
             exit(5);
        }
        yaz_iconv_close(cd);
@@ -137,7 +260,10 @@ int main (int argc, char **argv)
     dconvert(1, "UTF-8");
     dconvert(1, "ISO-8859-1");
     dconvert(1, "UCS4");
+    dconvert(1, "UCS4LE");
     dconvert(0, "CP865");
-    marc8_tst();
+    marc8_tst_a();
+    marc8_tst_b();
+    marc8_tst_c();
     exit (0);
 }