diff options
| author | physick <mynameisgennadiy@vk.com> | 2026-08-11 21:08:37 +0500 |
|---|---|---|
| committer | physick <mynameisgennadiy@vk.com> | 2026-08-29 14:12:58 +0500 |
| commit | b1b2586afa06105291355a19f581016c347463bc (patch) | |
| tree | 8630d1fb394d9c006f42af0b7da92998bb1518b8 /src/utils | |
| parent | d51d95b66dee211ef654693fb23238d5a234f48c (diff) | |
arena + dir reading
Diffstat (limited to 'src/utils')
| -rw-r--r-- | src/utils/arena.c | 38 | ||||
| -rw-r--r-- | src/utils/arena.h | 17 |
2 files changed, 55 insertions, 0 deletions
diff --git a/src/utils/arena.c b/src/utils/arena.c new file mode 100644 index 0000000..ce50d24 --- /dev/null +++ b/src/utils/arena.c @@ -0,0 +1,38 @@ +#include "arena.h" +#include <stddef.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +bool ArenaInit(Arena *arena, size_t capacity) { + arena->mem = malloc(capacity); + if (!arena->mem) { + return false; + } + arena->head = 0; + arena->capacity = capacity; + return true; +} + +void *ArenaAlloc(Arena *arena, size_t size) { + uintptr_t current_ptr = (uintptr_t)arena->mem + arena->head; + // Alignment + uintptr_t aligned_ptr = (current_ptr + 7) & ~7; + + size_t alignment_padding = aligned_ptr - current_ptr; + size_t total_needed = size + alignment_padding; + if (arena->head + total_needed > arena->capacity) { + return NULL; + } + + arena->head += total_needed; + return (void *)aligned_ptr; +} + +char *ArenaStrdup(Arena *arena, const char *str) { + size_t len = strlen(str) + 1; // adding a \0 + char *ptr = ArenaAlloc(arena, len); + if (ptr == NULL) return NULL; + memcpy(ptr, str, len); + return ptr; +} diff --git a/src/utils/arena.h b/src/utils/arena.h new file mode 100644 index 0000000..88cd17c --- /dev/null +++ b/src/utils/arena.h @@ -0,0 +1,17 @@ +#include <stddef.h> +#include <stdbool.h> + +#ifndef ARENA_H +#define ARENA_H + +typedef struct { + void *mem; + size_t head; + size_t capacity; +} Arena; + +bool ArenaInit(Arena *arena, size_t capacity); +void *ArenaAlloc(Arena *arena, size_t size); +char *ArenaStrdup(Arena *arena, const char *str); + +#endif // ARENA_H |
