MARC8: keep existing behavior for control characters
[yaz-moved-to-github.git] / src / iconv_decode_marc8.c
index 694a5ed..d0fa875 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2009 Index Data
+ * Copyright (C) 1995-2013 Index Data
  * See the file LICENSE for details.
  */
 /**
@@ -17,7 +17,6 @@
 #include <assert.h>
 #include <errno.h>
 #include <string.h>
-#include <ctype.h>
 
 #include <yaz/xmalloc.h>
 #include "iconv-p.h"
@@ -30,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;
@@ -63,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
@@ -178,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;
@@ -247,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;
 }
 
@@ -260,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;
@@ -279,7 +306,9 @@ yaz_iconv_decoder_t yaz_marc8_decoder(const char *fromcode,
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab
  */
+