From 5a6ea019fd48b269121f95dc4afabce760531bbe Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 9 May 2012 11:49:37 +0200 Subject: Make regex class template --- cutl/re/re.txx | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 cutl/re/re.txx (limited to 'cutl/re/re.txx') diff --git a/cutl/re/re.txx b/cutl/re/re.txx new file mode 100644 index 0000000..9c4122b --- /dev/null +++ b/cutl/re/re.txx @@ -0,0 +1,69 @@ +// file : cutl/re/re.txx +// copyright : Copyright (c) 2009-2012 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.1