Hi mclow.lists, EricWF,
The previous method was very dependent on how the ctype masks were defined. For
example, Android has print defined as `(punct | upper | lower | digit |
blank)`. When calling `do_is(upper, L'a')`, result would be set to true by `if
(upper & print) result |= iswprint_l(L'a', __l)`;
http://reviews.llvm.org/D5071
Files:
src/locale.cpp
Index: src/locale.cpp
===================================================================
--- src/locale.cpp
+++ src/locale.cpp
@@ -1178,19 +1178,37 @@
#ifdef _LIBCPP_WCTYPE_IS_MASK
return static_cast<bool>(iswctype_l(c, m, __l));
#else
- bool result = false;
wint_t ch = static_cast<wint_t>(c);
- if (m & space) result |= (iswspace_l(ch, __l) != 0);
- if (m & print) result |= (iswprint_l(ch, __l) != 0);
- if (m & cntrl) result |= (iswcntrl_l(ch, __l) != 0);
- if (m & upper) result |= (iswupper_l(ch, __l) != 0);
- if (m & lower) result |= (iswlower_l(ch, __l) != 0);
- if (m & alpha) result |= (iswalpha_l(ch, __l) != 0);
- if (m & digit) result |= (iswdigit_l(ch, __l) != 0);
- if (m & punct) result |= (iswpunct_l(ch, __l) != 0);
- if (m & xdigit) result |= (iswxdigit_l(ch, __l) != 0);
- if (m & blank) result |= (iswblank_l(ch, __l) != 0);
- return result;
+ switch (m) {
+ case space:
+ return iswspace_l(ch, __l);
+ case print:
+ return iswprint_l(ch, __l);
+ case cntrl:
+ return iswcntrl_l(ch, __l);
+ case upper:
+ return iswupper_l(ch, __l);
+ case lower:
+ return iswlower_l(ch, __l);
+ case alpha:
+ return iswalpha_l(ch, __l);
+ case digit:
+ return iswdigit_l(ch, __l);
+ case alnum:
+ return iswalnum_l(ch, __l);
+ case punct:
+ return iswpunct_l(ch, __l);
+ case xdigit:
+ return iswxdigit_l(ch, __l);
+ case blank:
+ return iswblank_l(ch, __l);
+ case graph:
+ return iswgraph_l(ch, __l);
+ default:
+ _LIBCPP_ASSERT(false,
+ "unhandled ctype mask in ctype_byname<wchar_t>::do_is");
+ abort();
+ }
#endif
}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits