1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // <locale> 11 12 // template <class charT> class ctype_byname; 13 14 // const charT* do_is(const charT* low, const charT* high, mask* vec) const; 15 16 // REQUIRES: locale.en_US.UTF-8 17 18 #include <locale> 19 #include <string> 20 #include <vector> 21 #include <cassert> 22 23 #include <stdio.h> 24 25 #include "platform_support.h" // locale name macros 26 main()27int main() 28 { 29 { 30 std::locale l(LOCALE_en_US_UTF_8); 31 { 32 typedef std::ctype<wchar_t> F; 33 const F& f = std::use_facet<F>(l); 34 const std::wstring in(L"\x00DA A\x07.a1"); 35 std::vector<F::mask> m(in.size()); 36 const wchar_t* h = f.is(in.data(), in.data() + in.size(), m.data()); 37 assert(h == in.data() + in.size()); 38 39 // L'\x00DA' 40 assert(!(m[0] & F::space)); 41 assert( (m[0] & F::print)); 42 assert(!(m[0] & F::cntrl)); 43 assert( (m[0] & F::upper)); 44 assert(!(m[0] & F::lower)); 45 assert( (m[0] & F::alpha)); 46 assert(!(m[0] & F::digit)); 47 assert(!(m[0] & F::punct)); 48 assert(!(m[0] & F::xdigit)); 49 assert(!(m[0] & F::blank)); 50 assert( (m[0] & F::alnum)); 51 assert( (m[0] & F::graph)); 52 53 // L' ' 54 assert( (m[1] & F::space)); 55 assert( (m[1] & F::print)); 56 assert(!(m[1] & F::cntrl)); 57 assert(!(m[1] & F::upper)); 58 assert(!(m[1] & F::lower)); 59 assert(!(m[1] & F::alpha)); 60 assert(!(m[1] & F::digit)); 61 assert(!(m[1] & F::punct)); 62 assert(!(m[1] & F::xdigit)); 63 assert( (m[1] & F::blank)); 64 assert(!(m[1] & F::alnum)); 65 assert(!(m[1] & F::graph)); 66 67 // L'A' 68 assert(!(m[2] & F::space)); 69 assert( (m[2] & F::print)); 70 assert(!(m[2] & F::cntrl)); 71 assert( (m[2] & F::upper)); 72 assert(!(m[2] & F::lower)); 73 assert( (m[2] & F::alpha)); 74 assert(!(m[2] & F::digit)); 75 assert(!(m[2] & F::punct)); 76 assert( (m[2] & F::xdigit)); 77 assert(!(m[2] & F::blank)); 78 assert( (m[2] & F::alnum)); 79 assert( (m[2] & F::graph)); 80 81 // L'\x07' 82 assert(!(m[3] & F::space)); 83 assert(!(m[3] & F::print)); 84 assert( (m[3] & F::cntrl)); 85 assert(!(m[3] & F::upper)); 86 assert(!(m[3] & F::lower)); 87 assert(!(m[3] & F::alpha)); 88 assert(!(m[3] & F::digit)); 89 assert(!(m[3] & F::punct)); 90 assert(!(m[3] & F::xdigit)); 91 assert(!(m[3] & F::blank)); 92 assert(!(m[3] & F::alnum)); 93 assert(!(m[3] & F::graph)); 94 95 // L'.' 96 assert(!(m[4] & F::space)); 97 assert( (m[4] & F::print)); 98 assert(!(m[4] & F::cntrl)); 99 assert(!(m[4] & F::upper)); 100 assert(!(m[4] & F::lower)); 101 assert(!(m[4] & F::alpha)); 102 assert(!(m[4] & F::digit)); 103 assert( (m[4] & F::punct)); 104 assert(!(m[4] & F::xdigit)); 105 assert(!(m[4] & F::blank)); 106 assert(!(m[4] & F::alnum)); 107 assert( (m[4] & F::graph)); 108 109 // L'a' 110 assert(!(m[5] & F::space)); 111 assert( (m[5] & F::print)); 112 assert(!(m[5] & F::cntrl)); 113 assert(!(m[5] & F::upper)); 114 assert( (m[5] & F::lower)); 115 assert( (m[5] & F::alpha)); 116 assert(!(m[5] & F::digit)); 117 assert(!(m[5] & F::punct)); 118 assert( (m[5] & F::xdigit)); 119 assert(!(m[5] & F::blank)); 120 assert( (m[5] & F::alnum)); 121 assert( (m[5] & F::graph)); 122 123 // L'1' 124 assert(!(m[6] & F::space)); 125 assert( (m[6] & F::print)); 126 assert(!(m[6] & F::cntrl)); 127 assert(!(m[6] & F::upper)); 128 assert(!(m[6] & F::lower)); 129 assert(!(m[6] & F::alpha)); 130 assert( (m[6] & F::digit)); 131 assert(!(m[6] & F::punct)); 132 assert( (m[6] & F::xdigit)); 133 assert(!(m[6] & F::blank)); 134 assert( (m[6] & F::alnum)); 135 assert( (m[6] & F::graph)); 136 } 137 } 138 { 139 std::locale l("C"); 140 { 141 typedef std::ctype<wchar_t> F; 142 const F& f = std::use_facet<F>(l); 143 const std::wstring in(L"\x00DA A\x07.a1"); 144 std::vector<F::mask> m(in.size()); 145 const wchar_t* h = f.is(in.data(), in.data() + in.size(), m.data()); 146 assert(h == in.data() + in.size()); 147 148 // L'\x00DA' 149 assert(!(m[0] & F::space)); 150 assert(!(m[0] & F::print)); 151 assert(!(m[0] & F::cntrl)); 152 assert(!(m[0] & F::upper)); 153 assert(!(m[0] & F::lower)); 154 assert(!(m[0] & F::alpha)); 155 assert(!(m[0] & F::digit)); 156 assert(!(m[0] & F::punct)); 157 assert(!(m[0] & F::xdigit)); 158 assert(!(m[0] & F::blank)); 159 assert(!(m[0] & F::alnum)); 160 assert(!(m[0] & F::graph)); 161 162 // L' ' 163 assert( (m[1] & F::space)); 164 assert( (m[1] & F::print)); 165 assert(!(m[1] & F::cntrl)); 166 assert(!(m[1] & F::upper)); 167 assert(!(m[1] & F::lower)); 168 assert(!(m[1] & F::alpha)); 169 assert(!(m[1] & F::digit)); 170 assert(!(m[1] & F::punct)); 171 assert(!(m[1] & F::xdigit)); 172 assert( (m[1] & F::blank)); 173 assert(!(m[1] & F::alnum)); 174 assert(!(m[1] & F::graph)); 175 176 // L'A' 177 assert(!(m[2] & F::space)); 178 assert( (m[2] & F::print)); 179 assert(!(m[2] & F::cntrl)); 180 assert( (m[2] & F::upper)); 181 assert(!(m[2] & F::lower)); 182 assert( (m[2] & F::alpha)); 183 assert(!(m[2] & F::digit)); 184 assert(!(m[2] & F::punct)); 185 assert( (m[2] & F::xdigit)); 186 assert(!(m[2] & F::blank)); 187 assert( (m[2] & F::alnum)); 188 assert( (m[2] & F::graph)); 189 190 // L'\x07' 191 assert(!(m[3] & F::space)); 192 assert(!(m[3] & F::print)); 193 assert( (m[3] & F::cntrl)); 194 assert(!(m[3] & F::upper)); 195 assert(!(m[3] & F::lower)); 196 assert(!(m[3] & F::alpha)); 197 assert(!(m[3] & F::digit)); 198 assert(!(m[3] & F::punct)); 199 assert(!(m[3] & F::xdigit)); 200 assert(!(m[3] & F::blank)); 201 assert(!(m[3] & F::alnum)); 202 assert(!(m[3] & F::graph)); 203 204 // L'.' 205 assert(!(m[4] & F::space)); 206 assert( (m[4] & F::print)); 207 assert(!(m[4] & F::cntrl)); 208 assert(!(m[4] & F::upper)); 209 assert(!(m[4] & F::lower)); 210 assert(!(m[4] & F::alpha)); 211 assert(!(m[4] & F::digit)); 212 assert( (m[4] & F::punct)); 213 assert(!(m[4] & F::xdigit)); 214 assert(!(m[4] & F::blank)); 215 assert(!(m[4] & F::alnum)); 216 assert( (m[4] & F::graph)); 217 218 // L'a' 219 assert(!(m[5] & F::space)); 220 assert( (m[5] & F::print)); 221 assert(!(m[5] & F::cntrl)); 222 assert(!(m[5] & F::upper)); 223 assert( (m[5] & F::lower)); 224 assert( (m[5] & F::alpha)); 225 assert(!(m[5] & F::digit)); 226 assert(!(m[5] & F::punct)); 227 assert( (m[5] & F::xdigit)); 228 assert(!(m[5] & F::blank)); 229 assert( (m[5] & F::alnum)); 230 assert( (m[5] & F::graph)); 231 232 // L'1' 233 assert(!(m[6] & F::space)); 234 assert( (m[6] & F::print)); 235 assert(!(m[6] & F::cntrl)); 236 assert(!(m[6] & F::upper)); 237 assert(!(m[6] & F::lower)); 238 assert(!(m[6] & F::alpha)); 239 assert( (m[6] & F::digit)); 240 assert(!(m[6] & F::punct)); 241 assert( (m[6] & F::xdigit)); 242 assert(!(m[6] & F::blank)); 243 assert( (m[6] & F::alnum)); 244 assert( (m[6] & F::graph)); 245 } 246 } 247 } 248