From 5d50c0499b30650deafc291a3872a386d08a3200 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 21 Jun 2017 13:03:56 +0300 Subject: Add regex utility functions --- libbutl/regex.cxx | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 libbutl/regex.cxx (limited to 'libbutl/regex.cxx') diff --git a/libbutl/regex.cxx b/libbutl/regex.cxx new file mode 100644 index 0000000..4e2e26f --- /dev/null +++ b/libbutl/regex.cxx @@ -0,0 +1,45 @@ +// file : libbutl/regex.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include + +#if defined(_MSC_VER) && _MSC_VER <= 1910 +# include // strstr() +#endif + +#include +#include +#include // runtime_error + +#include // operator<<(ostream, exception) + +namespace std +{ + // Currently libstdc++ just returns the name of the exception (bug #67361). + // So we check that the description contains at least one space character. + // + // While VC's description is meaningful, it has an undesired prefix that + // resembles the following: 'regex_error(error_badrepeat): '. So we skip it. + // + ostream& + operator<< (ostream& o, const regex_error& e) + { + const char* d (e.what ()); + +#if defined(_MSC_VER) && _MSC_VER <= 1910 + const char* rd (strstr (d, "): ")); + if (rd != nullptr) + d = rd + 3; +#endif + + ostringstream os; + os << runtime_error (d); // Sanitize the description. + + string s (os.str ()); + if (s.find (' ') != string::npos) + o << ": " << s; + + return o; + } +} -- cgit v1.1