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