aboutsummaryrefslogtreecommitdiff
path: root/src/lex.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lex.c')
-rw-r--r--src/lex.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/lex.c b/src/lex.c
index 69a92a7..e616160 100644
--- a/src/lex.c
+++ b/src/lex.c
@@ -46,7 +46,7 @@ const char *tokens[] = {
};
void
-lex_init(struct lexer *lexer, FILE *f)
+lex_init(struct lexer *lexer, FILE *f, const char *filename)
{
lexer->in = f;
lexer->c[0] = 0;
@@ -55,6 +55,9 @@ lex_init(struct lexer *lexer, FILE *f)
lexer->bufsz = 2;
lexer->buflen = 0;
lexer->un.token = T_NONE;
+ lexer->loc.file = filename;
+ lexer->loc.line = 1;
+ lexer->loc.column = 0;
}
void
@@ -63,6 +66,15 @@ lex_finish(struct lexer *lexer)
fclose(lexer->in);
}
+struct location
+lex_loc(struct lexer *lexer)
+{
+ if (lexer->un.token != T_NONE) {
+ return lexer->un.loc;
+ }
+ return lexer->loc;
+}
+
static uint32_t next(struct lexer *lexer)
{
if (lexer->c[0]) {
@@ -75,6 +87,13 @@ static uint32_t next(struct lexer *lexer)
return c;
}
+ if (c == '\n') {
+ ++lexer->loc.line;
+ lexer->loc.column = 0;
+ } else {
+ ++lexer->loc.column;
+ }
+
lexer->c[1] = c;
return c;
}
@@ -240,6 +259,7 @@ lex(struct lexer *lexer, struct token *out)
}
uint32_t c = wgetc(lexer);
+ out->loc = lexer->loc;
if (c == C_EOF) {
out->token = T_EOF;
return out->token;