From 13026c70ca0c947c41b8002e548bc22d64bd00d4 Mon Sep 17 00:00:00 2001 From: Allan Odgaard Date: Fri, 24 Aug 2012 21:42:20 +0200 Subject: [PATCH] Add format_string::escape This produces a string where all format string characters have been properly escaped. --- Frameworks/regexp/src/format_string.cc | 26 ++++++++++++++++++++++ Frameworks/regexp/src/format_string.h | 1 + Frameworks/regexp/tests/t_format_string.cc | 14 ++++++++++++ 3 files changed, 41 insertions(+) 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)"); + } };