From 6ab50543714884bf2bc8f5a4d19cf9ad5898bf73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20K=C3=A4chele?= Date: Fri, 7 Nov 2025 14:55:39 +0100 Subject: [PATCH 1/2] Use hb_string_T in lexer_match_and_advance function --- src/lexer.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/lexer.c b/src/lexer.c index a2832b44c..762b4ca59 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -139,10 +139,9 @@ static token_T* lexer_advance_utf8_character(lexer_T* lexer, const token_type_T return token; } -static token_T* lexer_match_and_advance(lexer_T* lexer, const char* value, const token_type_T type) { - if (strncmp(lexer->source.data + lexer->current_position, value, strlen(value)) == 0) { - return lexer_advance_with(lexer, value, type); - } +static token_T* lexer_match_and_advance(lexer_T* lexer, hb_string_T value, const token_type_T type) { + hb_string_T remaining_source = hb_string_slice(lexer->source, lexer->current_position); + if (hb_string_starts_with(remaining_source, value)) { return lexer_advance_with(lexer, value.data, type); } return NULL; } @@ -182,7 +181,8 @@ static token_T* lexer_parse_identifier(lexer_T* lexer) { // ===== ERB Parsing static token_T* lexer_parse_erb_open(lexer_T* lexer) { - const char* erb_patterns[] = { "<%==", "<%%=", "<%=", "<%#", "<%-", "<%%", "<%" }; + hb_string_T erb_patterns[] = { hb_string("<%=="), hb_string("<%%="), hb_string("<%="), hb_string("<%#"), + hb_string("<%-"), hb_string("<%%"), hb_string("<%") }; lexer->state = STATE_ERB_CONTENT; @@ -288,22 +288,22 @@ token_T* lexer_next_token(lexer_T* lexer) { } case '/': { - token_T* token = lexer_match_and_advance(lexer, "/>", TOKEN_HTML_TAG_SELF_CLOSE); + token_T* token = lexer_match_and_advance(lexer, hb_string("/>"), TOKEN_HTML_TAG_SELF_CLOSE); return token ? token : lexer_advance_current(lexer, TOKEN_SLASH); } case '?': { - token_T* token = lexer_match_and_advance(lexer, "?>", TOKEN_XML_DECLARATION_END); + token_T* token = lexer_match_and_advance(lexer, hb_string("?>"), TOKEN_XML_DECLARATION_END); return token ? token : lexer_advance_current(lexer, TOKEN_CHARACTER); } case '-': { - token_T* token = lexer_match_and_advance(lexer, "-->", TOKEN_HTML_COMMENT_END); + token_T* token = lexer_match_and_advance(lexer, hb_string("-->"), TOKEN_HTML_COMMENT_END); return token ? token : lexer_advance_current(lexer, TOKEN_DASH); } case ']': { - token_T* token = lexer_match_and_advance(lexer, "]]>", TOKEN_CDATA_END); + token_T* token = lexer_match_and_advance(lexer, hb_string("]]>"), TOKEN_CDATA_END); return token ? token : lexer_advance_current(lexer, TOKEN_CHARACTER); } From 98b72069ecc61b801a21fed126c401d6d9b93ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20K=C3=A4chele?= Date: Fri, 7 Nov 2025 14:54:02 +0100 Subject: [PATCH 2/2] Use hb_string_T in lexer_advance_with function --- src/lexer.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/lexer.c b/src/lexer.c index 762b4ca59..76f638fe2 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -102,9 +102,9 @@ static void lexer_advance_by(lexer_T* lexer, const size_t count) { } } -static token_T* lexer_advance_with(lexer_T* lexer, const char* value, const token_type_T type) { - lexer_advance_by(lexer, strlen(value)); - return token_init(hb_string(value), type, lexer); +static token_T* lexer_advance_with(lexer_T* lexer, hb_string_T value, const token_type_T type) { + lexer_advance_by(lexer, value.length); + return token_init(value, type, lexer); } static token_T* lexer_advance_with_next(lexer_T* lexer, size_t count, token_type_T type) { @@ -120,7 +120,11 @@ static token_T* lexer_advance_with_next(lexer_T* lexer, size_t count, token_type } static token_T* lexer_advance_current(lexer_T* lexer, const token_type_T type) { - return lexer_advance_with(lexer, (char[]) { lexer->current_character, '\0' }, type); + char buffer[2]; + buffer[0] = lexer->current_character; + buffer[1] = '\0'; + + return lexer_advance_with(lexer, hb_string(buffer), type); } static token_T* lexer_advance_utf8_character(lexer_T* lexer, const token_type_T type) { @@ -141,7 +145,7 @@ static token_T* lexer_advance_utf8_character(lexer_T* lexer, const token_type_T static token_T* lexer_match_and_advance(lexer_T* lexer, hb_string_T value, const token_type_T type) { hb_string_T remaining_source = hb_string_slice(lexer->source, lexer->current_position); - if (hb_string_starts_with(remaining_source, value)) { return lexer_advance_with(lexer, value.data, type); } + if (hb_string_starts_with(remaining_source, value)) { return lexer_advance_with(lexer, value, type); } return NULL; } @@ -230,11 +234,11 @@ static token_T* lexer_parse_erb_content(lexer_T* lexer) { static token_T* lexer_parse_erb_close(lexer_T* lexer) { lexer->state = STATE_DATA; - if (lexer_peek_erb_percent_close_tag(lexer, 0)) { return lexer_advance_with(lexer, "%%>", TOKEN_ERB_END); } - if (lexer_peek_erb_equals_close_tag(lexer, 0)) { return lexer_advance_with(lexer, "=%>", TOKEN_ERB_END); } - if (lexer_peek_erb_dash_close_tag(lexer, 0)) { return lexer_advance_with(lexer, "-%>", TOKEN_ERB_END); } + if (lexer_peek_erb_percent_close_tag(lexer, 0)) { return lexer_advance_with(lexer, hb_string("%%>"), TOKEN_ERB_END); } + if (lexer_peek_erb_equals_close_tag(lexer, 0)) { return lexer_advance_with(lexer, hb_string("=%>"), TOKEN_ERB_END); } + if (lexer_peek_erb_dash_close_tag(lexer, 0)) { return lexer_advance_with(lexer, hb_string("-%>"), TOKEN_ERB_END); } - return lexer_advance_with(lexer, "%>", TOKEN_ERB_END); + return lexer_advance_with(lexer, hb_string("%>"), TOKEN_ERB_END); } // ===== Tokenizing Function @@ -277,11 +281,11 @@ token_T* lexer_next_token(lexer_T* lexer) { if (isalnum(lexer_peek(lexer, 1))) { return lexer_advance_current(lexer, TOKEN_HTML_TAG_START); } if (lexer_peek_for_html_comment_start(lexer, 0)) { - return lexer_advance_with(lexer, "