From 9812f88a9a612144bea02c7acf499867eb0cbeb9 Mon Sep 17 00:00:00 2001 From: lemon Date: Mon, 13 Oct 2025 19:06:52 +0200 Subject: implement most of preprocessor - concatenation (##) - builtin macros (__FILE__ etc) - fails in some edge cases, and code needs cleanup - add embedded system include files (stddef.h, stdarg.h for now) - can handle stdio.h now --- io.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'io.c') diff --git a/io.c b/io.c index 592cf48..2a9e876 100644 --- a/io.c +++ b/io.c @@ -627,6 +627,8 @@ bfmt(struct wbuf *buf, const char *fmt, ...) static uint pagesiz; +extern struct embedfile embedfilesdir[]; + struct memfile mapopen(const char **err, const char *path) { @@ -641,6 +643,14 @@ mapopen(const char **err, const char *path) if (!pagesiz) pagesiz = sysconf(_SC_PAGESIZE); *err = NULL; + if (*path == '@' && path[1] == ':') { + for (struct embedfile *e = embedfilesdir; e->name; ++e) { + if (!strcmp(e->name, path+2)) { + return (struct memfile) { (const uchar *)e->s, e->len, .statik = 1 }; + } + } + } + if ((fd = open(path, O_RDONLY)) < 0) goto Err; if (fstat(fd, &stat) != 0) @@ -707,7 +717,8 @@ void mapclose(struct memfile *f) { assert(f->p); - munmap((void *)f->p, alignup(f->n, pagesiz) + pagesiz); + if (!f->statik) + munmap((void *)f->p, alignup(f->n, pagesiz) + pagesiz); memset(f, 0, sizeof *f); } @@ -793,8 +804,8 @@ getfilepos(int *line, int *col, int id, uint off) else break; } i -= offs[i] > off; - *line = i + 1; - *col = off - offs[i] + 1; + if (line) *line = i + 1; + if (col) *col = off - offs[i] + 1; } void -- cgit v1.2.3