From 8286ac511144e4f17d34eac9affb97e50646344a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Wed, 23 Jul 2014 15:25:44 +0200 Subject: Imported Upstream version 4.0.0 --- libcutl/cutl/re/re.txx | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 libcutl/cutl/re/re.txx (limited to 'libcutl/cutl/re/re.txx') diff --git a/libcutl/cutl/re/re.txx b/libcutl/cutl/re/re.txx new file mode 100644 index 0000000..174e0d4 --- /dev/null +++ b/libcutl/cutl/re/re.txx @@ -0,0 +1,69 @@ +// file : cutl/re/re.txx +// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC +// license : MIT; see accompanying LICENSE file + +namespace cutl +{ + namespace re + { + // + // basic_regexsub + // + template + void basic_regexsub:: + init (string_type const& s) + { + string_type r; + typename string_type::size_type p (parse (s, 0, r)); + regex_ = r; + p = parse (s, p, sub_); + if (p + 1 < s.size ()) + throw basic_format (s, "junk after third delimiter"); + } + + // + // parse() + // + template + typename std::basic_string::size_type + parse (std::basic_string const& s, + typename std::basic_string::size_type p, + std::basic_string& r) + { + r.clear (); + typename std::basic_string::size_type n (s.size ()); + + if (p >= n) + throw basic_format (s, "empty expression"); + + char d (s[p++]); + + for (; p < n; ++p) + { + if (s[p] == d) + break; + + if (s[p] == '\\') + { + if (++p < n) + { + // Pass the escape sequence through unless it is the delimiter. + // + if (s[p] != d) + r += '\\'; + + r += s[p]; + } + // else {We ran out of stuff before finding the delimiter.} + } + else + r += s[p]; + } + + if (p == n) + throw basic_format (s, "missing closing delimiter"); + + return p; + } + } +} -- cgit v1.2.3