advent-of-code-2024/aoc/aoc.c

73 lines
1.7 KiB
C

#define STR_IMPLEMENTATION
#include "str.h"
#include "aoc.h"
#include <stdlib.h>
Arena *make_arena(ptrdiff_t size) {
void *mem = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
Arena *arena = arena_init(mem, size);
return arena;
}
str read_file(Arena *arena, const char *filename) {
FILE *f = fopen(filename, "r");
ASSERT(f);
fseek(f, 0, SEEK_END);
size_t size = ftell(f);
fseek(f, 0, SEEK_SET);
char *data = ARENA_ALLOC_ARRAY(arena, char, size + 1);
size_t read_size = fread(data, 1, size, f);
ASSERT(read_size == size);
data[size] = '\0';
fclose(f);
return make_str((uint8_t *) data, size);
}
Tokens str_tokenize(Arena *arena, str s, str delim) {
// 1st pass: count number of tokens
str stuff = s;
isize token_count = 0;
while (str_next_token(&stuff, delim).len > 0) {
token_count++;
}
// 2nd pass: allocate memory and copy tokens
Tokens result = {
.len = token_count,
.tokens = ARENA_ALLOC_ARRAY(arena, str, token_count)
};
ASSERT(result.tokens);
stuff = s;
for (isize i = 0; i < token_count; ++i) {
result.tokens[i] = str_next_token(&stuff, delim);
}
return result;
}
Tokens read_lines(Arena *arena, const char *path) {
str file = read_file(arena, path);
Tokens lines = str_tokenize(arena, file, STR("\n"));
return lines;
}
char *
str_to_cstr(str s, Arena *a) {
char *result = ARENA_ALLOC_ARRAY(a, char, s.len + 1);
memcpy(result, s.data, s.len);
result[s.len] = '\0';
return result;
}
i64
parse_i64(str s, Arena temp) {
char *cs = str_to_cstr(s, &temp);
char *endptr;
i64 result = strtol(cs, &endptr, 10);
ASSERT(*endptr == '\0');
return result;
}