1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#include <ui_utils.h>
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); }
|