summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authorCarson Fleming <[email protected]>2026-01-25 16:00:20 -0500
committerCarson Fleming <[email protected]>2026-01-25 16:00:20 -0500
commitb364a39849fc4a6f6837f8558b7520efc24ae96c (patch)
tree2f1d3be07c225bd2c29b219df8ec184c256a9e4f /array.c
parentaecec4204b5830fcb97ab93a56a6a29018519ca2 (diff)
downloadsafec-b364a39849fc4a6f6837f8558b7520efc24ae96c.tar.gz
bring in some library functions and restructure
Diffstat (limited to 'array.c')
-rw-r--r--array.c55
1 files changed, 32 insertions, 23 deletions
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 <string.h>
+#include <stdlib.h>
-#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);
}