X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fsiconv.c;h=d2b78be68ac9f2793160689bc7a5ec7ce1253d59;hb=2b929cf75020ee215393a655f0403c849fed5ea9;hp=bdb20ee374efdc4619aecbe0bfb06870dbe999b9;hpb=cd6aeaa68dceee3c268dbb354fd32aadbc9fc942;p=yaz-moved-to-github.git diff --git a/src/siconv.c b/src/siconv.c index bdb20ee..d2b78be 100644 --- a/src/siconv.c +++ b/src/siconv.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: siconv.c,v 1.40 2007-05-03 22:20:45 adam Exp $ + * $Id: siconv.c,v 1.42 2007-05-30 08:22:03 adam Exp $ */ /** * \file siconv.c @@ -212,6 +212,7 @@ unsigned long yaz_read_UTF8_char(unsigned char *inp, { unsigned long x = 0; + *no_read = 0; /* by default */ if (inp[0] <= 0x7f) { x = inp[0]; @@ -219,75 +220,86 @@ unsigned long yaz_read_UTF8_char(unsigned char *inp, } else if (inp[0] <= 0xbf || inp[0] >= 0xfe) { - *no_read = 0; *error = YAZ_ICONV_EILSEQ; } else if (inp[0] <= 0xdf && inbytesleft >= 2) { - x = ((inp[0] & 0x1f) << 6) | (inp[1] & 0x3f); - if (x >= 0x80) - *no_read = 2; - else + if ((inp[1] & 0xc0) == 0x80) { - *no_read = 0; - *error = YAZ_ICONV_EILSEQ; + x = ((inp[0] & 0x1f) << 6) | (inp[1] & 0x3f); + if (x >= 0x80) + *no_read = 2; + else + *error = YAZ_ICONV_EILSEQ; } + else + *error = YAZ_ICONV_EILSEQ; } else if (inp[0] <= 0xef && inbytesleft >= 3) { - x = ((inp[0] & 0x0f) << 12) | ((inp[1] & 0x3f) << 6) | - (inp[2] & 0x3f); - if (x >= 0x800) - *no_read = 3; - else + if ((inp[1] & 0xc0) == 0x80 && (inp[2] & 0xc0) == 0x80) { - *no_read = 0; - *error = YAZ_ICONV_EILSEQ; + x = ((inp[0] & 0x0f) << 12) | ((inp[1] & 0x3f) << 6) | + (inp[2] & 0x3f); + if (x >= 0x800) + *no_read = 3; + else + *error = YAZ_ICONV_EILSEQ; } - } + else + *error = YAZ_ICONV_EILSEQ; + } else if (inp[0] <= 0xf7 && inbytesleft >= 4) { - x = ((inp[0] & 0x07) << 18) | ((inp[1] & 0x3f) << 12) | - ((inp[2] & 0x3f) << 6) | (inp[3] & 0x3f); - if (x >= 0x10000) - *no_read = 4; - else + if ((inp[1] & 0xc0) == 0x80 && (inp[2] & 0xc0) == 0x80 + && (inp[3] & 0xc0) == 0x80) { - *no_read = 0; - *error = YAZ_ICONV_EILSEQ; + x = ((inp[0] & 0x07) << 18) | ((inp[1] & 0x3f) << 12) | + ((inp[2] & 0x3f) << 6) | (inp[3] & 0x3f); + if (x >= 0x10000) + *no_read = 4; + else + *error = YAZ_ICONV_EILSEQ; } + else + *error = YAZ_ICONV_EILSEQ; } else if (inp[0] <= 0xfb && inbytesleft >= 5) { - x = ((inp[0] & 0x03) << 24) | ((inp[1] & 0x3f) << 18) | - ((inp[2] & 0x3f) << 12) | ((inp[3] & 0x3f) << 6) | - (inp[4] & 0x3f); - if (x >= 0x200000) - *no_read = 5; - else + if ((inp[1] & 0xc0) == 0x80 && (inp[2] & 0xc0) == 0x80 + && (inp[3] & 0xc0) == 0x80 && (inp[4] & 0xc0) == 0x80) { - *no_read = 0; - *error = YAZ_ICONV_EILSEQ; + x = ((inp[0] & 0x03) << 24) | ((inp[1] & 0x3f) << 18) | + ((inp[2] & 0x3f) << 12) | ((inp[3] & 0x3f) << 6) | + (inp[4] & 0x3f); + if (x >= 0x200000) + *no_read = 5; + else + *error = YAZ_ICONV_EILSEQ; } + else + *error = YAZ_ICONV_EILSEQ; } else if (inp[0] <= 0xfd && inbytesleft >= 6) { - x = ((inp[0] & 0x01) << 30) | ((inp[1] & 0x3f) << 24) | - ((inp[2] & 0x3f) << 18) | ((inp[3] & 0x3f) << 12) | - ((inp[4] & 0x3f) << 6) | (inp[5] & 0x3f); - if (x >= 0x4000000) - *no_read = 6; - else + if ((inp[1] & 0xc0) == 0x80 && (inp[2] & 0xc0) == 0x80 + && (inp[3] & 0xc0) == 0x80 && (inp[4] & 0xc0) == 0x80 + && (inp[5] & 0xc0) == 0x80) { - *no_read = 0; - *error = YAZ_ICONV_EILSEQ; + x = ((inp[0] & 0x01) << 30) | ((inp[1] & 0x3f) << 24) | + ((inp[2] & 0x3f) << 18) | ((inp[3] & 0x3f) << 12) | + ((inp[4] & 0x3f) << 6) | (inp[5] & 0x3f); + if (x >= 0x4000000) + *no_read = 6; + else + *error = YAZ_ICONV_EILSEQ; } + else + *error = YAZ_ICONV_EILSEQ; } else - { - *no_read = 0; - *error = YAZ_ICONV_EINVAL; - } + *error = YAZ_ICONV_EINVAL; /* incomplete sentence */ + return x; } @@ -1706,6 +1718,8 @@ yaz_iconv_t yaz_iconv_open (const char *tocode, const char *fromcode) cd->read_handle = yaz_read_advancegreek; else if (!yaz_matchstr(fromcode, "iso54281984")) cd->read_handle = yaz_read_iso5428_1984; + else if (!yaz_matchstr(fromcode, "iso5428:1984")) + cd->read_handle = yaz_read_iso5428_1984; #if HAVE_WCHAR_H else if (!yaz_matchstr(fromcode, "WCHAR_T")) cd->read_handle = yaz_read_wchar_t; @@ -1740,6 +1754,10 @@ yaz_iconv_t yaz_iconv_open (const char *tocode, const char *fromcode) { cd->write_handle = yaz_write_iso5428_1984; } + else if (!yaz_matchstr(tocode, "iso5428:1984")) + { + cd->write_handle = yaz_write_iso5428_1984; + } #if HAVE_WCHAR_H else if (!yaz_matchstr(tocode, "WCHAR_T")) cd->write_handle = yaz_write_wchar_t;