summaryrefslogtreecommitdiff
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);
+}