1 // -*- C++ -*- 2 //===-------------------------- codecvt -----------------------------------===// 3 // 4 // The LLVM Compiler Infrastructure 5 // 6 // This file is dual licensed under the MIT and the University of Illinois Open 7 // Source Licenses. See LICENSE.TXT for details. 8 // 9 //===----------------------------------------------------------------------===// 10 11 #ifndef _LIBCPP_CODECVT 12 #define _LIBCPP_CODECVT 13 14 /* 15 codecvt synopsis 16 17 namespace std 18 { 19 20 enum codecvt_mode 21 { 22 consume_header = 4, 23 generate_header = 2, 24 little_endian = 1 25 }; 26 27 template <class Elem, unsigned long Maxcode = 0x10ffff, 28 codecvt_mode Mode = (codecvt_mode)0> 29 class codecvt_utf8 30 : public codecvt<Elem, char, mbstate_t> 31 { 32 explicit codecvt_utf8(size_t refs = 0); 33 ~codecvt_utf8(); 34 }; 35 36 template <class Elem, unsigned long Maxcode = 0x10ffff, 37 codecvt_mode Mode = (codecvt_mode)0> 38 class codecvt_utf16 39 : public codecvt<Elem, char, mbstate_t> 40 { 41 explicit codecvt_utf16(size_t refs = 0); 42 ~codecvt_utf16(); 43 }; 44 45 template <class Elem, unsigned long Maxcode = 0x10ffff, 46 codecvt_mode Mode = (codecvt_mode)0> 47 class codecvt_utf8_utf16 48 : public codecvt<Elem, char, mbstate_t> 49 { 50 explicit codecvt_utf8_utf16(size_t refs = 0); 51 ~codecvt_utf8_utf16(); 52 }; 53 54 } // std 55 56 */ 57 58 #include <__config> 59 #include <__locale> 60 61 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 62 #pragma GCC system_header 63 #endif 64 65 _LIBCPP_BEGIN_NAMESPACE_STD 66 67 enum codecvt_mode 68 { 69 consume_header = 4, 70 generate_header = 2, 71 little_endian = 1 72 }; 73 74 // codecvt_utf8 75 76 template <class _Elem> class __codecvt_utf8; 77 78 template <> 79 class _LIBCPP_TYPE_VIS __codecvt_utf8<wchar_t> 80 : public codecvt<wchar_t, char, mbstate_t> 81 { 82 unsigned long _Maxcode_; 83 codecvt_mode _Mode_; 84 public: 85 typedef wchar_t intern_type; 86 typedef char extern_type; 87 typedef mbstate_t state_type; 88 89 _LIBCPP_ALWAYS_INLINE 90 explicit __codecvt_utf8(size_t __refs, unsigned long _Maxcode, 91 codecvt_mode _Mode) 92 : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), 93 _Mode_(_Mode) {} 94 protected: 95 virtual result 96 do_out(state_type& __st, 97 const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, 98 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 99 virtual result 100 do_in(state_type& __st, 101 const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, 102 intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; 103 virtual result 104 do_unshift(state_type& __st, 105 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 106 virtual int do_encoding() const throw(); 107 virtual bool do_always_noconv() const throw(); 108 virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, 109 size_t __mx) const; 110 virtual int do_max_length() const throw(); 111 }; 112 113 template <> 114 class _LIBCPP_TYPE_VIS __codecvt_utf8<char16_t> 115 : public codecvt<char16_t, char, mbstate_t> 116 { 117 unsigned long _Maxcode_; 118 codecvt_mode _Mode_; 119 public: 120 typedef char16_t intern_type; 121 typedef char extern_type; 122 typedef mbstate_t state_type; 123 124 _LIBCPP_ALWAYS_INLINE 125 explicit __codecvt_utf8(size_t __refs, unsigned long _Maxcode, 126 codecvt_mode _Mode) 127 : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), 128 _Mode_(_Mode) {} 129 protected: 130 virtual result 131 do_out(state_type& __st, 132 const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, 133 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 134 virtual result 135 do_in(state_type& __st, 136 const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, 137 intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; 138 virtual result 139 do_unshift(state_type& __st, 140 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 141 virtual int do_encoding() const throw(); 142 virtual bool do_always_noconv() const throw(); 143 virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, 144 size_t __mx) const; 145 virtual int do_max_length() const throw(); 146 }; 147 148 template <> 149 class _LIBCPP_TYPE_VIS __codecvt_utf8<char32_t> 150 : public codecvt<char32_t, char, mbstate_t> 151 { 152 unsigned long _Maxcode_; 153 codecvt_mode _Mode_; 154 public: 155 typedef char32_t intern_type; 156 typedef char extern_type; 157 typedef mbstate_t state_type; 158 159 _LIBCPP_ALWAYS_INLINE 160 explicit __codecvt_utf8(size_t __refs, unsigned long _Maxcode, 161 codecvt_mode _Mode) 162 : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), 163 _Mode_(_Mode) {} 164 protected: 165 virtual result 166 do_out(state_type& __st, 167 const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, 168 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 169 virtual result 170 do_in(state_type& __st, 171 const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, 172 intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; 173 virtual result 174 do_unshift(state_type& __st, 175 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 176 virtual int do_encoding() const throw(); 177 virtual bool do_always_noconv() const throw(); 178 virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, 179 size_t __mx) const; 180 virtual int do_max_length() const throw(); 181 }; 182 183 template <class _Elem, unsigned long _Maxcode = 0x10ffff, 184 codecvt_mode _Mode = (codecvt_mode)0> 185 class _LIBCPP_TYPE_VIS_ONLY codecvt_utf8 186 : public __codecvt_utf8<_Elem> 187 { 188 public: 189 _LIBCPP_ALWAYS_INLINE 190 explicit codecvt_utf8(size_t __refs = 0) 191 : __codecvt_utf8<_Elem>(__refs, _Maxcode, _Mode) {} 192 193 _LIBCPP_ALWAYS_INLINE 194 ~codecvt_utf8() {} 195 }; 196 197 // codecvt_utf16 198 199 template <class _Elem, bool _LittleEndian> class __codecvt_utf16; 200 201 template <> 202 class _LIBCPP_TYPE_VIS __codecvt_utf16<wchar_t, false> 203 : public codecvt<wchar_t, char, mbstate_t> 204 { 205 unsigned long _Maxcode_; 206 codecvt_mode _Mode_; 207 public: 208 typedef wchar_t intern_type; 209 typedef char extern_type; 210 typedef mbstate_t state_type; 211 212 _LIBCPP_ALWAYS_INLINE 213 explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode, 214 codecvt_mode _Mode) 215 : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), 216 _Mode_(_Mode) {} 217 protected: 218 virtual result 219 do_out(state_type& __st, 220 const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, 221 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 222 virtual result 223 do_in(state_type& __st, 224 const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, 225 intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; 226 virtual result 227 do_unshift(state_type& __st, 228 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 229 virtual int do_encoding() const throw(); 230 virtual bool do_always_noconv() const throw(); 231 virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, 232 size_t __mx) const; 233 virtual int do_max_length() const throw(); 234 }; 235 236 template <> 237 class _LIBCPP_TYPE_VIS __codecvt_utf16<wchar_t, true> 238 : public codecvt<wchar_t, char, mbstate_t> 239 { 240 unsigned long _Maxcode_; 241 codecvt_mode _Mode_; 242 public: 243 typedef wchar_t intern_type; 244 typedef char extern_type; 245 typedef mbstate_t state_type; 246 247 _LIBCPP_ALWAYS_INLINE 248 explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode, 249 codecvt_mode _Mode) 250 : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), 251 _Mode_(_Mode) {} 252 protected: 253 virtual result 254 do_out(state_type& __st, 255 const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, 256 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 257 virtual result 258 do_in(state_type& __st, 259 const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, 260 intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; 261 virtual result 262 do_unshift(state_type& __st, 263 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 264 virtual int do_encoding() const throw(); 265 virtual bool do_always_noconv() const throw(); 266 virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, 267 size_t __mx) const; 268 virtual int do_max_length() const throw(); 269 }; 270 271 template <> 272 class _LIBCPP_TYPE_VIS __codecvt_utf16<char16_t, false> 273 : public codecvt<char16_t, char, mbstate_t> 274 { 275 unsigned long _Maxcode_; 276 codecvt_mode _Mode_; 277 public: 278 typedef char16_t intern_type; 279 typedef char extern_type; 280 typedef mbstate_t state_type; 281 282 _LIBCPP_ALWAYS_INLINE 283 explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode, 284 codecvt_mode _Mode) 285 : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), 286 _Mode_(_Mode) {} 287 protected: 288 virtual result 289 do_out(state_type& __st, 290 const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, 291 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 292 virtual result 293 do_in(state_type& __st, 294 const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, 295 intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; 296 virtual result 297 do_unshift(state_type& __st, 298 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 299 virtual int do_encoding() const throw(); 300 virtual bool do_always_noconv() const throw(); 301 virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, 302 size_t __mx) const; 303 virtual int do_max_length() const throw(); 304 }; 305 306 template <> 307 class _LIBCPP_TYPE_VIS __codecvt_utf16<char16_t, true> 308 : public codecvt<char16_t, char, mbstate_t> 309 { 310 unsigned long _Maxcode_; 311 codecvt_mode _Mode_; 312 public: 313 typedef char16_t intern_type; 314 typedef char extern_type; 315 typedef mbstate_t state_type; 316 317 _LIBCPP_ALWAYS_INLINE 318 explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode, 319 codecvt_mode _Mode) 320 : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), 321 _Mode_(_Mode) {} 322 protected: 323 virtual result 324 do_out(state_type& __st, 325 const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, 326 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 327 virtual result 328 do_in(state_type& __st, 329 const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, 330 intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; 331 virtual result 332 do_unshift(state_type& __st, 333 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 334 virtual int do_encoding() const throw(); 335 virtual bool do_always_noconv() const throw(); 336 virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, 337 size_t __mx) const; 338 virtual int do_max_length() const throw(); 339 }; 340 341 template <> 342 class _LIBCPP_TYPE_VIS __codecvt_utf16<char32_t, false> 343 : public codecvt<char32_t, char, mbstate_t> 344 { 345 unsigned long _Maxcode_; 346 codecvt_mode _Mode_; 347 public: 348 typedef char32_t intern_type; 349 typedef char extern_type; 350 typedef mbstate_t state_type; 351 352 _LIBCPP_ALWAYS_INLINE 353 explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode, 354 codecvt_mode _Mode) 355 : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), 356 _Mode_(_Mode) {} 357 protected: 358 virtual result 359 do_out(state_type& __st, 360 const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, 361 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 362 virtual result 363 do_in(state_type& __st, 364 const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, 365 intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; 366 virtual result 367 do_unshift(state_type& __st, 368 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 369 virtual int do_encoding() const throw(); 370 virtual bool do_always_noconv() const throw(); 371 virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, 372 size_t __mx) const; 373 virtual int do_max_length() const throw(); 374 }; 375 376 template <> 377 class _LIBCPP_TYPE_VIS __codecvt_utf16<char32_t, true> 378 : public codecvt<char32_t, char, mbstate_t> 379 { 380 unsigned long _Maxcode_; 381 codecvt_mode _Mode_; 382 public: 383 typedef char32_t intern_type; 384 typedef char extern_type; 385 typedef mbstate_t state_type; 386 387 _LIBCPP_ALWAYS_INLINE 388 explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode, 389 codecvt_mode _Mode) 390 : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), 391 _Mode_(_Mode) {} 392 protected: 393 virtual result 394 do_out(state_type& __st, 395 const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, 396 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 397 virtual result 398 do_in(state_type& __st, 399 const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, 400 intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; 401 virtual result 402 do_unshift(state_type& __st, 403 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 404 virtual int do_encoding() const throw(); 405 virtual bool do_always_noconv() const throw(); 406 virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, 407 size_t __mx) const; 408 virtual int do_max_length() const throw(); 409 }; 410 411 template <class _Elem, unsigned long _Maxcode = 0x10ffff, 412 codecvt_mode _Mode = (codecvt_mode)0> 413 class _LIBCPP_TYPE_VIS_ONLY codecvt_utf16 414 : public __codecvt_utf16<_Elem, _Mode & little_endian> 415 { 416 public: 417 _LIBCPP_ALWAYS_INLINE 418 explicit codecvt_utf16(size_t __refs = 0) 419 : __codecvt_utf16<_Elem, _Mode & little_endian>(__refs, _Maxcode, _Mode) {} 420 421 _LIBCPP_ALWAYS_INLINE 422 ~codecvt_utf16() {} 423 }; 424 425 // codecvt_utf8_utf16 426 427 template <class _Elem> class __codecvt_utf8_utf16; 428 429 template <> 430 class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<wchar_t> 431 : public codecvt<wchar_t, char, mbstate_t> 432 { 433 unsigned long _Maxcode_; 434 codecvt_mode _Mode_; 435 public: 436 typedef wchar_t intern_type; 437 typedef char extern_type; 438 typedef mbstate_t state_type; 439 440 _LIBCPP_ALWAYS_INLINE 441 explicit __codecvt_utf8_utf16(size_t __refs, unsigned long _Maxcode, 442 codecvt_mode _Mode) 443 : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), 444 _Mode_(_Mode) {} 445 protected: 446 virtual result 447 do_out(state_type& __st, 448 const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, 449 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 450 virtual result 451 do_in(state_type& __st, 452 const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, 453 intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; 454 virtual result 455 do_unshift(state_type& __st, 456 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 457 virtual int do_encoding() const throw(); 458 virtual bool do_always_noconv() const throw(); 459 virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, 460 size_t __mx) const; 461 virtual int do_max_length() const throw(); 462 }; 463 464 template <> 465 class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<char32_t> 466 : public codecvt<char32_t, char, mbstate_t> 467 { 468 unsigned long _Maxcode_; 469 codecvt_mode _Mode_; 470 public: 471 typedef char32_t intern_type; 472 typedef char extern_type; 473 typedef mbstate_t state_type; 474 475 _LIBCPP_ALWAYS_INLINE 476 explicit __codecvt_utf8_utf16(size_t __refs, unsigned long _Maxcode, 477 codecvt_mode _Mode) 478 : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), 479 _Mode_(_Mode) {} 480 protected: 481 virtual result 482 do_out(state_type& __st, 483 const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, 484 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 485 virtual result 486 do_in(state_type& __st, 487 const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, 488 intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; 489 virtual result 490 do_unshift(state_type& __st, 491 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 492 virtual int do_encoding() const throw(); 493 virtual bool do_always_noconv() const throw(); 494 virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, 495 size_t __mx) const; 496 virtual int do_max_length() const throw(); 497 }; 498 499 template <> 500 class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<char16_t> 501 : public codecvt<char16_t, char, mbstate_t> 502 { 503 unsigned long _Maxcode_; 504 codecvt_mode _Mode_; 505 public: 506 typedef char16_t intern_type; 507 typedef char extern_type; 508 typedef mbstate_t state_type; 509 510 _LIBCPP_ALWAYS_INLINE 511 explicit __codecvt_utf8_utf16(size_t __refs, unsigned long _Maxcode, 512 codecvt_mode _Mode) 513 : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), 514 _Mode_(_Mode) {} 515 protected: 516 virtual result 517 do_out(state_type& __st, 518 const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, 519 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 520 virtual result 521 do_in(state_type& __st, 522 const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, 523 intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; 524 virtual result 525 do_unshift(state_type& __st, 526 extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; 527 virtual int do_encoding() const throw(); 528 virtual bool do_always_noconv() const throw(); 529 virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, 530 size_t __mx) const; 531 virtual int do_max_length() const throw(); 532 }; 533 534 template <class _Elem, unsigned long _Maxcode = 0x10ffff, 535 codecvt_mode _Mode = (codecvt_mode)0> 536 class _LIBCPP_TYPE_VIS_ONLY codecvt_utf8_utf16 537 : public __codecvt_utf8_utf16<_Elem> 538 { 539 public: 540 _LIBCPP_ALWAYS_INLINE 541 explicit codecvt_utf8_utf16(size_t __refs = 0) 542 : __codecvt_utf8_utf16<_Elem>(__refs, _Maxcode, _Mode) {} 543 544 _LIBCPP_ALWAYS_INLINE 545 ~codecvt_utf8_utf16() {} 546 }; 547 548 _LIBCPP_END_NAMESPACE_STD 549 550 #endif // _LIBCPP_CODECVT 551