aboutsummaryrefslogtreecommitdiff
path: root/src/c8asm/lexer.c
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-02-19 22:43:36 +0100
committerThomas Voss <mail@thomasvoss.com> 2024-02-19 22:44:07 +0100
commit2520b79fdf6c344c358e21518b1a5fbcccb21095 (patch)
tree54c0cee6c12412d438e9fd0cf06a4e2a19e8e996 /src/c8asm/lexer.c
parent1207728a0c8824029a10d091e2258d242b77bd26 (diff)
Make error messages great again
Diffstat (limited to 'src/c8asm/lexer.c')
-rw-r--r--src/c8asm/lexer.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/src/c8asm/lexer.c b/src/c8asm/lexer.c
index 3d2a3bf..87835a9 100644
--- a/src/c8asm/lexer.c
+++ b/src/c8asm/lexer.c
@@ -10,9 +10,6 @@
#define ISDIGIT(n) ((n) >= '0' && (n) <= '9')
#define U8MOV(sv, n) ((sv)->p += (n), (sv)->len -= (n))
-#define die_at_pos_with_code(HL, OFF, ...) \
- die_at_pos_with_code(filename, filebuf, (HL), (OFF), __VA_ARGS__)
-
#define E_BASE "integer with invalid base specifier"
#define E_EXTRA "unknown extraneous character"
#define E_IDENTCCHAR "illegal character in identifier"
@@ -68,12 +65,12 @@ lexfile(void)
return toks;
}
+#define DIE_AT_POS_WITH_CODE2(HL, ...) \
+ DIE_AT_POS_WITH_CODE((HL), sv->p - w, __VA_ARGS__)
+
void
lexline(struct tokens *toks, struct u8view *sv)
{
-#define _die_at_pos_with_code(HL, ...) \
- die_at_pos_with_code((HL), sv->p - baseptr - w, __VA_ARGS__)
-
struct token tok;
for (;;) {
@@ -117,7 +114,7 @@ lexline(struct tokens *toks, struct u8view *sv)
break;
default:
if (!ISDIGIT(ch))
- _die_at_pos_with_code(tok.sv, E_BASE);
+ DIE_AT_POS_WITH_CODE2(tok.sv, E_BASE);
}
}
@@ -130,10 +127,10 @@ out:
if (ch == '.') {
tok.sv.len += w = u8next(&ch, &sv->p, &sv->len);
if (!w || rprop_is_pat_ws(ch))
- _die_at_pos_with_code(tok.sv, E_IDENTLOST);
+ DIE_AT_POS_WITH_CODE2(tok.sv, E_IDENTLOST);
if (ch != '_' && !rprop_is_xids(ch)) {
U8MOV(&tok.sv, 1);
- _die_at_pos_with_code(tok.sv, E_IDENTSCHAR);
+ DIE_AT_POS_WITH_CODE2(tok.sv, E_IDENTSCHAR);
}
}
@@ -147,7 +144,7 @@ out:
.p = sv->p - w,
.len = w,
};
- _die_at_pos_with_code(hl, E_IDENTCCHAR);
+ DIE_AT_POS_WITH_CODE2(hl, E_IDENTCCHAR);
}
tok.sv.len += w;
@@ -159,7 +156,7 @@ out:
if (ch == '"')
goto found;
}
- _die_at_pos_with_code(tok.sv, E_UNTERMINATED);
+ DIE_AT_POS_WITH_CODE2(tok.sv, E_UNTERMINATED);
found:
} else if (ch == ':') {
tok.kind = T_COLON;
@@ -167,7 +164,7 @@ found:
goto end;
} else {
struct u8view hl = {.p = sv->p - w, .len = w};
- _die_at_pos_with_code(hl, E_EXTRA);
+ DIE_AT_POS_WITH_CODE2(hl, E_EXTRA);
}
/* The colon is the only token that isn’t whitespace separated */
@@ -175,7 +172,7 @@ found:
w = u8next(&ch, &sv->p, &sv->len);
if (!w || !rprop_is_pat_ws(ch)) {
struct u8view hl = {.p = sv->p - w, .len = w};
- _die_at_pos_with_code(hl, E_EXTRA);
+ DIE_AT_POS_WITH_CODE2(hl, E_EXTRA);
}
}
@@ -189,10 +186,10 @@ end:;
.sv.len = 0,
};
dapush(toks, tok);
-
-#undef _die_at_pos_with_code
}
+#undef DIE_AT_POS_WITH_CODE2
+
bool
skipws(struct u8view *sv)
{