diff --git a/Frameworks/regexp/src/format_string.cc b/Frameworks/regexp/src/format_string.cc index 44c6a69d..738859ad 100644 --- a/Frameworks/regexp/src/format_string.cc +++ b/Frameworks/regexp/src/format_string.cc @@ -296,6 +296,32 @@ namespace format_string return format_string_t(format).expand(variables); } + std::string escape (std::string const& format) + { + std::string res = ""; + for(size_t i = 0; i < format.size(); ++i) + { + switch(format[i]) + { + case '\t': res.append("\\t"); break; + case '\r': res.append("\\r"); break; + case '\n': res.append("\\n"); break; + + case '$': case '(': case '\\': + { + if(format[i] != '\\' || i+1 != format.size() && strchr("\\$(trn", format[i+1])) + res.append("\\"); + } + /* continue */ + + default: + res += format[i]; + break; + } + } + return res; + } + } /* format_string */ namespace snippet diff --git a/Frameworks/regexp/src/format_string.h b/Frameworks/regexp/src/format_string.h index 52c473d0..6a838b4c 100644 --- a/Frameworks/regexp/src/format_string.h +++ b/Frameworks/regexp/src/format_string.h @@ -29,6 +29,7 @@ namespace format_string PUBLIC std::string replace (std::string const& src, regexp::pattern_t const& ptrn, format_string_t const& format, bool repeat = true, string_map_t const& variables = string_map_t()); PUBLIC std::string expand (std::string const& format, string_map_t const& variables = string_map_t()); + PUBLIC std::string escape (std::string const& format); } /* format_string */ diff --git a/Frameworks/regexp/tests/t_format_string.cc b/Frameworks/regexp/tests/t_format_string.cc index 39153566..39914d77 100644 --- a/Frameworks/regexp/tests/t_format_string.cc +++ b/Frameworks/regexp/tests/t_format_string.cc @@ -24,4 +24,18 @@ public: TS_ASSERT_EQUALS(replace("foo bar", "(foo)? bar", "(?n:baz)"), "(?n:baz)"); TS_ASSERT_EQUALS(replace("foo bar", "(foo)? bar", "(?n:baz:)"), "(?n:baz:)"); } + + void test_escape_format_string () + { + using format_string::escape; + using format_string::expand; + TS_ASSERT_EQUALS(escape("\t\n\r\\q"), "\\t\\n\\r\\q"); + TS_ASSERT_EQUALS(expand(escape("${var}")), "${var}"); + TS_ASSERT_EQUALS(expand(escape("foo\n")), "foo\n"); + TS_ASSERT_EQUALS(expand(escape("foo\\n")), "foo\\n"); + TS_ASSERT_EQUALS(expand(escape("\\No-Escape")), "\\No-Escape"); + TS_ASSERT_EQUALS(expand(escape("(?bla)")), "(?bla)"); + TS_ASSERT_EQUALS(expand(escape("Escape\\\\me")), "Escape\\\\me"); + TS_ASSERT_EQUALS(expand(escape("(?1:baz: buz)")), "(?1:baz: buz)"); + } };