wrbuf: new utility wrbuf_iconv_write2
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 6 Dec 2013 10:17:11 +0000 (11:17 +0100)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 6 Dec 2013 10:17:11 +0000 (11:17 +0100)
which is a better wrbuf_iconv_write_x ..

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

index 3864c3e..b583ce2 100644 (file)
@@ -139,7 +139,22 @@ YAZ_EXPORT void wrbuf_printf(WRBUF b, const char *fmt, ...)
 #endif
         ;
 
 #endif
         ;
 
-/** \brief general writer of string using iconv and cdata
+/** \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 wfunc write handler (that takes WRBUF only)
+    \returns -1 if invalid sequence was encountered (truncation in effect)
+    \returns 0 if buffer could be converted and written
+*/
+int wrbuf_iconv_write2(WRBUF b, yaz_iconv_t cd, const char *buf,
+                       size_t size,
+                       void (*wfunc)(WRBUF, const char *, size_t));
+
+/** \brief writer of string using iconv and cdata
+
+    Obsolete: use wrbuf_iconv_write2 instead.
     \param b WRBUF
     \param cd iconv handle (0 for no conversion)
     \param buf buffer
     \param b WRBUF
     \param cd iconv handle (0 for no conversion)
     \param buf buffer
@@ -149,9 +164,13 @@ YAZ_EXPORT void wrbuf_printf(WRBUF b, const char *fmt, ...)
     \returns 0 if buffer could be converted and written
 */
 int wrbuf_iconv_write_x(WRBUF b, yaz_iconv_t cd, const char *buf,
     \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);
+                        size_t size, int cdata)
+#ifdef __GNUC__
+    __attribute__ ((deprecated))
+#endif
+    ;
 
 
-/** \brief iconv converts buffer and appends to WRBUF
+/** \brief Converts buffer using iconv and appends to WRBUF
     \param b WRBUF
     \param cd iconv handle
     \param buf buffer
     \param b WRBUF
     \param cd iconv handle
     \param buf buffer
@@ -160,7 +179,7 @@ int wrbuf_iconv_write_x(WRBUF b, yaz_iconv_t cd, const char *buf,
 YAZ_EXPORT void wrbuf_iconv_write(WRBUF b, yaz_iconv_t cd, const char *buf,
                                  size_t size);
 
 YAZ_EXPORT void wrbuf_iconv_write(WRBUF b, yaz_iconv_t cd, const char *buf,
                                  size_t size);
 
-/** \brief iconv converts buffer and appends to WRBUF as XML CDATA
+/** \brief Converts buffer using iconv and appends to WRBUF as XML CDATA
     \param b WRBUF
     \param cd iconv handle
     \param buf buffer
     \param b WRBUF
     \param cd iconv handle
     \param buf buffer
index 2e37091..b96010d 100644 (file)
@@ -31,10 +31,11 @@ static void opac_element_str(WRBUF wrbuf, yaz_iconv_t cd1, yaz_iconv_t cd2,
         wrbuf_puts(wrbuf, ">");
 
         pos = wrbuf->pos; /* save position */
         wrbuf_puts(wrbuf, ">");
 
         pos = wrbuf->pos; /* save position */
-        if (wrbuf_iconv_write_x(wrbuf, cd1, data, strlen(data), 1) && cd2)
+        if (wrbuf_iconv_write2(wrbuf, cd1, data, strlen(data), wrbuf_xmlputs_n)
+            && cd2)
         {
             wrbuf->pos = pos; /* rewind to pos */
         {
             wrbuf->pos = pos; /* rewind to pos */
-            wrbuf_iconv_write_x(wrbuf, cd2, data, strlen(data), 1);
+            wrbuf_iconv_write2(wrbuf, cd2, data, strlen(data), wrbuf_xmlputs_n);
         }
         wrbuf_puts(wrbuf, "</");
         wrbuf_puts(wrbuf, elem);
         }
         wrbuf_puts(wrbuf, "</");
         wrbuf_puts(wrbuf, elem);
index 871028d..344e574 100644 (file)
@@ -169,8 +169,9 @@ void wrbuf_printf(WRBUF b, const char *fmt, ...)
     va_end(ap);
 }
 
     va_end(ap);
 }
 
-int wrbuf_iconv_write_x(WRBUF b, yaz_iconv_t cd, const char *buf,
-                        size_t size, int cdata)
+int wrbuf_iconv_write2(WRBUF b, yaz_iconv_t cd, const char *buf,
+                       size_t size,
+                       void (*wfunc)(WRBUF, const char *, size_t))
 {
     int ret = 0;
     if (cd)
 {
     int ret = 0;
     if (cd)
@@ -193,40 +194,24 @@ int wrbuf_iconv_write_x(WRBUF b, yaz_iconv_t cd, const char *buf,
                     break;
                 }
             }
                     break;
                 }
             }
-            switch (cdata)
-            {
-            case 0:
-                wrbuf_write(b, outbuf, outp - outbuf);
-                break;
-            case 1:
-                wrbuf_xmlputs_n(b, outbuf, outp - outbuf);
-                break;
-            case 2:
-                wrbuf_json_write(b, outbuf, outp - outbuf);
-                break;
-            }
+            (*wfunc)(b, outbuf, outp - outbuf);
         }
     }
     else
         }
     }
     else
-    {
-        switch (cdata)
-        {
-        case 0:
-            wrbuf_write(b, buf, size);
-            break;
-        case 1:
-            wrbuf_xmlputs_n(b, buf, size);
-            break;
-        case 2:
-            wrbuf_json_write(b, buf, size);
-        }
-    }
+        (*wfunc)(b, buf, size);
     return ret;
 }
 
     return ret;
 }
 
+int wrbuf_iconv_write_x(WRBUF b, yaz_iconv_t cd, const char *buf,
+                        size_t size, int cdata)
+{
+    return wrbuf_iconv_write2(b, cd, buf, size,
+                              cdata ? wrbuf_xmlputs_n : wrbuf_write);
+}
+
 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)
 {
-    wrbuf_iconv_write_x(b, cd, buf, size, 0);
+    wrbuf_iconv_write2(b, cd, buf, size, wrbuf_write);
 }
 
 void wrbuf_iconv_puts(WRBUF b, yaz_iconv_t cd, const char *strz)
 }
 
 void wrbuf_iconv_puts(WRBUF b, yaz_iconv_t cd, const char *strz)
@@ -243,23 +228,23 @@ void wrbuf_iconv_putchar(WRBUF b, yaz_iconv_t cd, int ch)
 
 void wrbuf_iconv_write_cdata(WRBUF b, yaz_iconv_t cd, const char *buf, size_t size)
 {
 
 void wrbuf_iconv_write_cdata(WRBUF b, yaz_iconv_t cd, const char *buf, size_t size)
 {
-    wrbuf_iconv_write_x(b, cd, buf, size, 1);
+    wrbuf_iconv_write2(b, cd, buf, size, wrbuf_xmlputs_n);
 }
 
 void wrbuf_iconv_puts_cdata(WRBUF b, yaz_iconv_t cd, const char *strz)
 {
 }
 
 void wrbuf_iconv_puts_cdata(WRBUF b, yaz_iconv_t cd, const char *strz)
 {
-    wrbuf_iconv_write_x(b, cd, strz, strlen(strz), 1);
+    wrbuf_iconv_write2(b, cd, strz, strlen(strz), wrbuf_xmlputs_n);
 }
 
 void wrbuf_iconv_json_write(WRBUF b, yaz_iconv_t cd,
                             const char *buf, size_t size)
 {
 }
 
 void wrbuf_iconv_json_write(WRBUF b, yaz_iconv_t cd,
                             const char *buf, size_t size)
 {
-    wrbuf_iconv_write_x(b, cd, buf, size, 2);
+    wrbuf_iconv_write2(b, cd, buf, size, wrbuf_json_write);
 }
 
 void wrbuf_iconv_json_puts(WRBUF b, yaz_iconv_t cd, const char *strz)
 {
 }
 
 void wrbuf_iconv_json_puts(WRBUF b, yaz_iconv_t cd, const char *strz)
 {
-    wrbuf_iconv_write_x(b, cd, strz, strlen(strz), 2);
+    wrbuf_iconv_write2(b, cd, strz, strlen(strz), wrbuf_json_write);
 }
 
 void wrbuf_iconv_reset(WRBUF b, yaz_iconv_t cd)
 }
 
 void wrbuf_iconv_reset(WRBUF b, yaz_iconv_t cd)