From c660d1ec1e7d8643cab5dfeef5561ef58da3ad78 Mon Sep 17 00:00:00 2001 From: Ivar Fatland Date: Sat, 13 Dec 2025 16:16:25 +0100 Subject: [PATCH 1/2] update builder to always clear after retrieving output --- cig.h | 6 +++--- string_builder.c | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/cig.h b/cig.h index cd68e38..edbbcab 100644 --- a/cig.h +++ b/cig.h @@ -325,7 +325,7 @@ typedef struct string_builder { } string_builder_t; string_builder_t sb_create(allocator_t builder_allocator); -// assumes the provided string will live until sb_build is called. +// assumes the provided string will live until sb_build_and_clear is called. void sb_add_string(string_builder_t *this, const char *string); void sb_add_i64(string_builder_t *this, int64_t i64); void sb_add_i32(string_builder_t *this, int32_t i32); @@ -336,8 +336,8 @@ void sb_add_u32(string_builder_t *this, uint32_t u32); void sb_add_u16(string_builder_t *this, uint16_t u16); void sb_add_u8(string_builder_t *this, uint8_t u8); void sb_add_substring(string_builder_t *this, const char *string, size_t substring_length); -const char *sb_build(string_builder_t *this, allocator_t output_allocator); -void sb_fprint(string_builder_t *this, FILE *dest); +const char *sb_build_and_clear(string_builder_t *this, allocator_t output_allocator); +void sb_fprint_and_clear(string_builder_t *this, FILE *dest); #ifdef CIG_IMPL diff --git a/string_builder.c b/string_builder.c index 9860521..84ff95c 100644 --- a/string_builder.c +++ b/string_builder.c @@ -91,7 +91,7 @@ void sb_add_substring(string_builder_t *this, const char *string, size_t substri sb_add_string(this, buffer); } -const char *sb_build( +const char *sb_build_and_clear( string_builder_t *this, allocator_t output_allocator ) { @@ -123,7 +123,7 @@ const char *sb_build( return buffer; } -void sb_fprint(string_builder_t *this, FILE *dest) { +void sb_fprint_and_clear(string_builder_t *this, FILE *dest) { for ( string_builder_node_t *node = this->head; node != NULL; @@ -131,4 +131,6 @@ void sb_fprint(string_builder_t *this, FILE *dest) { ) { fprintf(dest, "%s", node->string); } + this->head = NULL; + this->tail = NULL; } From 1a59e2b190a9d05e34914041e855d2a35cbc9509 Mon Sep 17 00:00:00 2001 From: Ivar Fatland Date: Sat, 13 Dec 2025 16:30:27 +0100 Subject: [PATCH 2/2] file io --- cig.h | 5 +++++ file_io.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 file_io.c diff --git a/cig.h b/cig.h index edbbcab..a7d9611 100644 --- a/cig.h +++ b/cig.h @@ -339,6 +339,10 @@ void sb_add_substring(string_builder_t *this, const char *string, size_t substri const char *sb_build_and_clear(string_builder_t *this, allocator_t output_allocator); void sb_fprint_and_clear(string_builder_t *this, FILE *dest); +// file_io ///////////////////////////////////////////////////////////////////// +char *read_entire_file(const char *path, allocator_t allocator); +char **read_all_file_lines(const char *path, allocator_t allocator); + #ifdef CIG_IMPL void *allocator_alloc_func(allocator_t this, size_t bytes, const char *file, int line) { @@ -369,6 +373,7 @@ void allocator_reset(allocator_t this) { #include "cli.c" #include "scanner.c" #include "string_builder.c" +#include "file_io.c" #endif // CIG_IMPL diff --git a/file_io.c b/file_io.c new file mode 100644 index 0000000..de2d1a9 --- /dev/null +++ b/file_io.c @@ -0,0 +1,37 @@ +#include "cig.h" +#include + +char *read_entire_file(const char *path, allocator_t allocator) { + FILE *fp = fopen(path, "rb"); + assert(fp != NULL); + fseek(fp, 0, SEEK_END); + long size = ftell(fp); + rewind(fp); + char *buf = allocator_alloc(allocator, size+1); + assert(buf != NULL); + size_t read = fread(buf, 1, size, fp); + assert(read == (size_t)size); + fclose(fp); + buf[size] = '\0'; + return buf; +} + +// Returns dynamic array, of fixed char strings. +char **read_all_file_lines(const char *path, allocator_t allocator) { + char *contents = read_entire_file(path, allocator); + char **lines = make_arr(allocator, char*); + arr_append(lines, contents); + bool just_split = false; + for (char *c = contents; (*c)!='\0'; c++) { + if ((*c) == '\n') { + *c = '\0'; + just_split = true; + continue; + } + if (just_split) { + just_split = false; + arr_append(lines, c); + } + } + return lines; +}