Fix yaz-marcdump segfault YAZ-801
[yaz-moved-to-github.git] / src / iconv_encode_danmarc.c
index 1afcf7c..bc7d62a 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2013 Index Data
+ * Copyright (C) Index Data
  * See the file LICENSE for details.
  */
 /**
@@ -25,14 +25,14 @@ static size_t write_danmarc(yaz_iconv_t cd, yaz_iconv_encoder_t en,
 {
     unsigned char *outp = (unsigned char *) *outbuf;
 
-    if (x == '@')
+    if (x == '@' || x == '*')
     {
         if (*outbytesleft < 2)
         {
             yaz_iconv_set_errno(cd, YAZ_ICONV_E2BIG);
             return (size_t)(-1);
         }
-        *outp++ = x;
+        *outp++ = '@';
         (*outbytesleft)--;
         *outp++ = x;
         (*outbytesleft)--;
@@ -48,15 +48,31 @@ static size_t write_danmarc(yaz_iconv_t cd, yaz_iconv_encoder_t en,
         (*outbytesleft)--;
     }
     else
-    {  /* full unicode, emit @XXXX */
+    {
         if (*outbytesleft < 6)
         {
             yaz_iconv_set_errno(cd, YAZ_ICONV_E2BIG);
             return (size_t)(-1);
         }
-        sprintf(*outbuf, "@%04lX", x);
-        outp += 5;
-        (*outbytesleft) -= 5;
+        switch (x)
+        {
+        case 0xa733:
+            *outp++ = '@';
+            *outp++ = 0xe5;
+            (*outbytesleft) -= 2;
+            break;
+        case 0xa732:
+            *outp++ = '@';
+            *outp++ = 0xc5;
+            (*outbytesleft) -= 2;
+            break;
+        default:
+            /* full unicode, emit @XXXX */
+            sprintf(*outbuf, "@%04lX", x);
+            outp += 5;
+            (*outbytesleft) -= 5;
+            break;
+        }
     }
     *outbuf = (char *) outp;
     return 0;