// file : cutl/re/re.txx // copyright : Copyright (c) 2009-2017 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; } } }