mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-09-15 22:12: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 == '\\')
|
if (delimiter == '\n' || delimiter == '\\')
|
||||||
return SedError::parsing_error(lexer, "\\n and \\ cannot be used as delimiters."sv);
|
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())
|
if (pattern.is_empty())
|
||||||
return SedError::parsing_error(lexer, "Substitution patterns cannot be empty."sv);
|
return SedError::parsing_error(lexer, "Substitution patterns cannot be empty."sv);
|
||||||
|
|
||||||
if (!lexer.consume_specific(delimiter))
|
if (!lexer.consume_specific(delimiter))
|
||||||
return SedError::parsing_error(lexer, generic_error_message);
|
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.
|
// According to Posix, "s/x/y" is an invalid substitution command.
|
||||||
// It must have a closing delimiter: "s/x/y/"
|
// It must have a closing delimiter: "s/x/y/"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue