X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Ficonv_encode_marc8.c;h=ac18e7945024b6c0819250831cd53796203432f9;hp=2d7b694664b70499bc98ba45e85d122825f1d78c;hb=1d3538f5ffc0a38434e421ae3f2c34618b50d392;hpb=43a9d38d20c1b1bcd1a03b2445a501d27526bd35 diff --git a/src/iconv_encode_marc8.c b/src/iconv_encode_marc8.c index 2d7b694..ac18e79 100644 --- a/src/iconv_encode_marc8.c +++ b/src/iconv_encode_marc8.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2011 Index Data + * Copyright (C) Index Data * See the file LICENSE for details. */ /** @@ -17,7 +17,6 @@ #include #include #include -#include #include #include @@ -59,7 +58,7 @@ static void init_marc8(yaz_iconv_encoder_t w) data->write_marc8_g1 = 0; } -static size_t yaz_write_marc8_page_chr(yaz_iconv_t cd, +static size_t yaz_write_marc8_page_chr(yaz_iconv_t cd, struct encoder_data *w, char **outbuf, size_t *outbytesleft, const char *page_chr); @@ -85,7 +84,7 @@ static unsigned long lookup_marc8(yaz_iconv_t cd, size_t inbytesleft, no_read_sub = 0; unsigned long x; - *utf8_outbuf = '\0'; + *utf8_outbuf = '\0'; inp = (unsigned char *) utf8_buf; inbytesleft = strlen(utf8_buf); @@ -211,7 +210,7 @@ static size_t flush_combos(yaz_iconv_t cd, { *(*outbuf)++ = w->write_marc8_second_half_char; (*outbytesleft)--; - } + } w->write_marc8_last = 0; w->write_marc8_ncr = 0; @@ -220,7 +219,7 @@ static size_t flush_combos(yaz_iconv_t cd, return 0; } -static size_t yaz_write_marc8_page_chr(yaz_iconv_t cd, +static size_t yaz_write_marc8_page_chr(yaz_iconv_t cd, struct encoder_data *w, char **outbuf, size_t *outbytesleft, const char *page_chr) @@ -235,17 +234,17 @@ static size_t yaz_write_marc8_page_chr(yaz_iconv_t cd, { size_t plen = 0; const char *page_out = page_chr; - + if (*outbytesleft < 8) { yaz_iconv_set_errno(cd, YAZ_ICONV_E2BIG); - + return (size_t) (-1); } if (*old_page_chr) { - if (!strcmp(*old_page_chr, ESC "p") + if (!strcmp(*old_page_chr, ESC "p") || !strcmp(*old_page_chr, ESC "g") || !strcmp(*old_page_chr, ESC "b")) { @@ -284,15 +283,23 @@ static size_t yaz_write_marc8_2(yaz_iconv_t cd, struct encoder_data *w, if (!y) { - if (loss_mode == 0) - return (size_t) (-1); page_chr = ESC "(B"; - if (loss_mode == 1) - y = '|'; - else + switch (loss_mode) { - y = x; + case 0: + return (size_t) (-1); + case 1: + y = '|'; + break; + case 2: + y = x; enable_ncr = 1; + break; + case 3: + if (x < 32 && x != 27) + y = x; + else + return (size_t) (-1); } } @@ -357,7 +364,7 @@ static size_t yaz_write_marc8_generic(yaz_iconv_t cd, struct encoder_data *w, int ncr = w->write_marc8_ncr; const char *lpage = w->write_marc8_lpage; size_t r; - + r = yaz_write_marc8_2(cd, w, x1, outbuf, outbytesleft, loss_mode); if (r) @@ -402,6 +409,14 @@ static size_t write_marc8_lossless(yaz_iconv_t cd, yaz_iconv_encoder_t e, x, outbuf, outbytesleft, 2); } +static size_t write_marc8_control(yaz_iconv_t cd, yaz_iconv_encoder_t e, + unsigned long x, + char **outbuf, size_t *outbytesleft) +{ + return yaz_write_marc8_generic(cd, (struct encoder_data *) e->data, + x, outbuf, outbytesleft, 3); +} + static void destroy_marc8(yaz_iconv_encoder_t e) { xfree(e->data); @@ -409,7 +424,7 @@ static void destroy_marc8(yaz_iconv_encoder_t e) yaz_iconv_encoder_t yaz_marc8_encoder(const char *tocode, yaz_iconv_encoder_t e) - + { if (!yaz_matchstr(tocode, "MARC8")) e->write_handle = write_marc8_normal; @@ -419,6 +434,8 @@ yaz_iconv_encoder_t yaz_marc8_encoder(const char *tocode, e->write_handle = write_marc8_lossy; else if (!yaz_matchstr(tocode, "MARC8lossless")) e->write_handle = write_marc8_lossless; + else if (!yaz_matchstr(tocode, "MARC8c")) + e->write_handle = write_marc8_control; else return 0;