73 lines
1.7 KiB
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;
|
|
}
|