X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fsiconv.c;h=b04072931c0fd57cc3e61b2e3859954164d8bcd1;hb=8d691989077a0addcbd840d769dce6700f3d9622;hp=cc902101fc6b117b5f3eafbb09c26fcc12864c43;hpb=41f87f5dc9c06c045eb94157dbd4009ad52bc02a;p=yaz-moved-to-github.git diff --git a/src/siconv.c b/src/siconv.c index cc90210..b040729 100644 --- a/src/siconv.c +++ b/src/siconv.c @@ -1,8 +1,8 @@ /* - * Copyright (C) 1995-2006, Index Data ApS + * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: siconv.c,v 1.26 2006-08-27 19:04:03 adam Exp $ + * $Id: siconv.c,v 1.32 2007-01-03 08:42:15 adam Exp $ */ /** * \file siconv.c @@ -100,6 +100,7 @@ struct yaz_iconv_struct { unsigned long write_marc8_comb_ch[8]; size_t write_marc8_comb_no; + unsigned write_marc8_second_half_char; unsigned long write_marc8_last; const char *write_marc8_page_chr; }; @@ -183,6 +184,7 @@ static unsigned long yaz_read_ISO8859_1 (yaz_iconv_t cd, unsigned char *inp, return x; } + static size_t yaz_init_UTF8 (yaz_iconv_t cd, unsigned char *inp, size_t inbytesleft, size_t *no_read) { @@ -431,7 +433,7 @@ static unsigned long yaz_read_marc8_comb(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++; @@ -743,7 +745,7 @@ static unsigned long lookup_marc8(yaz_iconv_t cd, x = yaz_marc8r_9_conv(inp, inbytesleft, &no_read_sub, comb); if (x) { - *page_chr = "\033(1"; + *page_chr = "\033$1"; return x; } cd->my_errno = YAZ_ICONV_EILSEQ; @@ -755,7 +757,7 @@ static size_t flush_combos(yaz_iconv_t cd, char **outbuf, size_t *outbytesleft) { unsigned long y = cd->write_marc8_last; - unsigned char byte, second_half = 0; + unsigned char byte; char out_buf[10]; size_t i, out_no = 0; @@ -782,25 +784,21 @@ static size_t flush_combos(yaz_iconv_t cd, { /* all MARC-8 combined characters are simple bytes */ byte = (unsigned char )(cd->write_marc8_comb_ch[i]); - if (byte == 0xEB) - second_half = 0xEC; - else if (byte == 0xFA) - second_half = 0xFB; - *(*outbuf)++ = byte; (*outbytesleft)--; } memcpy(*outbuf, out_buf, out_no); *outbuf += out_no; (*outbytesleft) -= out_no; - if (second_half) + if (cd->write_marc8_second_half_char) { - *(*outbuf)++ = second_half; + *(*outbuf)++ = cd->write_marc8_second_half_char; (*outbytesleft)--; } cd->write_marc8_last = 0; cd->write_marc8_comb_no = 0; + cd->write_marc8_second_half_char = 0; return 0; } @@ -817,6 +815,11 @@ static size_t yaz_write_marc8_2(yaz_iconv_t cd, unsigned long x, if (comb) { + if (x == 0x0361) + cd->write_marc8_second_half_char = 0xEC; + else if (x == 0x0360) + cd->write_marc8_second_half_char = 0xFB; + if (cd->write_marc8_comb_no < 6) cd->write_marc8_comb_ch[cd->write_marc8_comb_no++] = y; } @@ -949,13 +952,6 @@ yaz_iconv_t yaz_iconv_open (const char *tocode, const char *fromcode) cd->read_handle = 0; cd->init_handle = 0; cd->my_errno = YAZ_ICONV_UNKNOWN; - cd->marc8_esc_mode = 'B'; - cd->comb_offset = cd->comb_size = 0; - cd->compose_char = 0; - - cd->write_marc8_comb_no = 0; - cd->write_marc8_last = 0; - cd->write_marc8_page_chr = "\033(B"; /* a useful hack: if fromcode has leading @, the library not use YAZ's own conversions .. */ @@ -1065,7 +1061,7 @@ size_t yaz_iconv(yaz_iconv_t cd, char **inbuf, size_t *inbytesleft, { if (cd->init_handle) { - size_t no_read; + size_t no_read = 0; size_t r = (cd->init_handle)(cd, (unsigned char *) *inbuf, *inbytesleft, &no_read); if (r) @@ -1078,6 +1074,16 @@ size_t yaz_iconv(yaz_iconv_t cd, char **inbuf, size_t *inbytesleft, *inbytesleft -= no_read; *inbuf += no_read; } + cd->marc8_esc_mode = 'B'; + + cd->comb_offset = cd->comb_size = 0; + cd->compose_char = 0; + + cd->write_marc8_comb_no = 0; + cd->write_marc8_second_half_char = 0; + cd->write_marc8_last = 0; + cd->write_marc8_page_chr = "\033(B"; + cd->init_flag = 0; cd->unget_x = 0; cd->no_read_x = 0;