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

Reply via email to