From b364a39849fc4a6f6837f8558b7520efc24ae96c Mon Sep 17 00:00:00 2001 From: Carson Fleming Date: Sun, 25 Jan 2026 16:00:20 -0500 Subject: bring in some library functions and restructure --- array.c | 55 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 23 deletions(-) (limited to 'array.c') diff --git a/array.c b/array.c index d8765c1..7d55041 100644 --- a/array.c +++ b/array.c @@ -1,39 +1,48 @@ #include "array.h" #include "crash.h" #include +#include -#define CRASH_IF_OOB(array, idx) {\ - if (idx >= array->length)\ - crash("Array access out of bounds: %ld >= %ld\n", idx, array->length);\ +#define CRASH_IF_OOB(array, len) {\ + if (len > array.length)\ + crash("Array access out of bounds: %ld > %ld\n", len, array.length);\ } -void* array_at(const array_t* array, size_t idx) { +void* array_at(const array_t array, size_t idx) { CRASH_IF_OOB(array, idx); - return (char*)array->__data + idx*array->elemsz; + return (char*)array.__data + idx*array.elemsz; } -char* str_at(const str_t* str, size_t idx) { - CRASH_IF_OOB(str, idx); - return str->__data + idx; +array_t array_slice(const array_t array, size_t start, size_t length) { + CRASH_IF_OOB(array, start + length); + array_t slice = { + .length = length, + .__data = (char*)array.__data + start * array.elemsz + }; + return slice; } -str_t str_slice(const str_t* str, size_t start, size_t length) { - CRASH_IF_OOB(str, start + length - 1); - str_t slice = {.length = length, .__data = str->__data + start}; - return slice; +array_t array_init(void* data, size_t length, size_t elemsz) { + array_t array = {.length = length, .elemsz = elemsz, .__data = data}; + return array; } -void str_c_str( - char* dst, - size_t dst_size, - const str_t* src -) { - if (src->length >= dst_size) +array_t array_heap_alloc(size_t length, size_t elemsz) { + void* data_ptr = calloc(length, elemsz); + if (data_ptr == NULL) crash( - "String is too long to hold in C string buffer: %ld >= %ld\n", - src->length, - dst_size); + "Out of memory allocating %ld elements of size %ld\n", + length, + elemsz); + + array_t container = { + .length = length, + .elemsz = elemsz, + .__data = data_ptr, + }; + return container; +} - memmove(dst, src->__data, src->length); - dst[src->length] = 0; +void array_heap_destroy(array_t array) { + free(array.__data); } -- cgit v1.2.3