From 09435bffe025a96e0d9c3b44ee9c505973b383bd Mon Sep 17 00:00:00 2001 From: LLLL Colonq Date: Mon, 6 Oct 2025 05:06:16 -0400 Subject: Cleanup, fix bugs Ensure everything builds on C89 --- src/lexer.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) (limited to 'src/lexer.c') diff --git a/src/lexer.c b/src/lexer.c index f7cc05e..ac59400 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -8,14 +8,14 @@ #include "types.h" const char *PIT_LEX_TOKEN_NAMES[PIT_LEX_TOKEN__SENTINEL] = { - [PIT_LEX_TOKEN_EOF] = "eof", - [PIT_LEX_TOKEN_LPAREN] = "lparen", - [PIT_LEX_TOKEN_RPAREN] = "rparen", - [PIT_LEX_TOKEN_DOT] = "dot", - [PIT_LEX_TOKEN_QUOTE] = "quote", - [PIT_LEX_TOKEN_INTEGER_LITERAL] = "integer_literal", - [PIT_LEX_TOKEN_STRING_LITERAL] = "string_literal", - [PIT_LEX_TOKEN_SYMBOL] = "symbol", + /* [PIT_LEX_TOKEN_EOF] = */ "eof", + /* [PIT_LEX_TOKEN_LPAREN] = */ "lparen", + /* [PIT_LEX_TOKEN_RPAREN] = */ "rparen", + /* [PIT_LEX_TOKEN_DOT] = */ "dot", + /* [PIT_LEX_TOKEN_QUOTE] = */ "quote", + /* [PIT_LEX_TOKEN_INTEGER_LITERAL] = */ "integer_literal", + /* [PIT_LEX_TOKEN_STRING_LITERAL] = */ "string_literal", + /* [PIT_LEX_TOKEN_SYMBOL] = */ "symbol", }; const char *pit_lex_token_name(pit_lex_token t) { @@ -58,7 +58,7 @@ static bool match(pit_lexer *st, int (*f)(int)) { void pit_lex_cstr(pit_lexer *ret, char *buf) { ret->input = buf; - ret->len = strlen(buf); + ret->len = (i64) strlen(buf); ret->start = 0; ret->end = 0; ret->line = ret->start_line = 1; @@ -77,25 +77,31 @@ void pit_lex_bytes(pit_lexer *ret, char *buf, i64 len) { } void pit_lex_file(pit_lexer *ret, char *path) { FILE *f = fopen(path, "r"); + i64 len = 0; + char *buf = NULL; if (f == NULL) { pit_panic("failed to open file for lexing: %s", path); return; } fseek(f, 0, SEEK_END); - i64 len = ftell(f); + len = ftell(f); fseek(f, 0, SEEK_SET); - char *buf = calloc(ret->len, sizeof(char)); - fread(ret->input, sizeof(char), ret->len, f); + buf = calloc((size_t) ret->len, sizeof(char)); + if ((size_t) ret->len != fread(ret->input, sizeof(char), (size_t) ret->len, f)) { + pit_panic("failed to read file for lexing: %s", path); + return; + } fclose(f); pit_lex_bytes(ret, buf, len); } pit_lex_token pit_lex_next(pit_lexer *st) { + char c = 0; restart: st->start = st->end; st->start_line = st->line; st->start_column = st->column; - char c = advance(st); + c = advance(st); switch (c) { case 0: return PIT_LEX_TOKEN_EOF; case ';': while (is_more_input(st) && advance(st) != '\n'); goto restart; @@ -105,7 +111,7 @@ restart: case '\'': return PIT_LEX_TOKEN_QUOTE; case '"': while (peek(st) != '"') { - if (peek(st) == '\\') advance(st); // skip escaped characters + if (peek(st) == '\\') advance(st); /* skip escaped characters */ if (!advance(st)) { st->error = "unterminated string"; return PIT_LEX_TOKEN_ERROR; -- cgit v1.2.3