MARC 8 encoding: never pass through ESC
[yaz-moved-to-github.git] / src / iconv_encode_marc8.c
index 7fa89f9..e05874f 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 <yaz/snprintf.h>
@@ -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);
@@ -73,6 +72,11 @@ static unsigned long lookup_marc8(yaz_iconv_t cd,
     size_t utf8_outbytesleft = sizeof(utf8_buf)-1, r;
     int error_code;
 
+    if (x <= ' ' && x != 27)
+    {
+        *page_chr = ESC "(B";
+        return x;
+    }
     r = yaz_write_UTF8_char(x, &utf8_outbuf, &utf8_outbytesleft, &error_code);
     if (r == (size_t)(-1))
     {
@@ -85,7 +89,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 +215,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 +224,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 +239,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"))
             {
@@ -291,7 +295,7 @@ static size_t yaz_write_marc8_2(yaz_iconv_t cd, struct encoder_data *w,
             y = '|';
         else
         {
-            y = x; 
+            y = x;
             enable_ncr = 1;
         }
     }
@@ -357,7 +361,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)
@@ -409,7 +413,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;
@@ -437,7 +441,9 @@ yaz_iconv_encoder_t yaz_marc8_encoder(const char *tocode,
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab
  */
+