X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fsiconv.c;h=1eb66c455b943e255b5bc5cf1e118de538e88a30;hb=719e0dcf2d15c08086a06457701e21c6aff3d791;hp=9467237aa52aedfa674c7146ff001847ec089182;hpb=9ee70f4c22c4990e7fe62a5238caa6b4e71f6a0f;p=yaz-moved-to-github.git diff --git a/src/siconv.c b/src/siconv.c index 9467237..1eb66c4 100644 --- a/src/siconv.c +++ b/src/siconv.c @@ -2,7 +2,7 @@ * Copyright (c) 1997-2004, Index Data * See the file LICENSE for details. * - * $Id: siconv.c,v 1.4 2004-03-15 22:51:10 adam Exp $ + * $Id: siconv.c,v 1.5 2004-03-16 13:12:43 adam Exp $ */ /* mini iconv and wrapper for system iconv library (if present) */ @@ -25,10 +25,23 @@ #include unsigned long yaz_marc8_conv (unsigned char *inp, size_t inbytesleft, - size_t *no_read); - -unsigned long yaz_marc8_cjk_conv (unsigned char *inp, size_t inbytesleft, - size_t *no_read); + size_t *no_read); +unsigned long yaz_marc8_2_conv (unsigned char *inp, size_t inbytesleft, + size_t *no_read); +unsigned long yaz_marc8_3_conv (unsigned char *inp, size_t inbytesleft, + size_t *no_read); +unsigned long yaz_marc8_4_conv (unsigned char *inp, size_t inbytesleft, + size_t *no_read); +unsigned long yaz_marc8_5_conv (unsigned char *inp, size_t inbytesleft, + size_t *no_read); +unsigned long yaz_marc8_6_conv (unsigned char *inp, size_t inbytesleft, + size_t *no_read); +unsigned long yaz_marc8_7_conv (unsigned char *inp, size_t inbytesleft, + size_t *no_read); +unsigned long yaz_marc8_8_conv (unsigned char *inp, size_t inbytesleft, + size_t *no_read); +unsigned long yaz_marc8_9_conv (unsigned char *inp, size_t inbytesleft, + size_t *no_read); struct yaz_iconv_struct { int my_errno; @@ -226,7 +239,7 @@ static unsigned long yaz_read_marc8 (yaz_iconv_t cd, unsigned char *inp, size_t inbytesleft0 = inbytesleft; inp++; inbytesleft--; - while(inbytesleft > 0 && strchr("(,$", *inp)) + while(inbytesleft > 0 && strchr("(,$!", *inp)) { inbytesleft--; inp++; @@ -237,17 +250,6 @@ static unsigned long yaz_read_marc8 (yaz_iconv_t cd, unsigned char *inp, cd->my_errno = YAZ_ICONV_EINVAL; return 0; } - if (*inp == '!') - { - if (inbytesleft <= 1) - { - *no_read = 0; - cd->my_errno = YAZ_ICONV_EINVAL; - return 0; - } - inbytesleft--; - inp++; - } cd->marc8_esc_mode = *inp++; inbytesleft--; (*no_read) += inbytesleft0 - inbytesleft; @@ -261,20 +263,44 @@ static unsigned long yaz_read_marc8 (yaz_iconv_t cd, unsigned char *inp, switch(cd->marc8_esc_mode) { - case 'B': - case 'E': + case 'B': /* Basic ASCII */ + case 'E': /* ANSEL */ + case 's': /* ASCII */ x = yaz_marc8_conv(inp, inbytesleft, &no_read_sub); - *no_read += no_read_sub; - return x; - case '1': - x = yaz_marc8_cjk_conv(inp, inbytesleft, &no_read_sub); - *no_read += no_read_sub; - return x; + break; + case 'g': /* Greek */ + x = yaz_marc8_2_conv(inp, inbytesleft, &no_read_sub); + break; + case 'b': /* Subscripts */ + x = yaz_marc8_3_conv(inp, inbytesleft, &no_read_sub); + break; + case 'p': /* Superscripts */ + x = yaz_marc8_4_conv(inp, inbytesleft, &no_read_sub); + break; + case '2': /* Basic Hebrew */ + x = yaz_marc8_5_conv(inp, inbytesleft, &no_read_sub); + break; + case 'N': /* Basic Cyrillic */ + case 'Q': /* Extended Cyrillic */ + x = yaz_marc8_6_conv(inp, inbytesleft, &no_read_sub); + break; + case '3': /* Basic Arabic */ + case '4': /* Extended Arabic */ + x = yaz_marc8_7_conv(inp, inbytesleft, &no_read_sub); + break; + case 'S': /* Greek */ + x = yaz_marc8_8_conv(inp, inbytesleft, &no_read_sub); + break; + case '1': /* Chinese, Japanese, Korean (EACC) */ + x = yaz_marc8_9_conv(inp, inbytesleft, &no_read_sub); + break; default: *no_read = 0; cd->my_errno = YAZ_ICONV_EILSEQ; return 0; } + *no_read += no_read_sub; + return x; } }