X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=test%2Ftsticonv.c;h=5bc649a4e0f54c7b0a0c68e0e767b24b69d0a318;hp=b39923bf7f1a033b7b8005e27a788bacfc0391c9;hb=125918b4266de689eeee8067074a7da24c92e4e1;hpb=9fb32b9ec35a83d916e0227c751d4a7925301d34 diff --git a/test/tsticonv.c b/test/tsticonv.c index b39923b..5bc649a 100644 --- a/test/tsticonv.c +++ b/test/tsticonv.c @@ -1,8 +1,6 @@ -/* - * Copyright (C) 1995-2007, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2008 Index Data * See the file LICENSE for details. - * - * $Id: tsticonv.c,v 1.34 2008-03-05 21:21:22 adam Exp $ */ #if HAVE_CONFIG_H @@ -89,11 +87,12 @@ static int tst_convert_l(yaz_iconv_t cd, size_t in_len, const char *in_buf, outbuf - outbuf0, outbuf0); } -static int tst_convert(yaz_iconv_t cd, const char *buf, const char *cmpbuf) +static int tst_convert_x(yaz_iconv_t cd, const char *buf, const char *cmpbuf, + int expect_error) { - int ret = 0; + int ret = 1; WRBUF b = wrbuf_alloc(); - char outbuf[12]; + char outbuf[16]; size_t inbytesleft = strlen(buf); const char *inp = buf; int rounds = 0; @@ -108,7 +107,12 @@ static int tst_convert(yaz_iconv_t cd, const char *buf, const char *cmpbuf) { int e = yaz_iconv_error(cd); if (e != YAZ_ICONV_E2BIG) + { + if (expect_error != -1) + if (e != expect_error) + ret = 0; break; + } } else { @@ -116,16 +120,20 @@ static int tst_convert(yaz_iconv_t cd, const char *buf, const char *cmpbuf) char *outp = outbuf; r = yaz_iconv(cd, 0, 0, &outp, &outbytesleft); wrbuf_write(b, outbuf, outp - outbuf); + if (expect_error != -1) + if (expect_error) + ret = 0; break; } } if (wrbuf_len(b) == strlen(cmpbuf) && !memcmp(cmpbuf, wrbuf_buf(b), wrbuf_len(b))) - ret = 1; + ; else { WRBUF w = wrbuf_alloc(); + ret = 0; wrbuf_rewind(w); wrbuf_puts_escaped(w, buf); yaz_log(YLOG_LOG, "input %s", wrbuf_cstr(w)); @@ -145,6 +153,10 @@ static int tst_convert(yaz_iconv_t cd, const char *buf, const char *cmpbuf) return ret; } +static int tst_convert(yaz_iconv_t cd, const char *buf, const char *cmpbuf) +{ + return tst_convert_x(cd, buf, cmpbuf, 0); +} /* some test strings in ISO-8859-1 format */ static const char *iso_8859_1_a[] = { @@ -388,19 +400,29 @@ static void tst_marc8_to_utf8(void) if (!cd) return; - /* bug #2115 */ - YAZ_CHECK(tst_convert(cd, ESC "(N" ESC ")Qp" ESC "(B", "\xd0\x9f")); - - YAZ_CHECK(tst_convert(cd, "Cours de math", "Cours de math")); /* COMBINING ACUTE ACCENT */ YAZ_CHECK(tst_convert(cd, "Cours de mathâe", "Cours de mathe\xcc\x81")); - YAZ_CHECK(tst_convert(cd, "a\xea\x1e", "a\x1e\xcc\x8a")); + YAZ_CHECK(tst_convert(cd, "\xea" "a", "a\xcc\x8a")); + YAZ_CHECK(tst_convert(cd, "a" "\xea" "\x1e", "a" "\x1e\xcc\x8a")); + YAZ_CHECK(tst_convert(cd, "a" "\xea" "p", "a" "p\xcc\x8a")); + + YAZ_CHECK(tst_convert_x(cd, "a\xea", "a", YAZ_ICONV_EINVAL)); + YAZ_CHECK(tst_convert(cd, "p", "\xcc\x8a")); /* note: missing p */ + yaz_iconv(cd, 0, 0, 0, 0); /* incomplete. so we have to reset */ + + /* bug #2115 */ + YAZ_CHECK(tst_convert(cd, ESC "(N" ESC ")Qp" ESC "(B", "\xd0\x9f")); + + YAZ_CHECK(tst_convert_x(cd, ESC , "", YAZ_ICONV_EINVAL)); + YAZ_CHECK(tst_convert_x(cd, ESC "(", "", YAZ_ICONV_EINVAL)); + YAZ_CHECK(tst_convert_x(cd, ESC "(B", "", 0)); - YAZ_CHECK(tst_convert(cd, "a\xea", "a")); + YAZ_CHECK(tst_convert(cd, ESC "(B" "\x31", "1")); /* ASCII in G0 */ + YAZ_CHECK(tst_convert(cd, ESC ")B" "\xB1", "1")); /* ASCII in G1 */ yaz_iconv_close(cd); } @@ -465,9 +487,9 @@ static void tst_marc8_to_latin1(void) yaz_iconv_close(cd); } -static void tst_utf8_to_marc8(void) +static void tst_utf8_to_marc8(const char *marc8_type) { - yaz_iconv_t cd = yaz_iconv_open("MARC8", "UTF-8"); + yaz_iconv_t cd = yaz_iconv_open(marc8_type, "UTF-8"); YAZ_CHECK(cd); if (!cd) @@ -530,6 +552,18 @@ static void tst_utf8_to_marc8(void) "\x1B\x28\x42" "\xE5\xE5" "\x1B\x24\x31" "\x69\x25\x3F" "\x69\x21\x3C" "\x1B\x28\x42")); + + + /** bug #2120 */ + YAZ_CHECK(tst_convert(cd, + "\xCE\x94\xCE\xB5\xCF\x84" + "\xCE\xBF\xCF\x81\xCE\xB1" + "\xCE\xBA\xCE\xB7\xCF\x82\x2C", + + "\x1B\x28\x53\x45\x66\x78\x72\x75" + "\x61\x6D\x6A\x77" + "\x1B\x28\x42\x2C" + )); { char *inbuf0 = "\xe2\x81\xb0"; @@ -566,6 +600,7 @@ static void tst_utf8_to_marc8(void) #endif YAZ_CHECK(strcmp("\033p0\x1bs", outbuf0) == 0); } + yaz_iconv(cd, 0, 0, 0, 0); yaz_iconv_close(cd); } @@ -646,6 +681,27 @@ static void tst_utf8_codes(void) YAZ_CHECK(utf8_check(100000000)); } +static void tst_danmarc_to_latin1(void) +{ + yaz_iconv_t cd = yaz_iconv_open("iso-8859-1", "danmarc"); + + YAZ_CHECK(cd); + if (!cd) + return; + + YAZ_CHECK(tst_convert(cd, "ax", "ax")); + + YAZ_CHECK(tst_convert(cd, "a@@b", "a@b")); + YAZ_CHECK(tst_convert(cd, "a@@@@b", "a@@b")); + YAZ_CHECK(tst_convert(cd, "@000ab", "\nb")); + + YAZ_CHECK(tst_convert(cd, "@\xe5", "aa")); + YAZ_CHECK(tst_convert(cd, "@\xc5.", "Aa.")); + + yaz_iconv_close(cd); +} + + int main (int argc, char **argv) { YAZ_CHECK_INIT(argc, argv); @@ -661,7 +717,11 @@ int main (int argc, char **argv) tst_advance_to_utf8(); tst_utf8_to_advance(); - tst_utf8_to_marc8(); + tst_utf8_to_marc8("marc8"); + tst_utf8_to_marc8("marc8lossy"); + tst_utf8_to_marc8("marc8lossless"); + + tst_danmarc_to_latin1(); tst_latin1_to_marc8();