From f155f0e0884b18a9fdac3a302bb9c9fa1dd7e5aa Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Fri, 25 Aug 2023 19:08:32 +0100 Subject: (file-handler)+impl file for file handling In particular I've implemented a standardised complete FILE * reader without relying on fseek (which may not work for pipes). --- file-handler.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 file-handler.c (limited to 'file-handler.c') diff --git a/file-handler.c b/file-handler.c new file mode 100644 index 0000000..765eec5 --- /dev/null +++ b/file-handler.c @@ -0,0 +1,64 @@ +/* file-handler.c + * Created: 2023-08-25 + * Author: Aryadev Chavali + * Description: Implementations of writing and loading state from files + */ + +#include +#include + +#include "./lib.h" + +#define CHUNK_SIZE 1024 + +typedef struct Buffer +{ + char *data; + size_t used, available; +} buffer_t; + +void buffer_init(buffer_t *buffer) +{ + *buffer = + (buffer_t){calloc(CHUNK_SIZE, sizeof(*buffer->data)), 0, CHUNK_SIZE}; +} + +void buffer_realloc(buffer_t *buffer, size_t new_size) +{ + buffer->data = realloc(buffer->data, new_size); + buffer->available = new_size; +} + +void buffer_tighten(buffer_t *buffer) +{ + buffer->data = realloc(buffer->data, buffer->used + 1); + buffer->data[buffer->used] = '\0'; + buffer->available = buffer->used; +} + +bool load_from_file(state_t *state, const char *filepath) +{ + memset(state->data, 0, state->dwidth * state->dwidth); + // Read file completely + FILE *fp = fopen(filepath, "r"); + buffer_t buffer; + buffer_init(&buffer); + size_t bytes_read = 0; + while ((bytes_read = + fread(buffer.data, sizeof(*buffer.data), CHUNK_SIZE, fp)) != 0) + { + buffer.used += bytes_read; + buffer_realloc(&buffer, buffer.available + CHUNK_SIZE); + } + fclose(fp); + buffer_tighten(&buffer); + + // Now parse it + + free(buffer.data); + + return true; +} + +bool write_to_file(state_t *state, const char *filepath) +{} -- cgit v1.2.3-13-gbd6f