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 // <codecvt> 11 12 // template <class Elem, unsigned long Maxcode = 0x10ffff, 13 // codecvt_mode Mode = (codecvt_mode)0> 14 // class codecvt_utf8 15 // : public codecvt<Elem, char, mbstate_t> 16 // { 17 // // unspecified 18 // }; 19 20 // result 21 // in(stateT& state, 22 // const externT* from, const externT* from_end, const externT*& from_next, 23 // internT* to, internT* to_end, internT*& to_next) const; 24 25 #include <codecvt> 26 #include <cassert> 27 28 int main() 29 { 30 { 31 typedef std::codecvt_utf8<char32_t> C; 32 C c; 33 char32_t w = 0; 34 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; 35 char32_t* wp = nullptr; 36 std::mbstate_t m; 37 const char* np = nullptr; 38 std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp); 39 assert(r == std::codecvt_base::ok); 40 assert(wp == &w+1); 41 assert(np == n+4); 42 assert(w == 0x40003); 43 44 n[0] = char(0xE1); 45 n[1] = char(0x80); 46 n[2] = char(0x85); 47 r = c.in(m, n, n+3, np, &w, &w+1, wp); 48 assert(r == std::codecvt_base::ok); 49 assert(wp == &w+1); 50 assert(np == n+3); 51 assert(w == 0x1005); 52 53 n[0] = char(0xD1); 54 n[1] = char(0x93); 55 r = c.in(m, n, n+2, np, &w, &w+1, wp); 56 assert(r == std::codecvt_base::ok); 57 assert(wp == &w+1); 58 assert(np == n+2); 59 assert(w == 0x453); 60 61 w = 0x56; 62 n[0] = char(0x56); 63 r = c.in(m, n, n+1, np, &w, &w+1, wp); 64 assert(r == std::codecvt_base::ok); 65 assert(wp == &w+1); 66 assert(np == n+1); 67 assert(w == 0x56); 68 } 69 { 70 typedef std::codecvt_utf8<char32_t, 0x1000> C; 71 C c; 72 char32_t w = 0; 73 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; 74 char32_t* wp = nullptr; 75 std::mbstate_t m; 76 const char* np = nullptr; 77 std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp); 78 assert(r == std::codecvt_base::error); 79 assert(wp == &w); 80 assert(np == n); 81 assert(w == 0); 82 83 n[0] = char(0xE1); 84 n[1] = char(0x80); 85 n[2] = char(0x85); 86 r = c.in(m, n, n+3, np, &w, &w+1, wp); 87 assert(r == std::codecvt_base::error); 88 assert(wp == &w); 89 assert(np == n); 90 assert(w == 0); 91 92 n[0] = char(0xD1); 93 n[1] = char(0x93); 94 r = c.in(m, n, n+2, np, &w, &w+1, wp); 95 assert(r == std::codecvt_base::ok); 96 assert(wp == &w+1); 97 assert(np == n+2); 98 assert(w == 0x453); 99 100 w = 0x56; 101 n[0] = char(0x56); 102 r = c.in(m, n, n+1, np, &w, &w+1, wp); 103 assert(r == std::codecvt_base::ok); 104 assert(wp == &w+1); 105 assert(np == n+1); 106 assert(w == 0x56); 107 } 108 { 109 typedef std::codecvt_utf8<char32_t, 0xFFFFFFFF, std::consume_header> C; 110 C c; 111 char32_t w = 0; 112 char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)}; 113 char32_t* wp = nullptr; 114 std::mbstate_t m; 115 const char* np = nullptr; 116 std::codecvt_base::result r = c.in(m, n, n+7, np, &w, &w+1, wp); 117 assert(r == std::codecvt_base::ok); 118 assert(wp == &w+1); 119 assert(np == n+7); 120 assert(w == 0x40003); 121 122 n[0] = char(0xE1); 123 n[1] = char(0x80); 124 n[2] = char(0x85); 125 r = c.in(m, n, n+3, np, &w, &w+1, wp); 126 assert(r == std::codecvt_base::ok); 127 assert(wp == &w+1); 128 assert(np == n+3); 129 assert(w == 0x1005); 130 131 n[0] = char(0xEF); 132 n[1] = char(0xBB); 133 n[2] = char(0xBF); 134 n[3] = char(0xD1); 135 n[4] = char(0x93); 136 r = c.in(m, n, n+5, np, &w, &w+1, wp); 137 assert(r == std::codecvt_base::ok); 138 assert(wp == &w+1); 139 assert(np == n+5); 140 assert(w == 0x453); 141 142 w = 0x56; 143 n[0] = char(0x56); 144 r = c.in(m, n, n+1, np, &w, &w+1, wp); 145 assert(r == std::codecvt_base::ok); 146 assert(wp == &w+1); 147 assert(np == n+1); 148 assert(w == 0x56); 149 } 150 { 151 typedef std::codecvt_utf8<char32_t> C; 152 C c; 153 char32_t w = 0; 154 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; 155 char32_t* wp = nullptr; 156 std::mbstate_t m; 157 const char* np = nullptr; 158 std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp); 159 assert(r == std::codecvt_base::ok); 160 assert(wp == &w+1); 161 assert(np == n+4); 162 assert(w == 0x40003); 163 164 n[0] = char(0xE1); 165 n[1] = char(0x80); 166 n[2] = char(0x85); 167 r = c.in(m, n, n+3, np, &w, &w+1, wp); 168 assert(r == std::codecvt_base::ok); 169 assert(wp == &w+1); 170 assert(np == n+3); 171 assert(w == 0x1005); 172 173 n[0] = char(0xD1); 174 n[1] = char(0x93); 175 r = c.in(m, n, n+2, np, &w, &w+1, wp); 176 assert(r == std::codecvt_base::ok); 177 assert(wp == &w+1); 178 assert(np == n+2); 179 assert(w == 0x453); 180 181 w = 0x56; 182 n[0] = char(0x56); 183 r = c.in(m, n, n+1, np, &w, &w+1, wp); 184 assert(r == std::codecvt_base::ok); 185 assert(wp == &w+1); 186 assert(np == n+1); 187 assert(w == 0x56); 188 } 189 { 190 typedef std::codecvt_utf8<char32_t, 0x1000> C; 191 C c; 192 char32_t w = 0; 193 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; 194 char32_t* wp = nullptr; 195 std::mbstate_t m; 196 const char* np = nullptr; 197 std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp); 198 assert(r == std::codecvt_base::error); 199 assert(wp == &w); 200 assert(np == n); 201 assert(w == 0); 202 203 n[0] = char(0xE1); 204 n[1] = char(0x80); 205 n[2] = char(0x85); 206 r = c.in(m, n, n+3, np, &w, &w+1, wp); 207 assert(r == std::codecvt_base::error); 208 assert(wp == &w); 209 assert(np == n); 210 assert(w == 0); 211 212 n[0] = char(0xD1); 213 n[1] = char(0x93); 214 r = c.in(m, n, n+2, np, &w, &w+1, wp); 215 assert(r == std::codecvt_base::ok); 216 assert(wp == &w+1); 217 assert(np == n+2); 218 assert(w == 0x453); 219 220 w = 0x56; 221 n[0] = char(0x56); 222 r = c.in(m, n, n+1, np, &w, &w+1, wp); 223 assert(r == std::codecvt_base::ok); 224 assert(wp == &w+1); 225 assert(np == n+1); 226 assert(w == 0x56); 227 } 228 { 229 typedef std::codecvt_utf8<char32_t, 0xFFFFFFFF, std::consume_header> C; 230 C c; 231 char32_t w = 0; 232 char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)}; 233 char32_t* wp = nullptr; 234 std::mbstate_t m; 235 const char* np = nullptr; 236 std::codecvt_base::result r = c.in(m, n, n+7, np, &w, &w+1, wp); 237 assert(r == std::codecvt_base::ok); 238 assert(wp == &w+1); 239 assert(np == n+7); 240 assert(w == 0x40003); 241 242 n[0] = char(0xE1); 243 n[1] = char(0x80); 244 n[2] = char(0x85); 245 r = c.in(m, n, n+3, np, &w, &w+1, wp); 246 assert(r == std::codecvt_base::ok); 247 assert(wp == &w+1); 248 assert(np == n+3); 249 assert(w == 0x1005); 250 251 n[0] = char(0xEF); 252 n[1] = char(0xBB); 253 n[2] = char(0xBF); 254 n[3] = char(0xD1); 255 n[4] = char(0x93); 256 r = c.in(m, n, n+5, np, &w, &w+1, wp); 257 assert(r == std::codecvt_base::ok); 258 assert(wp == &w+1); 259 assert(np == n+5); 260 assert(w == 0x453); 261 262 w = 0x56; 263 n[0] = char(0x56); 264 r = c.in(m, n, n+1, np, &w, &w+1, wp); 265 assert(r == std::codecvt_base::ok); 266 assert(wp == &w+1); 267 assert(np == n+1); 268 assert(w == 0x56); 269 } 270 { 271 typedef std::codecvt_utf8<char16_t> C; 272 C c; 273 char16_t w = 0; 274 char n[3] = {char(0xE1), char(0x80), char(0x85)}; 275 char16_t* wp = nullptr; 276 std::mbstate_t m; 277 const char* np = nullptr; 278 std::codecvt_base::result r = c.in(m, n, n+3, np, &w, &w+1, wp); 279 assert(r == std::codecvt_base::ok); 280 assert(wp == &w+1); 281 assert(np == n+3); 282 assert(w == 0x1005); 283 284 n[0] = char(0xD1); 285 n[1] = char(0x93); 286 r = c.in(m, n, n+2, np, &w, &w+1, wp); 287 assert(r == std::codecvt_base::ok); 288 assert(wp == &w+1); 289 assert(np == n+2); 290 assert(w == 0x453); 291 292 w = 0x56; 293 n[0] = char(0x56); 294 r = c.in(m, n, n+1, np, &w, &w+1, wp); 295 assert(r == std::codecvt_base::ok); 296 assert(wp == &w+1); 297 assert(np == n+1); 298 assert(w == 0x56); 299 } 300 { 301 typedef std::codecvt_utf8<char16_t, 0x1000> C; 302 C c; 303 char16_t w = 0; 304 char n[3] = {char(0xE1), char(0x80), char(0x85)}; 305 char16_t* wp = nullptr; 306 std::mbstate_t m; 307 const char* np = nullptr; 308 std::codecvt_base::result r = c.in(m, n, n+3, np, &w, &w+1, wp); 309 assert(r == std::codecvt_base::error); 310 assert(wp == &w); 311 assert(np == n); 312 assert(w == 0); 313 314 n[0] = char(0xD1); 315 n[1] = char(0x93); 316 r = c.in(m, n, n+2, np, &w, &w+1, wp); 317 assert(r == std::codecvt_base::ok); 318 assert(wp == &w+1); 319 assert(np == n+2); 320 assert(w == 0x453); 321 322 w = 0x56; 323 n[0] = char(0x56); 324 r = c.in(m, n, n+1, np, &w, &w+1, wp); 325 assert(r == std::codecvt_base::ok); 326 assert(wp == &w+1); 327 assert(np == n+1); 328 assert(w == 0x56); 329 } 330 { 331 typedef std::codecvt_utf8<char16_t, 0xFFFFFFFF, std::consume_header> C; 332 C c; 333 char16_t w = 0; 334 char n[6] = {char(0xEF), char(0xBB), char(0xBF), char(0xE1), char(0x80), char(0x85)}; 335 char16_t* wp = nullptr; 336 std::mbstate_t m; 337 const char* np = nullptr; 338 std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp); 339 assert(r == std::codecvt_base::ok); 340 assert(wp == &w+1); 341 assert(np == n+6); 342 assert(w == 0x1005); 343 344 n[0] = char(0xD1); 345 n[1] = char(0x93); 346 r = c.in(m, n, n+2, np, &w, &w+1, wp); 347 assert(r == std::codecvt_base::ok); 348 assert(wp == &w+1); 349 assert(np == n+2); 350 assert(w == 0x453); 351 352 w = 0x56; 353 n[0] = char(0x56); 354 r = c.in(m, n, n+1, np, &w, &w+1, wp); 355 assert(r == std::codecvt_base::ok); 356 assert(wp == &w+1); 357 assert(np == n+1); 358 assert(w == 0x56); 359 } 360 } 361