#include "reader.h" #include "utils.h" Reader *reader_open(Arena *arena, const char *path, u64 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; } int reader_advance(Reader *self, u32 *start, u32 *end) { int bytesRead = 0; 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(bytesRead = read(self->fd, self->buffer, self->buffer_size)); *end -= *start; *start = 0; } return bytesRead == EOF; } void reader_reset(Reader *self) { assert_errno(lseek(self->fd, 0, SEEK_SET)); } void reader_close(Reader *self) { close(self->fd); }