about summary refs log tree commit diff
path: root/misc/iobuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/iobuf.c')
-rw-r--r--misc/iobuf.c64
1 files changed, 33 insertions, 31 deletions
diff --git a/misc/iobuf.c b/misc/iobuf.c
index cf5bc73..45918ab 100644
--- a/misc/iobuf.c
+++ b/misc/iobuf.c
@@ -1,4 +1,3 @@
-#include <errno.h>
 #include <inttypes.h>
 #include <stdarg.h>
 #include <stdio.h>
@@ -9,18 +8,21 @@
 
 #define GROWLEN (1 << 14)
 
-int
-buf_init(struct io_buffer *iob, size_t size)
+struct io_buffer
+buf_init(size_t size)
 {
-    iob->buf_off = 0;
-    iob->buf_len = size;
-    iob->error = 0;
-    iob->buf = malloc(size);
-    if (iob->buf == NULL) {
-        iob->error = ENOMEM;
-        return ENOMEM;
-    } else
-        return 0;
+    struct io_buffer iob;
+    iob.off = 0;
+    iob.len = size;
+    iob.error = (iob.buf = malloc(size)) == NULL ? 1 : 0;
+    return iob;
+}
+
+void
+buf_free(struct io_buffer *iob)
+{
+    if (iob->buf != NULL)
+        free(iob->buf);
 }
 
 int
@@ -28,14 +30,14 @@ buf_grow(struct io_buffer *iob, size_t addlen)
 {
     if (iob->error)
         return iob->error;
-    char *nbuf = realloc(iob->buf, iob->buf_len + addlen);
+    char *nbuf = realloc(iob->buf, iob->len + addlen);
     if (nbuf == NULL) {
-        iob->error = ENOMEM;
-        return ENOMEM;
+        iob->error = 1;
+        return 0;
     } else {
         iob->buf = nbuf;
-        iob->buf_len += addlen;
-        return 0;
+        iob->len += addlen;
+        return 1;
     }
 }
 
@@ -43,31 +45,31 @@ int
 buf_print(struct io_buffer *iob, const char *fmt, ...)
 {
     if (iob->error)
-        return iob->error;
+        return 0;
     int np;
     va_list ap;
     va_start(ap, fmt);
     np = vsnprintf(NULL, 0, fmt, ap);
     va_end(ap);
-    if (np + 1 > iob->buf_len - iob->buf_off)
-        if (buf_grow(iob, (1 + (np + 1) / GROWLEN) * GROWLEN) != 0)
-            return ENOMEM;
+    if (np + 1 > iob->len - iob->off)
+        if (!buf_grow(iob, (1 + (np + 1) / GROWLEN) * GROWLEN))
+            return 0;
     va_start(ap, fmt);
-    vsnprintf(iob->buf + iob->buf_off, np + 1, fmt, ap);
+    vsnprintf(iob->buf + iob->off, np + 1, fmt, ap);
     va_end(ap);
-    iob->buf_off += np;
-    return 0;
+    iob->off += np;
+    return 1;
 }
 
 int
 buf_write(struct io_buffer *iob, const void *buf, size_t len)
 {
     if (iob->error)
-        return iob->error;
-    if (len > iob->buf_len - iob->buf_off)
-        if (buf_grow(iob, (1 + len / GROWLEN) * GROWLEN) != 0)
-            return ENOMEM;
-    bcopy(buf, iob->buf + iob->buf_off, len);
-    iob->buf_off += len;
-    return 0;
+        return 0;
+    if (len > iob->len - iob->off)
+        if (!buf_grow(iob, (1 + len / GROWLEN) * GROWLEN))
+            return 0;
+    bcopy(buf, iob->buf + iob->off, len);
+    iob->off += len;
+    return 1;
 }