summary refs log tree commit diff
path: root/buf.c
diff options
context:
space:
mode:
Diffstat (limited to 'buf.c')
-rw-r--r--buf.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/buf.c b/buf.c
new file mode 100644
index 0000000..dd93116
--- /dev/null
+++ b/buf.c
@@ -0,0 +1,28 @@
+#include <stdlib.h>
+#include "buf.h"
+#include "err.h"
+
+void buf_init(struct buf *b, size_t n) {
+	b->buf = calloc(1, n);
+	if (!b->buf) {
+		efatal("buf_init");
+	}
+	b->cap = n;
+	b->sz = 0;
+}
+
+void buf_grow(struct buf *b, size_t n) {
+	size_t sz = b->sz + n;
+	size_t c = b->cap;
+	if (sz > c) {
+		while (sz > c) c <<= 1;
+		char *p = realloc(b->buf, c);
+		if (!p) efatal("buf_grow");
+		b->buf = p;
+		b->cap = c;
+	}
+}
+
+void buf_free(struct buf *b) {
+	free(b->buf);
+}