mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-09-15 14:02:20 +00:00
sed: Allows the usage of escaped delimiters
This allows us to parse the sed script `s/\//S/g` successful.
This commit is contained in:
parent
b10c87d31e
commit
79d3942012
Notes:
sideshowbarker
2024-07-16 20:05:14 +09:00
Author: https://github.com/fdellwing
Commit: 79d3942012
Pull-request: https://github.com/SerenityOS/serenity/pull/19363
Issue: https://github.com/SerenityOS/serenity/issues/19320
Reviewed-by: https://github.com/gmta ✅
1 changed files with 13 additions and 2 deletions
|
@ -261,14 +261,25 @@ struct SArguments {
|
|||
if (delimiter == '\n' || delimiter == '\\')
|
||||
return SedError::parsing_error(lexer, "\\n and \\ cannot be used as delimiters."sv);
|
||||
|
||||
auto pattern = lexer.consume_until(delimiter);
|
||||
auto pattern = lexer.consume_until([is_escape_sequence = false, delimiter](char c) mutable {
|
||||
if (c == delimiter && !is_escape_sequence)
|
||||
return true;
|
||||
is_escape_sequence = c == '\\' && !is_escape_sequence;
|
||||
return false;
|
||||
});
|
||||
|
||||
if (pattern.is_empty())
|
||||
return SedError::parsing_error(lexer, "Substitution patterns cannot be empty."sv);
|
||||
|
||||
if (!lexer.consume_specific(delimiter))
|
||||
return SedError::parsing_error(lexer, generic_error_message);
|
||||
|
||||
auto replacement = lexer.consume_until(delimiter);
|
||||
auto replacement = lexer.consume_until([is_escape_sequence = false, delimiter](char c) mutable {
|
||||
if (c == delimiter && !is_escape_sequence)
|
||||
return true;
|
||||
is_escape_sequence = c == '\\' && !is_escape_sequence;
|
||||
return false;
|
||||
});
|
||||
|
||||
// According to Posix, "s/x/y" is an invalid substitution command.
|
||||
// It must have a closing delimiter: "s/x/y/"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue