Finished [re.traits]. I'd like to acknowledge the help of Bjorn Reese with <regex>.
llvm-svn: 106478
diff --git a/libcxx/src/regex.cpp b/libcxx/src/regex.cpp
index 5dff396..abb1b66 100644
--- a/libcxx/src/regex.cpp
+++ b/libcxx/src/regex.cpp
@@ -11,7 +11,6 @@
#include "algorithm"
#include "iterator"
-
_LIBCPP_BEGIN_NAMESPACE_STD
static
@@ -180,10 +179,37 @@
{"zero", 0x30}
};
+struct classnames
+{
+ const char* elem_;
+ ctype_base::mask mask_;
+};
+
+const classnames ClassNames[] =
+{
+ {"alnum", ctype_base::alnum},
+ {"alpha", ctype_base::alpha},
+ {"blank", ctype_base::blank},
+ {"cntrl", ctype_base::cntrl},
+ {"d", ctype_base::digit},
+ {"digit", ctype_base::digit},
+ {"graph", ctype_base::graph},
+ {"lower", ctype_base::lower},
+ {"print", ctype_base::print},
+ {"punct", ctype_base::punct},
+ {"s", ctype_base::space},
+ {"space", ctype_base::space},
+ {"upper", ctype_base::upper},
+ {"w", regex_traits<char>::__regex_word},
+ {"xdigit", ctype_base::xdigit}
+};
+
struct use_strcmp
{
bool operator()(const collationnames& x, const char* y)
{return strcmp(x.elem_, y) < 0;}
+ bool operator()(const classnames& x, const char* y)
+ {return strcmp(x.elem_, y) < 0;}
};
}
@@ -191,7 +217,6 @@
string
__get_collation_name(const char* s)
{
- typedef std::pair<collationnames*, collationnames*> P;
const collationnames* i =
lower_bound(begin(collatenames), end(collatenames), s, use_strcmp());
string r;
@@ -200,4 +225,24 @@
return r;
}
+ctype_base::mask
+__get_classname(const char* s, bool __icase)
+{
+ const classnames* i =
+ lower_bound(begin(ClassNames), end(ClassNames), s, use_strcmp());
+ ctype_base::mask r = 0;
+ if (i != end(ClassNames) && strcmp(s, i->elem_) == 0)
+ {
+ r = i->mask_;
+ if (r == regex_traits<char>::__regex_word)
+ r |= ctype_base::alnum | ctype_base::upper | ctype_base::lower;
+ else if (__icase)
+ {
+ if (r & (ctype_base::lower | ctype_base::upper))
+ r |= ctype_base::alpha;
+ }
+ }
+ return r;
+}
+
_LIBCPP_END_NAMESPACE_STD