aboutsummaryrefslogtreecommitdiffhomepage
path: root/c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-12-21 11:27:26 +0100
committerlemon <lsof@mailbox.org>2025-12-21 11:27:26 +0100
commitc760021894bf98f546d3d53d0c24d7918340c858 (patch)
tree0f038d57d6dd24104e3a219569e6834fa6f3dca3 /c
parentdd21392ea30844c36e964cab62c0145584f92086 (diff)
lexer: more small optimizations
Diffstat (limited to 'c')
-rw-r--r--c/lex.c47
1 files changed, 33 insertions, 14 deletions
diff --git a/c/lex.c b/c/lex.c
index 6fa6fa3..803cddb 100644
--- a/c/lex.c
+++ b/c/lex.c
@@ -11,10 +11,8 @@ fillchrbuf(struct lexer *lx)
int rem = countof(lx->chrbuf) - i;
assert(rem >= 0);
if (rem > 0) {
- for (int j = 0; j < rem; ++j) {
- lx->chrbuf[j] = lx->chrbuf[i+j];
- lx->chridxbuf[j] = lx->chridxbuf[i+j];
- }
+ memmove(lx->chrbuf, lx->chrbuf+i, rem * sizeof *lx->chrbuf);
+ memmove(lx->chridxbuf, lx->chridxbuf+i, rem * sizeof *lx->chridxbuf);
}
lx->chrbuf0 = 0;
i = rem;
@@ -452,20 +450,41 @@ Begin:
case '/':
TK2('=', TKSETDIV);
if (match(lx, '/')) {
- /* // comment */
- while (!lx->eof && peek(lx, 0) != '\n')
- next(lx);
- goto Begin;
+ /* // single line comment */
+ for (;;) {
+ do {
+ if (lx->chrbuf[lx->chrbuf0] == '\n') {
+ lx->chridx = lx->chridxbuf[lx->chrbuf0++];
+ lx->eof = lx->chridx >= lx->ndat;
+ goto Begin;
+ }
+ } while (++lx->chrbuf0 < countof(lx->chrbuf));
+ fillchrbuf(lx);
+ lx->chridx = lx->chridxbuf[lx->chrbuf0];
+ if ((lx->eof = (lx->chridx >= lx->ndat))) {
+ struct span span = {{ idx, lx->chridx - idx, lx->fileid }};
+ fatal(&span, "unterminated comment");
+ }
+ }
} else if (match(lx, '*')) {
- /* comment */
- while (!(peek(lx, 0) == '*' && peek(lx, 1) == '/')) {
- if (!next(lx) && lx->eof) {
+ // /* multi line comment */
+ if (lx->chrbuf0+1 >= countof(lx->chrbuf)) fillchrbuf(lx);
+ for (;;) {
+ do {
+ if (lx->chrbuf[lx->chrbuf0] == '*' && lx->chrbuf[lx->chrbuf0+1] == '/') {
+ lx->chridx = lx->chridxbuf[lx->chrbuf0+1];
+ lx->chrbuf0 += 2;
+ lx->eof = lx->chridx >= lx->ndat;
+ goto Begin;
+ }
+ } while (++lx->chrbuf0+1 < countof(lx->chrbuf));
+ fillchrbuf(lx);
+ lx->chridx = lx->chridxbuf[lx->chrbuf0];
+ if ((lx->eof = (lx->chridx >= lx->ndat))) {
struct span span = {{ idx, lx->chridx - idx, lx->fileid }};
- fatal(&span, "unterminated multiline comment");
+ fatal(&span, "unterminated comment");
}
}
- next(lx), next(lx);
- goto Begin;
}
RET(c);
case '%':