From c9b6b04d190c1f9d0c4dfd7c4e66ac0743be18fd Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Sat, 2 Sep 2023 16:10:59 +0100 Subject: New module for functions I no longer need to work on lib.(h|c) basically has structures and functions I no longer want to stare at in main.c --- lib.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 lib.c (limited to 'lib.c') diff --git a/lib.c b/lib.c new file mode 100644 index 0000000..83f3516 --- /dev/null +++ b/lib.c @@ -0,0 +1,57 @@ +/* lib.c + * Created: 2023-09-02 + * Author: Aryadev Chavali + * Description: General functions used throughout + */ + +#include + +#include "./lib.h" + +buffer_t *buffer_init_str(const char *name, const char *str, size_t str_size) +{ + buffer_t *buf = malloc(sizeof(*buf) + str_size + 1); + buf->name = name; + buf->size = str_size; + memcpy(buf->data, str, str_size); + buf->data[str_size] = '\0'; + return buf; +} + +void print_error(const char *handle, size_t row, size_t column, + const char *reason) +{ + fprintf(stderr, "%s:%lu:%lu:%s\n", handle, row, column, reason); +} + +char *fread_all(FILE *fp) +{ + const size_t CHUNK_SIZE = 1024, MULT = 2; + struct + { + char *data; + size_t used, available; + } buffer = {calloc(CHUNK_SIZE, sizeof(*buffer.data)), 0, CHUNK_SIZE}; + + size_t acc = 0, bytes_read = 0; + while ((bytes_read = fread(buffer.data + acc, sizeof(*buffer.data), + CHUNK_SIZE, fp)) != 0) + { + buffer.used += bytes_read; + acc += bytes_read; + if (buffer.used + CHUNK_SIZE >= buffer.available) + { + buffer.available = MAX(buffer.available * MULT, buffer.used + CHUNK_SIZE); + buffer.data = realloc(buffer.data, buffer.available); + } + } + buffer.data = realloc(buffer.data, buffer.used + 1); + buffer.data[buffer.used] = '\0'; + return buffer.data; +} + +bool usable_character(char c) +{ + return c == '>' || c == '<' || c == '+' || c == '-' || c == '-' || c == '.' || + c == ',' || c == '[' || c == ']'; +} -- cgit v1.2.3-13-gbd6f