Add new function wrbuf_iconv_write_x
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 15 Mar 2011 08:43:18 +0000 (09:43 +0100)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 15 Mar 2011 08:43:18 +0000 (09:43 +0100)
Is a generic WRBUF writer for iconv+cdata as an option . Returns
if writing was successful or not.

include/yaz/wrbuf.h
src/wrbuf.c

index b222216..56b5e60 100644 (file)
@@ -124,6 +124,19 @@ YAZ_EXPORT void wrbuf_printf(WRBUF b, const char *fmt, ...)
         __attribute__ ((format (printf, 2, 3)))
 #endif
         ;
         __attribute__ ((format (printf, 2, 3)))
 #endif
         ;
+
+/** \brief general writer of string using iconv and cdata
+    \param b WRBUF
+    \param cd iconv handle (0 for no conversion)
+    \param buf buffer
+    \param size size of buffer
+    \param cdata non-zero for CDATA; 0 for cdata
+    \returns -1 if invalid sequence was encountered (truncation in effect)
+    \returns 0 if buffer could be converted and written
+*/
+int wrbuf_iconv_write_x(WRBUF b, yaz_iconv_t cd, const char *buf,
+                        size_t size, int cdata);
+
 /** \brief iconv converts buffer and appends to WRBUF
     \param b WRBUF
     \param cd iconv handle
 /** \brief iconv converts buffer and appends to WRBUF
     \param b WRBUF
     \param cd iconv handle
index fd73beb..06e49de 100644 (file)
@@ -152,9 +152,10 @@ void wrbuf_printf(WRBUF b, const char *fmt, ...)
     va_end(ap);
 }
 
     va_end(ap);
 }
 
-static void wrbuf_iconv_write_x(WRBUF b, yaz_iconv_t cd, const char *buf,
-                                size_t size, int cdata)
+int wrbuf_iconv_write_x(WRBUF b, yaz_iconv_t cd, const char *buf,
+                        size_t size, int cdata)
 {
 {
+    int ret = 0;
     if (cd)
     {
         char outbuf[128];
     if (cd)
     {
         char outbuf[128];
@@ -170,7 +171,10 @@ static void wrbuf_iconv_write_x(WRBUF b, yaz_iconv_t cd, const char *buf,
             {
                 int e = yaz_iconv_error(cd);
                 if (e != YAZ_ICONV_E2BIG)
             {
                 int e = yaz_iconv_error(cd);
                 if (e != YAZ_ICONV_E2BIG)
+                {
+                    ret = -1;
                     break;
                     break;
+                }
             }
             if (cdata)
                 wrbuf_xmlputs_n(b, outbuf, outp - outbuf);
             }
             if (cdata)
                 wrbuf_xmlputs_n(b, outbuf, outp - outbuf);
@@ -185,6 +189,7 @@ static void wrbuf_iconv_write_x(WRBUF b, yaz_iconv_t cd, const char *buf,
         else
             wrbuf_write(b, buf, size);
     }
         else
             wrbuf_write(b, buf, size);
     }
+    return ret;
 }
 
 void wrbuf_iconv_write(WRBUF b, yaz_iconv_t cd, const char *buf, size_t size)
 }
 
 void wrbuf_iconv_write(WRBUF b, yaz_iconv_t cd, const char *buf, size_t size)