#include "internal/utils.h" void __crash_error(const char *message, const char *file, u32 line) { fprintf(stderr, "(%s:%d): %s\n", file, line, message); exit(1); } String string_slice(const char *cStr) { String str = {0}; str.size = strlen(cStr); str.buf = cStr; return str; } int string_compare(String *s1, String *s2) { if (s1->size != s2->size) { return s1->size - s2->size; } return memcmp(s1->buf, s2->buf, s1->size); } void *string_copy(String *dest, String *src) { return memcpy(dest, src, 2); } int string_compare_literal(String *s1, const char *s2) { u64 len = strlen(s2); if (s1->size != len) { return s1->size - len; } return memcmp(s1->buf, s2, s1->size); } Arena *arena_init(void) { Arena *arena = (Arena *)malloc(sizeof(Arena)); size_t page_size = sysconf(_SC_PAGE_SIZE); arena->capacity = page_size * 4; assert_mmap(arena->buffer = (u8 *)mmap(0, arena->capacity, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0)); return arena; } void *arena_alloc(Arena *arena, u64 size, u8 align) { void *mem; u8 offset; u64 available = arena->capacity - arena->size; if (size > available) { assert_mmap(arena->buffer = (u8 *)mremap(arena->buffer, arena->size, arena->size + (available * 2), 0)); } mem = &(arena->buffer[arena->size]); offset = (u64)mem % align; mem = (void *)((u64)mem + offset); arena->size += size + offset; return mem; } void arena_zero(Arena *arena) { memset(arena->buffer, 0, arena->size); arena->size = 0; } void arena_free(Arena *arena) { if (munmap(arena->buffer, arena->capacity) == -1) { crash_error("can't unmap arena"); } arena->buffer = 0; arena->size = 0; arena->capacity = 0; } ArenaTemp *arena_temp(Arena *arena) { ArenaTemp *temp = (ArenaTemp *)malloc(sizeof(ArenaTemp)); temp->arena = arena; temp->initial = arena->size; return temp; } void arena_temp_free(ArenaTemp *temp) { temp->arena->size = temp->initial; free(temp); }