diff options
author | tomsmeding <tom.smeding@gmail.com> | 2019-11-23 23:39:04 +0100 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2019-11-23 23:39:04 +0100 |
commit | 0d2c5f9602db67810c1c9551ca59ac840339b56b (patch) | |
tree | 2f5caa1dae7cb029c25eb031da75ca005caa1ee3 /plugins/static/buffer.c | |
parent | 4381cca95136b0a8222378a41ac0ebb1bc62ea80 (diff) |
static: Move struct buffer to a separate file
Diffstat (limited to 'plugins/static/buffer.c')
-rw-r--r-- | plugins/static/buffer.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/plugins/static/buffer.c b/plugins/static/buffer.c new file mode 100644 index 0000000..04db027 --- /dev/null +++ b/plugins/static/buffer.c @@ -0,0 +1,47 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include "memory.h" +#include "buffer.h" + + +struct buffer buffer_make(size_t capacity) { + struct buffer buffer = (struct buffer){malloc(capacity, char), capacity + 1, 0}; + return buffer; +} + +void buffer_free(struct buffer buffer) { + free(buffer.buf); +} + +void buffer_append_mem(struct buffer *buffer, const char *str, size_t len) { + if (buffer->len + len >= buffer->cap) { + do buffer->cap *= 2; while (buffer->len + len >= buffer->cap); + buffer->buf = realloc(buffer->buf, buffer->cap, char); + } + memcpy(buffer->buf + buffer->len, str, len); + buffer->len += len; + buffer->buf[buffer->len] = 0; +} + +void buffer_append_str(struct buffer *buffer, const char *str) { + buffer_append_mem(buffer, str, strlen(str)); +} + +// returns whether successful +bool buffer_append_file(struct buffer *buffer, const char *path) { + FILE *f = fopen(path, "rb"); + if (!f) return false; + + char block[4096]; + while (true) { + size_t nr = fread(block, 1, sizeof block, f); + if (nr > 0) buffer_append_mem(buffer, block, nr); + if (nr < sizeof block) break; + } + + bool has_error = ferror(f); + fclose(f); + return !has_error; +} |