SRW, CQL, 2003
[yaz-moved-to-github.git] / util / wrbuf.c
index a81d950..338ce09 100644 (file)
@@ -1,35 +1,31 @@
 /*
- * 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.3  1997-05-01 15:08:15  adam
- * Added log_mask_str_x routine.
- *
- * 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.12 2003-01-06 08:20:28 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;
@@ -59,18 +55,49 @@ 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;
+}
+
+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);
+}
+