mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 05:47:35 +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
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