Fix sample PQF
[yaz-moved-to-github.git] / util / wrbuf.c
index 62ba1a5..a649e64 100644 (file)
@@ -1,31 +1,30 @@
 /*
- * Copyright (c) 1995, Index Data.
+ * Copyright (c) 1995-2003, Index Data.
  * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: wrbuf.c,v $
- * Revision 1.2  1995-11-01 13:55:06  quinn
- * Minor adjustments
- *
- * Revision 1.1  1995/10/06  08:51:25  quinn
- * Added Write-buffer.
- *
  *
+ * $Id: wrbuf.c,v 1.13 2003-07-14 12:58:18 adam Exp $
  */
 
 /*
  * Growing buffer for writing various stuff.
  */
 
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
 
-#include <wrbuf.h>
+#include <yaz/wrbuf.h>
 
 WRBUF wrbuf_alloc(void)
 {
     WRBUF n;
 
-    if (!(n = xmalloc(sizeof(*n))))
+    if (!(n = (WRBUF)xmalloc(sizeof(*n))))
        abort();
     n->buf = 0;
     n->size = 0;
@@ -55,18 +54,80 @@ int wrbuf_grow(WRBUF b, int minsize)
        togrow = b->size;
     if (togrow < minsize)
        togrow = minsize;
-    if (b->size && !(b->buf =xrealloc(b->buf, b->size += togrow)))
+    if (b->size && !(b->buf =(char *)xrealloc(b->buf, b->size += togrow)))
        abort();
-    else if (!b->size && !(b->buf = xmalloc(b->size = togrow)))
+    else if (!b->size && !(b->buf = (char *)xmalloc(b->size = togrow)))
        abort();
     return 0;
 }
 
-int wrbuf_write(WRBUF b, char *buf, int size)
+int wrbuf_write(WRBUF b, const char *buf, int size)
 {
+    if (size <= 0)
+        return 0;
     if (b->pos + size >= b->size)
        wrbuf_grow(b, size);
     memcpy(b->buf + b->pos, buf, size);
     b->pos += size;
     return 0;
 }
+
+int wrbuf_puts(WRBUF b, const char *buf)
+{
+    wrbuf_write(b, buf, strlen(buf)+1);  /* '\0'-terminate as well */
+    (b->pos)--;                          /* don't include '\0' in count */
+    return 0;
+}
+
+int wrbuf_xmlputs(WRBUF b, const char *cp)
+{
+    while (*cp)
+    {
+       switch(*cp)
+       {
+       case '<':
+           wrbuf_puts(b, "&lt;");
+           break;
+       case '>':
+           wrbuf_puts(b, "&gt;");
+           break;
+       case '&':
+           wrbuf_puts(b, "&amp;");
+           break;
+       case '"':
+           wrbuf_puts(b, "&quot;");
+           break;
+       case '\'':
+           wrbuf_puts(b, "&apos;");
+           break;
+       default:
+           wrbuf_putc(b, *cp);
+       }
+       cp++;
+    }
+    wrbuf_putc(b, 0);
+    (b->pos)--;
+    return 0;
+}
+
+void wrbuf_printf(WRBUF b, const char *fmt, ...)
+{
+    va_list ap;
+    char buf[4096];
+
+    va_start(ap, fmt);
+#ifdef WIN32
+    _vsnprintf(buf, sizeof(buf)-1, fmt, ap);
+#else
+/* !WIN32 */
+#if HAVE_VSNPRINTF
+    vsnprintf(buf, sizeof(buf)-1, fmt, ap);
+#else
+    vsprintf(buf, fmt, ap);
+#endif
+#endif
+    wrbuf_puts (b, buf);
+
+    va_end(ap);
+}
+