summaryrefslogtreecommitdiffstats
path: root/libcxx/src
diff options
context:
space:
mode:
authorAlexis Hunt <alercah@gmail.com>2011-07-09 03:40:04 +0000
committerAlexis Hunt <alercah@gmail.com>2011-07-09 03:40:04 +0000
commit0081892d335b22f2d3b0b92071f7e7fc9d0172ec (patch)
tree3b8cecab889cae61ba2956c7f177da0ac26283d6 /libcxx/src
parent7eb661e6368ed048ce2bac4488b64b1523f08ad5 (diff)
downloadbcm5719-llvm-0081892d335b22f2d3b0b92071f7e7fc9d0172ec.tar.gz
bcm5719-llvm-0081892d335b22f2d3b0b92071f7e7fc9d0172ec.zip
Don't assume that wctype produces a nice mask on all platforms. On
glibc, for instance, it's a const char *. llvm-svn: 134787
Diffstat (limited to 'libcxx/src')
-rw-r--r--libcxx/src/locale.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/libcxx/src/locale.cpp b/libcxx/src/locale.cpp
index 63f54294a46..561fd62e3b2 100644
--- a/libcxx/src/locale.cpp
+++ b/libcxx/src/locale.cpp
@@ -1114,7 +1114,21 @@ ctype_byname<wchar_t>::~ctype_byname()
bool
ctype_byname<wchar_t>::do_is(mask m, char_type c) const
{
+#ifdef _LIBCPP_WCTYPE_IS_MASK
return static_cast<bool>(iswctype_l(c, m, __l));
+#else
+ if (m & space && !iswspace_l(c, __l)) return false;
+ if (m & print && !iswprint_l(c, __l)) return false;
+ if (m & cntrl && !iswcntrl_l(c, __l)) return false;
+ if (m & upper && !iswupper_l(c, __l)) return false;
+ if (m & lower && !iswlower_l(c, __l)) return false;
+ if (m & alpha && !iswalpha_l(c, __l)) return false;
+ if (m & digit && !iswdigit_l(c, __l)) return false;
+ if (m & punct && !iswpunct_l(c, __l)) return false;
+ if (m & xdigit && !iswxdigit_l(c, __l)) return false;
+ if (m & blank && !iswblank_l(c, __l)) return false;
+ return true;
+#endif
}
const wchar_t*
@@ -1154,8 +1168,24 @@ const wchar_t*
ctype_byname<wchar_t>::do_scan_is(mask m, const char_type* low, const char_type* high) const
{
for (; low != high; ++low)
+ {
+#ifdef _LIBCPP_WCTYPE_IS_MASK
if (iswctype_l(*low, m, __l))
break;
+#else
+ if (m & space && !iswspace_l(*low, __l)) continue;
+ if (m & print && !iswprint_l(*low, __l)) continue;
+ if (m & cntrl && !iswcntrl_l(*low, __l)) continue;
+ if (m & upper && !iswupper_l(*low, __l)) continue;
+ if (m & lower && !iswlower_l(*low, __l)) continue;
+ if (m & alpha && !iswalpha_l(*low, __l)) continue;
+ if (m & digit && !iswdigit_l(*low, __l)) continue;
+ if (m & punct && !iswpunct_l(*low, __l)) continue;
+ if (m & xdigit && !iswxdigit_l(*low, __l)) continue;
+ if (m & blank && !iswblank_l(*low, __l)) continue;
+ break;
+#endif
+ }
return low;
}
@@ -1163,8 +1193,24 @@ const wchar_t*
ctype_byname<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type* high) const
{
for (; low != high; ++low)
+ {
+#ifdef _LIBCPP_WCTYPE_IS_MASK
if (!iswctype_l(*low, m, __l))
break;
+#else
+ if (m & space && iswspace_l(*low, __l)) continue;
+ if (m & print && iswprint_l(*low, __l)) continue;
+ if (m & cntrl && iswcntrl_l(*low, __l)) continue;
+ if (m & upper && iswupper_l(*low, __l)) continue;
+ if (m & lower && iswlower_l(*low, __l)) continue;
+ if (m & alpha && iswalpha_l(*low, __l)) continue;
+ if (m & digit && iswdigit_l(*low, __l)) continue;
+ if (m & punct && iswpunct_l(*low, __l)) continue;
+ if (m & xdigit && iswxdigit_l(*low, __l)) continue;
+ if (m & blank && iswblank_l(*low, __l)) continue;
+ break;
+#endif
+ }
return low;
}
OpenPOWER on IntegriCloud