diff options
| author | Carson Fleming <[email protected]> | 2026-01-24 22:28:22 -0500 |
|---|---|---|
| committer | Carson Fleming <[email protected]> | 2026-01-24 22:28:22 -0500 |
| commit | e72088d79804e4f689196f4bc700fb9348c77209 (patch) | |
| tree | 195e8b20cf633a0b9fc2ef6754c08742a9ce30e1 | |
| download | safec-e72088d79804e4f689196f4bc700fb9348c77209.tar.gz | |
initial commit
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | array.c | 26 | ||||
| -rw-r--r-- | array.h | 23 | ||||
| -rw-r--r-- | crash.c | 12 | ||||
| -rw-r--r-- | crash.h | 4 | ||||
| -rw-r--r-- | makefile | 24 |
6 files changed, 90 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ @@ -0,0 +1,26 @@ +#include "array.h" +#include "crash.h" +#define CRASH_IF_OOB(array, idx) {\ + if (idx >= array->length)\ + crash("Array access out of bounds: %ld >= %ld\n", idx, array->length);\ +} + +void array_set(array_t* array, size_t idx, void* val) { + CRASH_IF_OOB(array, idx); + array->data[idx] = val; +} + +void* array_get(const array_t* array, size_t idx) { + CRASH_IF_OOB(array, idx); + return array->data[idx]; +} + +void str_set(str_t* str, size_t idx, char val) { + CRASH_IF_OOB(str, idx); + str->data[idx] = val; +} + +char str_get(const str_t* str, size_t idx) { + CRASH_IF_OOB(str, idx); + return str->data[idx]; +} @@ -0,0 +1,23 @@ +#ifndef __SAFEC_ARRAY_H +#define __SAFEC_ARRAY_H +#include <stddef.h> + +/* TODO: it might be good to just have itemsz and char* data */ +typedef struct { + size_t length; + void** data; +} array_t; + +void array_set(array_t* array, size_t idx, void* val); +void* array_get(const array_t* array, size_t idx); + +typedef struct { + size_t length; + char* data; +} str_t; + +void str_set(str_t* str, size_t idx, char val); +char str_get(const str_t* str, size_t idx); +/* TODO: I would like to implement string slicing as part of this */ +/* TODO: reimplement string.h functions for this new string construct */ +#endif @@ -0,0 +1,12 @@ +#include "crash.h" +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> + +void crash(const char* format, ...) { + va_list args; + va_start(args, format); + vfprintf(stderr, format, args); + exit(1); + va_end(args); +}
\ No newline at end of file @@ -0,0 +1,4 @@ +#ifndef __SAFEC_CRASH_H +#define __SAFEC_CRASH_H +void crash(const char* message, ...); +#endif
\ No newline at end of file diff --git a/makefile b/makefile new file mode 100644 index 0000000..6f80fb0 --- /dev/null +++ b/makefile @@ -0,0 +1,24 @@ +CC ?= cc +CFLAGS := -std=c23 -O3 -Wall -Werror -fPIC -c + +BUILD_DIR := build +TARGET := $(BUILD_DIR)/libsafec.a + +SRCS := $(wildcard *.c) +OBJS := $(patsubst %.c,$(BUILD_DIR)/%.o,$(SRCS)) + +.PHONY: all clean + +all: $(BUILD_DIR) $(TARGET) + +$(BUILD_DIR): + mkdir -p $(BUILD_DIR) + +$(TARGET): $(OBJS) + ar rcs $@ $^ + +$(BUILD_DIR)/%.o: %.c + $(CC) $(CFLAGS) $< -o $@ + +clean: + rm -rf $(BUILD_DIR) |
