15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
95a83710eSEric Fiselier // <codecvt>
105a83710eSEric Fiselier
11*3ee9a50aSNikolas Klauser // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
12*3ee9a50aSNikolas Klauser
135a83710eSEric Fiselier // template <class Elem, unsigned long Maxcode = 0x10ffff,
145a83710eSEric Fiselier // codecvt_mode Mode = (codecvt_mode)0>
155a83710eSEric Fiselier // class codecvt_utf8
165a83710eSEric Fiselier // : public codecvt<Elem, char, mbstate_t>
175a83710eSEric Fiselier // {
185a83710eSEric Fiselier // // unspecified
195a83710eSEric Fiselier // };
205a83710eSEric Fiselier
215a83710eSEric Fiselier // result
225a83710eSEric Fiselier // in(stateT& state,
235a83710eSEric Fiselier // const externT* from, const externT* from_end, const externT*& from_next,
245a83710eSEric Fiselier // internT* to, internT* to_end, internT*& to_next) const;
255a83710eSEric Fiselier
265a83710eSEric Fiselier #include <codecvt>
275a83710eSEric Fiselier #include <cassert>
285a83710eSEric Fiselier
297fc6a556SMarshall Clow #include "test_macros.h"
307fc6a556SMarshall Clow
main(int,char **)312df59c50SJF Bastien int main(int, char**)
325a83710eSEric Fiselier {
335a83710eSEric Fiselier {
34b2684a52SSaleem Abdulrasool typedef std::codecvt_utf8<char32_t> C;
355a83710eSEric Fiselier C c;
36b2684a52SSaleem Abdulrasool char32_t w = 0;
375a83710eSEric Fiselier char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
38b2684a52SSaleem Abdulrasool char32_t* wp = nullptr;
395a83710eSEric Fiselier std::mbstate_t m;
405a83710eSEric Fiselier const char* np = nullptr;
415a83710eSEric Fiselier std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
425a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
435a83710eSEric Fiselier assert(wp == &w+1);
445a83710eSEric Fiselier assert(np == n+4);
455a83710eSEric Fiselier assert(w == 0x40003);
465a83710eSEric Fiselier
475a83710eSEric Fiselier n[0] = char(0xE1);
485a83710eSEric Fiselier n[1] = char(0x80);
495a83710eSEric Fiselier n[2] = char(0x85);
505a83710eSEric Fiselier r = c.in(m, n, n+3, np, &w, &w+1, wp);
515a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
525a83710eSEric Fiselier assert(wp == &w+1);
535a83710eSEric Fiselier assert(np == n+3);
545a83710eSEric Fiselier assert(w == 0x1005);
555a83710eSEric Fiselier
565a83710eSEric Fiselier n[0] = char(0xD1);
575a83710eSEric Fiselier n[1] = char(0x93);
585a83710eSEric Fiselier r = c.in(m, n, n+2, np, &w, &w+1, wp);
595a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
605a83710eSEric Fiselier assert(wp == &w+1);
615a83710eSEric Fiselier assert(np == n+2);
625a83710eSEric Fiselier assert(w == 0x453);
635a83710eSEric Fiselier
645a83710eSEric Fiselier w = 0x56;
655a83710eSEric Fiselier n[0] = char(0x56);
665a83710eSEric Fiselier r = c.in(m, n, n+1, np, &w, &w+1, wp);
675a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
685a83710eSEric Fiselier assert(wp == &w+1);
695a83710eSEric Fiselier assert(np == n+1);
705a83710eSEric Fiselier assert(w == 0x56);
715a83710eSEric Fiselier }
725a83710eSEric Fiselier {
73b2684a52SSaleem Abdulrasool typedef std::codecvt_utf8<char32_t, 0x1000> C;
745a83710eSEric Fiselier C c;
75b2684a52SSaleem Abdulrasool char32_t w = 0;
765a83710eSEric Fiselier char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
77b2684a52SSaleem Abdulrasool char32_t* wp = nullptr;
785a83710eSEric Fiselier std::mbstate_t m;
795a83710eSEric Fiselier const char* np = nullptr;
805a83710eSEric Fiselier std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
815a83710eSEric Fiselier assert(r == std::codecvt_base::error);
825a83710eSEric Fiselier assert(wp == &w);
835a83710eSEric Fiselier assert(np == n);
845a83710eSEric Fiselier assert(w == 0);
855a83710eSEric Fiselier
865a83710eSEric Fiselier n[0] = char(0xE1);
875a83710eSEric Fiselier n[1] = char(0x80);
885a83710eSEric Fiselier n[2] = char(0x85);
895a83710eSEric Fiselier r = c.in(m, n, n+3, np, &w, &w+1, wp);
905a83710eSEric Fiselier assert(r == std::codecvt_base::error);
915a83710eSEric Fiselier assert(wp == &w);
925a83710eSEric Fiselier assert(np == n);
935a83710eSEric Fiselier assert(w == 0);
945a83710eSEric Fiselier
955a83710eSEric Fiselier n[0] = char(0xD1);
965a83710eSEric Fiselier n[1] = char(0x93);
975a83710eSEric Fiselier r = c.in(m, n, n+2, np, &w, &w+1, wp);
985a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
995a83710eSEric Fiselier assert(wp == &w+1);
1005a83710eSEric Fiselier assert(np == n+2);
1015a83710eSEric Fiselier assert(w == 0x453);
1025a83710eSEric Fiselier
1035a83710eSEric Fiselier w = 0x56;
1045a83710eSEric Fiselier n[0] = char(0x56);
1055a83710eSEric Fiselier r = c.in(m, n, n+1, np, &w, &w+1, wp);
1065a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
1075a83710eSEric Fiselier assert(wp == &w+1);
1085a83710eSEric Fiselier assert(np == n+1);
1095a83710eSEric Fiselier assert(w == 0x56);
1105a83710eSEric Fiselier }
1115a83710eSEric Fiselier {
112b2684a52SSaleem Abdulrasool typedef std::codecvt_utf8<char32_t, 0xFFFFFFFF, std::consume_header> C;
1135a83710eSEric Fiselier C c;
114b2684a52SSaleem Abdulrasool char32_t w = 0;
1155a83710eSEric Fiselier char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
116b2684a52SSaleem Abdulrasool char32_t* wp = nullptr;
1175a83710eSEric Fiselier std::mbstate_t m;
1185a83710eSEric Fiselier const char* np = nullptr;
1195a83710eSEric Fiselier std::codecvt_base::result r = c.in(m, n, n+7, np, &w, &w+1, wp);
1205a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
1215a83710eSEric Fiselier assert(wp == &w+1);
1225a83710eSEric Fiselier assert(np == n+7);
1235a83710eSEric Fiselier assert(w == 0x40003);
1245a83710eSEric Fiselier
1255a83710eSEric Fiselier n[0] = char(0xE1);
1265a83710eSEric Fiselier n[1] = char(0x80);
1275a83710eSEric Fiselier n[2] = char(0x85);
1285a83710eSEric Fiselier r = c.in(m, n, n+3, np, &w, &w+1, wp);
1295a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
1305a83710eSEric Fiselier assert(wp == &w+1);
1315a83710eSEric Fiselier assert(np == n+3);
1325a83710eSEric Fiselier assert(w == 0x1005);
1335a83710eSEric Fiselier
1345a83710eSEric Fiselier n[0] = char(0xEF);
1355a83710eSEric Fiselier n[1] = char(0xBB);
1365a83710eSEric Fiselier n[2] = char(0xBF);
1375a83710eSEric Fiselier n[3] = char(0xD1);
1385a83710eSEric Fiselier n[4] = char(0x93);
1395a83710eSEric Fiselier r = c.in(m, n, n+5, np, &w, &w+1, wp);
1405a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
1415a83710eSEric Fiselier assert(wp == &w+1);
1425a83710eSEric Fiselier assert(np == n+5);
1435a83710eSEric Fiselier assert(w == 0x453);
1445a83710eSEric Fiselier
1455a83710eSEric Fiselier w = 0x56;
1465a83710eSEric Fiselier n[0] = char(0x56);
1475a83710eSEric Fiselier r = c.in(m, n, n+1, np, &w, &w+1, wp);
1485a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
1495a83710eSEric Fiselier assert(wp == &w+1);
1505a83710eSEric Fiselier assert(np == n+1);
1515a83710eSEric Fiselier assert(w == 0x56);
1525a83710eSEric Fiselier }
1535a83710eSEric Fiselier {
1545a83710eSEric Fiselier typedef std::codecvt_utf8<char32_t> C;
1555a83710eSEric Fiselier C c;
1565a83710eSEric Fiselier char32_t w = 0;
1575a83710eSEric Fiselier char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
1585a83710eSEric Fiselier char32_t* wp = nullptr;
1595a83710eSEric Fiselier std::mbstate_t m;
1605a83710eSEric Fiselier const char* np = nullptr;
1615a83710eSEric Fiselier std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
1625a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
1635a83710eSEric Fiselier assert(wp == &w+1);
1645a83710eSEric Fiselier assert(np == n+4);
1655a83710eSEric Fiselier assert(w == 0x40003);
1665a83710eSEric Fiselier
1675a83710eSEric Fiselier n[0] = char(0xE1);
1685a83710eSEric Fiselier n[1] = char(0x80);
1695a83710eSEric Fiselier n[2] = char(0x85);
1705a83710eSEric Fiselier r = c.in(m, n, n+3, np, &w, &w+1, wp);
1715a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
1725a83710eSEric Fiselier assert(wp == &w+1);
1735a83710eSEric Fiselier assert(np == n+3);
1745a83710eSEric Fiselier assert(w == 0x1005);
1755a83710eSEric Fiselier
1765a83710eSEric Fiselier n[0] = char(0xD1);
1775a83710eSEric Fiselier n[1] = char(0x93);
1785a83710eSEric Fiselier r = c.in(m, n, n+2, np, &w, &w+1, wp);
1795a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
1805a83710eSEric Fiselier assert(wp == &w+1);
1815a83710eSEric Fiselier assert(np == n+2);
1825a83710eSEric Fiselier assert(w == 0x453);
1835a83710eSEric Fiselier
1845a83710eSEric Fiselier w = 0x56;
1855a83710eSEric Fiselier n[0] = char(0x56);
1865a83710eSEric Fiselier r = c.in(m, n, n+1, np, &w, &w+1, wp);
1875a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
1885a83710eSEric Fiselier assert(wp == &w+1);
1895a83710eSEric Fiselier assert(np == n+1);
1905a83710eSEric Fiselier assert(w == 0x56);
1915a83710eSEric Fiselier }
1925a83710eSEric Fiselier {
1935a83710eSEric Fiselier typedef std::codecvt_utf8<char32_t, 0x1000> C;
1945a83710eSEric Fiselier C c;
1955a83710eSEric Fiselier char32_t w = 0;
1965a83710eSEric Fiselier char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
1975a83710eSEric Fiselier char32_t* wp = nullptr;
1985a83710eSEric Fiselier std::mbstate_t m;
1995a83710eSEric Fiselier const char* np = nullptr;
2005a83710eSEric Fiselier std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
2015a83710eSEric Fiselier assert(r == std::codecvt_base::error);
2025a83710eSEric Fiselier assert(wp == &w);
2035a83710eSEric Fiselier assert(np == n);
2045a83710eSEric Fiselier assert(w == 0);
2055a83710eSEric Fiselier
2065a83710eSEric Fiselier n[0] = char(0xE1);
2075a83710eSEric Fiselier n[1] = char(0x80);
2085a83710eSEric Fiselier n[2] = char(0x85);
2095a83710eSEric Fiselier r = c.in(m, n, n+3, np, &w, &w+1, wp);
2105a83710eSEric Fiselier assert(r == std::codecvt_base::error);
2115a83710eSEric Fiselier assert(wp == &w);
2125a83710eSEric Fiselier assert(np == n);
2135a83710eSEric Fiselier assert(w == 0);
2145a83710eSEric Fiselier
2155a83710eSEric Fiselier n[0] = char(0xD1);
2165a83710eSEric Fiselier n[1] = char(0x93);
2175a83710eSEric Fiselier r = c.in(m, n, n+2, np, &w, &w+1, wp);
2185a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
2195a83710eSEric Fiselier assert(wp == &w+1);
2205a83710eSEric Fiselier assert(np == n+2);
2215a83710eSEric Fiselier assert(w == 0x453);
2225a83710eSEric Fiselier
2235a83710eSEric Fiselier w = 0x56;
2245a83710eSEric Fiselier n[0] = char(0x56);
2255a83710eSEric Fiselier r = c.in(m, n, n+1, np, &w, &w+1, wp);
2265a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
2275a83710eSEric Fiselier assert(wp == &w+1);
2285a83710eSEric Fiselier assert(np == n+1);
2295a83710eSEric Fiselier assert(w == 0x56);
2305a83710eSEric Fiselier }
2315a83710eSEric Fiselier {
2325a83710eSEric Fiselier typedef std::codecvt_utf8<char32_t, 0xFFFFFFFF, std::consume_header> C;
2335a83710eSEric Fiselier C c;
2345a83710eSEric Fiselier char32_t w = 0;
2355a83710eSEric Fiselier char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
2365a83710eSEric Fiselier char32_t* wp = nullptr;
2375a83710eSEric Fiselier std::mbstate_t m;
2385a83710eSEric Fiselier const char* np = nullptr;
2395a83710eSEric Fiselier std::codecvt_base::result r = c.in(m, n, n+7, np, &w, &w+1, wp);
2405a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
2415a83710eSEric Fiselier assert(wp == &w+1);
2425a83710eSEric Fiselier assert(np == n+7);
2435a83710eSEric Fiselier assert(w == 0x40003);
2445a83710eSEric Fiselier
2455a83710eSEric Fiselier n[0] = char(0xE1);
2465a83710eSEric Fiselier n[1] = char(0x80);
2475a83710eSEric Fiselier n[2] = char(0x85);
2485a83710eSEric Fiselier r = c.in(m, n, n+3, np, &w, &w+1, wp);
2495a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
2505a83710eSEric Fiselier assert(wp == &w+1);
2515a83710eSEric Fiselier assert(np == n+3);
2525a83710eSEric Fiselier assert(w == 0x1005);
2535a83710eSEric Fiselier
2545a83710eSEric Fiselier n[0] = char(0xEF);
2555a83710eSEric Fiselier n[1] = char(0xBB);
2565a83710eSEric Fiselier n[2] = char(0xBF);
2575a83710eSEric Fiselier n[3] = char(0xD1);
2585a83710eSEric Fiselier n[4] = char(0x93);
2595a83710eSEric Fiselier r = c.in(m, n, n+5, np, &w, &w+1, wp);
2605a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
2615a83710eSEric Fiselier assert(wp == &w+1);
2625a83710eSEric Fiselier assert(np == n+5);
2635a83710eSEric Fiselier assert(w == 0x453);
2645a83710eSEric Fiselier
2655a83710eSEric Fiselier w = 0x56;
2665a83710eSEric Fiselier n[0] = char(0x56);
2675a83710eSEric Fiselier r = c.in(m, n, n+1, np, &w, &w+1, wp);
2685a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
2695a83710eSEric Fiselier assert(wp == &w+1);
2705a83710eSEric Fiselier assert(np == n+1);
2715a83710eSEric Fiselier assert(w == 0x56);
2725a83710eSEric Fiselier }
2735a83710eSEric Fiselier {
2745a83710eSEric Fiselier typedef std::codecvt_utf8<char16_t> C;
2755a83710eSEric Fiselier C c;
2765a83710eSEric Fiselier char16_t w = 0;
2775a83710eSEric Fiselier char n[3] = {char(0xE1), char(0x80), char(0x85)};
2785a83710eSEric Fiselier char16_t* wp = nullptr;
2795a83710eSEric Fiselier std::mbstate_t m;
2805a83710eSEric Fiselier const char* np = nullptr;
2815a83710eSEric Fiselier std::codecvt_base::result r = c.in(m, n, n+3, np, &w, &w+1, wp);
2825a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
2835a83710eSEric Fiselier assert(wp == &w+1);
2845a83710eSEric Fiselier assert(np == n+3);
2855a83710eSEric Fiselier assert(w == 0x1005);
2865a83710eSEric Fiselier
2875a83710eSEric Fiselier n[0] = char(0xD1);
2885a83710eSEric Fiselier n[1] = char(0x93);
2895a83710eSEric Fiselier r = c.in(m, n, n+2, np, &w, &w+1, wp);
2905a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
2915a83710eSEric Fiselier assert(wp == &w+1);
2925a83710eSEric Fiselier assert(np == n+2);
2935a83710eSEric Fiselier assert(w == 0x453);
2945a83710eSEric Fiselier
2955a83710eSEric Fiselier w = 0x56;
2965a83710eSEric Fiselier n[0] = char(0x56);
2975a83710eSEric Fiselier r = c.in(m, n, n+1, np, &w, &w+1, wp);
2985a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
2995a83710eSEric Fiselier assert(wp == &w+1);
3005a83710eSEric Fiselier assert(np == n+1);
3015a83710eSEric Fiselier assert(w == 0x56);
3025a83710eSEric Fiselier }
3035a83710eSEric Fiselier {
3045a83710eSEric Fiselier typedef std::codecvt_utf8<char16_t, 0x1000> C;
3055a83710eSEric Fiselier C c;
3065a83710eSEric Fiselier char16_t w = 0;
3075a83710eSEric Fiselier char n[3] = {char(0xE1), char(0x80), char(0x85)};
3085a83710eSEric Fiselier char16_t* wp = nullptr;
3095a83710eSEric Fiselier std::mbstate_t m;
3105a83710eSEric Fiselier const char* np = nullptr;
3115a83710eSEric Fiselier std::codecvt_base::result r = c.in(m, n, n+3, np, &w, &w+1, wp);
3125a83710eSEric Fiselier assert(r == std::codecvt_base::error);
3135a83710eSEric Fiselier assert(wp == &w);
3145a83710eSEric Fiselier assert(np == n);
3155a83710eSEric Fiselier assert(w == 0);
3165a83710eSEric Fiselier
3175a83710eSEric Fiselier n[0] = char(0xD1);
3185a83710eSEric Fiselier n[1] = char(0x93);
3195a83710eSEric Fiselier r = c.in(m, n, n+2, np, &w, &w+1, wp);
3205a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
3215a83710eSEric Fiselier assert(wp == &w+1);
3225a83710eSEric Fiselier assert(np == n+2);
3235a83710eSEric Fiselier assert(w == 0x453);
3245a83710eSEric Fiselier
3255a83710eSEric Fiselier w = 0x56;
3265a83710eSEric Fiselier n[0] = char(0x56);
3275a83710eSEric Fiselier r = c.in(m, n, n+1, np, &w, &w+1, wp);
3285a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
3295a83710eSEric Fiselier assert(wp == &w+1);
3305a83710eSEric Fiselier assert(np == n+1);
3315a83710eSEric Fiselier assert(w == 0x56);
3325a83710eSEric Fiselier }
3335a83710eSEric Fiselier {
3345a83710eSEric Fiselier typedef std::codecvt_utf8<char16_t, 0xFFFFFFFF, std::consume_header> C;
3355a83710eSEric Fiselier C c;
3365a83710eSEric Fiselier char16_t w = 0;
3375a83710eSEric Fiselier char n[6] = {char(0xEF), char(0xBB), char(0xBF), char(0xE1), char(0x80), char(0x85)};
3385a83710eSEric Fiselier char16_t* wp = nullptr;
3395a83710eSEric Fiselier std::mbstate_t m;
3405a83710eSEric Fiselier const char* np = nullptr;
3415a83710eSEric Fiselier std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
3425a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
3435a83710eSEric Fiselier assert(wp == &w+1);
3445a83710eSEric Fiselier assert(np == n+6);
3455a83710eSEric Fiselier assert(w == 0x1005);
3465a83710eSEric Fiselier
3475a83710eSEric Fiselier n[0] = char(0xD1);
3485a83710eSEric Fiselier n[1] = char(0x93);
3495a83710eSEric Fiselier r = c.in(m, n, n+2, np, &w, &w+1, wp);
3505a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
3515a83710eSEric Fiselier assert(wp == &w+1);
3525a83710eSEric Fiselier assert(np == n+2);
3535a83710eSEric Fiselier assert(w == 0x453);
3545a83710eSEric Fiselier
3555a83710eSEric Fiselier w = 0x56;
3565a83710eSEric Fiselier n[0] = char(0x56);
3575a83710eSEric Fiselier r = c.in(m, n, n+1, np, &w, &w+1, wp);
3585a83710eSEric Fiselier assert(r == std::codecvt_base::ok);
3595a83710eSEric Fiselier assert(wp == &w+1);
3605a83710eSEric Fiselier assert(np == n+1);
3615a83710eSEric Fiselier assert(w == 0x56);
3625a83710eSEric Fiselier }
3632df59c50SJF Bastien
3642df59c50SJF Bastien return 0;
3655a83710eSEric Fiselier }
366