#include typedef struct { int fd; uint64_t buffer_size; char *buffer; } Reader; Reader *reader_open(Arena *arena, const char *path, uint64_t buffer_size) { Reader *reader = {0}; int fd; assert_failure(fd = open(path, O_RDONLY, O_NOFOLLOW), -1); reader = arena_type(arena, Reader); reader->fd = fd; reader->buffer_size = buffer_size; reader->buffer = arena_array(arena, char, reader->buffer_size); return reader; } void reader_advance(Reader *self, uint32_t *start, uint32_t *end) { if (*end > self->buffer_size) { if (*start == 0) { /* TODO(roberto): maybe reallocate the buffer instead of crashing */ crash_error("ERROR: token is too long\n"); } assert_errno(lseek(self->fd, *start * -1, SEEK_CUR)); assert_errno(read(self->fd, self->buffer, self->buffer_size)); *end -= *start; *start = 0; } } void reader_close(Reader *self) { close(self->fd); }