From c704079caea9ddd000b3822b1247a3c386c293ae Mon Sep 17 00:00:00 2001 From: Lassi Kortela Date: Sun, 11 Aug 2019 22:31:54 +0300 Subject: [PATCH] Add string buffer TODO: Consider merging with 'struct ios' --- c/buf.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ c/buf.h | 16 ++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 c/buf.c create mode 100644 c/buf.h diff --git a/c/buf.c b/c/buf.c new file mode 100644 index 0000000..d278db1 --- /dev/null +++ b/c/buf.c @@ -0,0 +1,50 @@ +// Copyright 2019 Lassi Kortela +// SPDX-License-Identifier: BSD-3-Clause + +#include +#include +#include + +#include "buf.h" + +struct buf *buf_new(void) { return calloc(1, sizeof(struct buf)); } + +char *buf_resb(struct buf *buf, size_t nbyte) +{ + char *place; + + while (buf->cap - buf->fill < nbyte) { + if (!(buf->cap *= 2)) { + buf->cap = 64; + } + } + if (!(buf->bytes = realloc(buf->bytes, buf->cap))) { + exit(1); + } + place = buf->bytes + buf->fill; + buf->fill += nbyte; + return place; +} + +void buf_putc(struct buf *buf, int c) { buf_resb(buf, 1)[0] = c; } + +void buf_putb(struct buf *buf, const void *bytes, size_t nbyte) +{ + memcpy(buf_resb(buf, nbyte), bytes, nbyte); +} + +void buf_puts(struct buf *buf, const char *s) { buf_putb(buf, s, strlen(s)); } + +void buf_putu(struct buf *buf, uint64_t u) +{ + char tmp[24]; + + snprintf(tmp, sizeof(tmp), "%llu", u); + buf_puts(buf, tmp); +} + +void buf_free(struct buf *buf) +{ + free(buf->bytes); + free(buf); +} diff --git a/c/buf.h b/c/buf.h new file mode 100644 index 0000000..f870eb6 --- /dev/null +++ b/c/buf.h @@ -0,0 +1,16 @@ +// Copyright 2019 Lassi Kortela +// SPDX-License-Identifier: BSD-3-Clause + +struct buf { + size_t cap; + size_t fill; + char *bytes; +}; + +struct buf *buf_new(void); +char *buf_resb(struct buf *buf, size_t nbyte); +void buf_putc(struct buf *buf, int c); +void buf_putb(struct buf *buf, const void *bytes, size_t nbyte); +void buf_puts(struct buf *buf, const char *s); +void buf_putu(struct buf *buf, uint64_t u); +void buf_free(struct buf *buf);