X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Ficonv_decode_marc8.c;h=d0fa8753126748897710134a0a653e6bb3e7cdd2;hp=915a68c7754fb0d04f7a889a05428262fc4e7bf6;hb=f96a9bc9697b4b6b63ce52055ba0cfbe6cf6652a;hpb=4f3bcae93d51a26709c12b51261c3d95af610cb2 diff --git a/src/iconv_decode_marc8.c b/src/iconv_decode_marc8.c index 915a68c..d0fa875 100644 --- a/src/iconv_decode_marc8.c +++ b/src/iconv_decode_marc8.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2011 Index Data + * Copyright (C) 1995-2013 Index Data * See the file LICENSE for details. */ /** @@ -29,6 +29,7 @@ struct decoder_data { int comb_size; unsigned long comb_x[8]; size_t comb_no_read[8]; + int control_mode; }; yaz_conv_func_t yaz_marc8_42_conv; @@ -62,7 +63,7 @@ static unsigned long read_marc8(yaz_iconv_t cd, yaz_iconv_decoder_t d, *no_read = data->comb_no_read[data->comb_offset]; x = data->comb_x[data->comb_offset]; - /* special case for double-diacritic combining characters, + /* special case for double-diacritic combining characters, INVERTED BREVE and DOUBLE TILDE. We'll increment the no_read counter by 1, since we want to skip over the processing of the closing ligature character @@ -177,6 +178,11 @@ static unsigned long yaz_read_marc8_comb(yaz_iconv_t cd, *no_read += 1; return ' '; } + else if (*inp < ' ' && data->control_mode) + { + *no_read += 1; + return *inp; + } else { unsigned long x; @@ -246,6 +252,18 @@ static size_t init_marc8(yaz_iconv_t cd, yaz_iconv_decoder_t d, data->g0_mode = 'B'; data->g1_mode = 'E'; data->comb_offset = data->comb_size = 0; + data->control_mode = 0; + return 0; +} + +static size_t init_marc8c(yaz_iconv_t cd, yaz_iconv_decoder_t d, + unsigned char *inp, + size_t inbytesleft, size_t *no_read) +{ + struct decoder_data *data = (struct decoder_data *) d->data; + + init_marc8(cd, d, inp, inbytesleft, no_read); + data->control_mode = 1; return 0; } @@ -259,16 +277,26 @@ yaz_iconv_decoder_t yaz_marc8_decoder(const char *fromcode, yaz_iconv_decoder_t d) { if (!yaz_matchstr(fromcode, "MARC8") || !yaz_matchstr(fromcode, "ANSEL")) + { d->read_handle = read_marc8; + d->init_handle = init_marc8; + } else if (!yaz_matchstr(fromcode, "MARC8s")) + { d->read_handle = read_marc8s; + d->init_handle = init_marc8; + } + else if (!yaz_matchstr(fromcode, "MARC8c")) + { + d->read_handle = read_marc8; + d->init_handle = init_marc8c; + } else return 0; { struct decoder_data *data = (struct decoder_data *) xmalloc(sizeof(*data)); d->data = data; - d->init_handle = init_marc8; d->destroy_handle = destroy_marc8; } return d;