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 17namespace std 18{ 19 20enum codecvt_mode 21{ 22 consume_header = 4, 23 generate_header = 2, 24 little_endian = 1 25}; 26 27template <class Elem, unsigned long Maxcode = 0x10ffff, 28 codecvt_mode Mode = (codecvt_mode)0> 29class codecvt_utf8 30 : public codecvt<Elem, char, mbstate_t> 31{ 32 explicit codecvt_utf8(size_t refs = 0); 33 ~codecvt_utf8(); 34}; 35 36template <class Elem, unsigned long Maxcode = 0x10ffff, 37 codecvt_mode Mode = (codecvt_mode)0> 38class codecvt_utf16 39 : public codecvt<Elem, char, mbstate_t> 40{ 41 explicit codecvt_utf16(size_t refs = 0); 42 ~codecvt_utf16(); 43}; 44 45template <class Elem, unsigned long Maxcode = 0x10ffff, 46 codecvt_mode Mode = (codecvt_mode)0> 47class 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 67enum codecvt_mode 68{ 69 consume_header = 4, 70 generate_header = 2, 71 little_endian = 1 72}; 73 74// codecvt_utf8 75 76template <class _Elem> class __codecvt_utf8; 77 78template <> 79class _LIBCPP_TYPE_VIS __codecvt_utf8<wchar_t> 80 : public codecvt<wchar_t, char, mbstate_t> 81{ 82 unsigned long _Maxcode_; 83 codecvt_mode _Mode_; 84public: 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) {} 94protected: 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 113template <> 114class _LIBCPP_TYPE_VIS __codecvt_utf8<char16_t> 115 : public codecvt<char16_t, char, mbstate_t> 116{ 117 unsigned long _Maxcode_; 118 codecvt_mode _Mode_; 119public: 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) {} 129protected: 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 148template <> 149class _LIBCPP_TYPE_VIS __codecvt_utf8<char32_t> 150 : public codecvt<char32_t, char, mbstate_t> 151{ 152 unsigned long _Maxcode_; 153 codecvt_mode _Mode_; 154public: 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) {} 164protected: 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 183template <class _Elem, unsigned long _Maxcode = 0x10ffff, 184 codecvt_mode _Mode = (codecvt_mode)0> 185class _LIBCPP_TEMPLATE_VIS codecvt_utf8 186 : public __codecvt_utf8<_Elem> 187{ 188public: 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 199template <class _Elem, bool _LittleEndian> class __codecvt_utf16; 200 201template <> 202class _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_; 207public: 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) {} 217protected: 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 236template <> 237class _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_; 242public: 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) {} 252protected: 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 271template <> 272class _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_; 277public: 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) {} 287protected: 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 306template <> 307class _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_; 312public: 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) {} 322protected: 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 341template <> 342class _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_; 347public: 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) {} 357protected: 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 376template <> 377class _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_; 382public: 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) {} 392protected: 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 411template <class _Elem, unsigned long _Maxcode = 0x10ffff, 412 codecvt_mode _Mode = (codecvt_mode)0> 413class _LIBCPP_TEMPLATE_VIS codecvt_utf16 414 : public __codecvt_utf16<_Elem, _Mode & little_endian> 415{ 416public: 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 427template <class _Elem> class __codecvt_utf8_utf16; 428 429template <> 430class _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_; 435public: 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) {} 445protected: 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 464template <> 465class _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_; 470public: 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) {} 480protected: 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 499template <> 500class _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_; 505public: 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) {} 515protected: 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 534template <class _Elem, unsigned long _Maxcode = 0x10ffff, 535 codecvt_mode _Mode = (codecvt_mode)0> 536class _LIBCPP_TEMPLATE_VIS codecvt_utf8_utf16 537 : public __codecvt_utf8_utf16<_Elem> 538{ 539public: 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