From f404d75c6050223a3cbbe9b7775700ca291ff93d Mon Sep 17 00:00:00 2001 From: Martin Michalec Date: Sun, 22 Feb 2026 06:18:01 +0300 Subject: add lex example --- examples/utils.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 examples/utils.c (limited to 'examples/utils.c') diff --git a/examples/utils.c b/examples/utils.c new file mode 100644 index 0000000..35c8d98 --- /dev/null +++ b/examples/utils.c @@ -0,0 +1,77 @@ +// examples/utils.c + +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" + +struct cmmm__sv +mmap_whole (int fd) +{ + struct cmmm__sv sv; + + struct stat st; + int ret = fstat (fd, &st); + UNUSED (ret); + ASSERT_MSG (ret != -1, "fstat: %s", strerror (errno)); + ASSERT (S_ISREG (st.st_mode)); + + posix_fadvise (fd, 0, st.st_size, POSIX_FADV_SEQUENTIAL | + POSIX_FADV_WILLNEED | + POSIX_FADV_NOREUSE); + + sv.begin = mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE | + MAP_POPULATE | + MAP_NONBLOCK, fd, 0); + ASSERT_MSG (sv.begin != MAP_FAILED, "mmap: %s", strerror (errno)); + posix_madvise ((void *) sv.begin, st.st_size, MADV_HUGEPAGE | MADV_WILLNEED); + + sv.end = sv.begin + st.st_size; + + return sv; +} + +struct cmmm__sv +read_until_eof (ARENA arena, int fd) +{ + struct arena__checkpoint checkpoint = arena__checkpoint (arena); + size_t reserve = 4096; + + size_t read_total = 0; + for (;;) { + arena__reserve (arena, reserve, 1); + ssize_t bytes_read = read (fd, + arena__next_free (arena, 1), + arena__room (arena, 1)); + + if (bytes_read < 0) { + DEBUG ("fstat: %s", strerror (errno)); + arena__rollback_to (arena, checkpoint); + return (struct cmmm__sv) {0}; + } + + if (bytes_read == 0) + break; + + read_total += bytes_read; + + arena__allocate_fast (arena, bytes_read, 1); + reserve *= 2; + } + + if (arena->tail->free == checkpoint.free) + return (struct cmmm__sv) {0}; + + char *ptr = arena__coalesce_from_fast (arena, checkpoint, read_total); + return (struct cmmm__sv) { + .begin = ptr, + .end = ptr + read_total, + }; +} + +// examples/utils.c ends here -- cgit v1.3