From da0175105df3f7a27835a4ee7d4bab9dd2750daa Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Fri, 25 Oct 2024 14:21:23 +0100 Subject: [PATCH] Implement special character escaping --- lib/parser.c | 4 ++++ tests/parser_tests.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/lib/parser.c b/lib/parser.c index 60e724e..24fe2ee 100644 --- a/lib/parser.c +++ b/lib/parser.c @@ -15,6 +15,7 @@ static bool is_special(char c) switch (c) { case '|': case '.': + case '\\': return true; default: return false; @@ -26,6 +27,9 @@ static int parse_literal(const char *input, int rem, char *out) if (rem > 0 && !is_special(input[0])) { *out = input[0]; return 1; + } else if (rem > 1 && '\\' == input[0]) { + *out = input[1]; + return 2; } else { return -1; } diff --git a/tests/parser_tests.c b/tests/parser_tests.c index 1fab8b2..99cc913 100644 --- a/tests/parser_tests.c +++ b/tests/parser_tests.c @@ -97,6 +97,34 @@ static void dot_is_parsed_as_unquantified_wildcard_term(void) regex_free_children(&r); } +static void backslash_dot_is_parsed_as_unquantified_literal(void) +{ + regex_t r = { 0 }; + const int result = PARSE_REGEX_STRING("\\.", &r); + ASSERT_NE(-1, result); + + ASSERT_EQ(1, r.sequence.len); + ASSERT_EQ(QUANTIFIER_NONE, r.sequence.contents[0].quantifier); + ASSERT_EQ(TERM_TYPE_LITERAL, r.sequence.contents[0].type); + ASSERT_EQ('.', r.sequence.contents[0].literal); + + regex_free_children(&r); +} + +static void backslash_backslash_is_parsed_as_unquantified_literal(void) +{ + regex_t r = { 0 }; + const int result = PARSE_REGEX_STRING("\\\\", &r); + ASSERT_NE(-1, result); + + ASSERT_EQ(1, r.sequence.len); + ASSERT_EQ(QUANTIFIER_NONE, r.sequence.contents[0].quantifier); + ASSERT_EQ(TERM_TYPE_LITERAL, r.sequence.contents[0].type); + ASSERT_EQ('\\', r.sequence.contents[0].literal); + + regex_free_children(&r); +} + int main(void) { TESTING_BEGIN(); @@ -107,5 +135,7 @@ int main(void) b_is_parsed_as_unquantified_literal(); abc_is_parsed_as_sequence_of_unquantified_literals(); dot_is_parsed_as_unquantified_wildcard_term(); + backslash_dot_is_parsed_as_unquantified_literal(); + backslash_backslash_is_parsed_as_unquantified_literal(); return TESTING_END(); }