Selaa lähdekoodia

AK: Add a consume_until(StringView) overload to GenericLexer

This allows us to skip a strlen call.
Idan Horowitz 3 vuotta sitten
vanhempi
commit
d49d2c7ec4
3 muutettua tiedostoa jossa 18 lisäystä ja 1 poistoa
  1. 16 0
      AK/GenericLexer.cpp
  2. 1 0
      AK/GenericLexer.h
  3. 1 1
      Userland/Libraries/LibCpp/Preprocessor.cpp

+ 16 - 0
AK/GenericLexer.cpp

@@ -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

+ 1 - 0
AK/GenericLexer.h

@@ -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 = '\\');
 

+ 1 - 1
Userland/Libraries/LibCpp/Preprocessor.cpp

@@ -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();
 }