AK: Add a consume_until(StringView) overload to GenericLexer

This allows us to skip a strlen call.
This commit is contained in:
Idan Horowitz 2022-01-24 23:25:53 +02:00 committed by Ali Mohammad Pur
parent 10b25d2a57
commit d49d2c7ec4
3 changed files with 18 additions and 1 deletions

View file

@ -84,6 +84,22 @@ StringView GenericLexer::consume_until(const char* stop)
return m_input.substring_view(start, length);
}
// Consume and return characters until the string `stop` is found
// The `stop` string is ignored, as it is user-defined
StringView GenericLexer::consume_until(StringView stop)
{
size_t start = m_index;
while (!is_eof() && !next_is(stop))
m_index++;
size_t length = m_index - start;
ignore(stop.length());
if (length == 0)
return {};
return m_input.substring_view(start, length);
}
/*
* Consume a string surrounded by single or double quotes. The returned
* StringView does not include the quotes. An escape character can be provided

View file

@ -113,6 +113,7 @@ public:
StringView consume_line();
StringView consume_until(char);
StringView consume_until(const char*);
StringView consume_until(StringView);
StringView consume_quoted_string(char escape_char = 0);
String consume_and_unescape_string(char escape_char = '\\');

View file

@ -356,7 +356,7 @@ String Preprocessor::remove_escaped_newlines(StringView value)
AK::StringBuilder processed_value;
GenericLexer lexer { value };
while (!lexer.is_eof()) {
processed_value.append(lexer.consume_until("\\\n"));
processed_value.append(lexer.consume_until("\\\n"sv));
}
return processed_value.to_string();
}