1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <codecvt>
10 
11 // template <class Elem, unsigned long Maxcode = 0x10ffff,
12 //           codecvt_mode Mode = (codecvt_mode)0>
13 // class codecvt_utf8_utf16
14 //     : public codecvt<Elem, char, mbstate_t>
15 // {
16 //     // unspecified
17 // };
18 
19 // int length(stateT& state, const externT* from, const externT* from_end,
20 //            size_t max) const;
21 
22 #include <codecvt>
23 #include <cassert>
24 
25 #include "test_macros.h"
26 
27 int main(int, char**)
28 {
29 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
30     {
31         typedef std::codecvt_utf8_utf16<wchar_t> C;
32         C c;
33         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
34         std::mbstate_t m;
35         int r = c.length(m, n, n+4, 2);
36         assert(r == 4);
37 
38         n[0] = char(0xE1);
39         n[1] = char(0x80);
40         n[2] = char(0x85);
41         r = c.length(m, n, n+3, 2);
42         assert(r == 3);
43 
44         n[0] = char(0xD1);
45         n[1] = char(0x93);
46         r = c.length(m, n, n+2, 2);
47         assert(r == 2);
48 
49         n[0] = char(0x56);
50         r = c.length(m, n, n+1, 2);
51         assert(r == 1);
52     }
53     {
54         typedef std::codecvt_utf8_utf16<wchar_t, 0x1000> C;
55         C c;
56         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
57         std::mbstate_t m;
58         int r = c.length(m, n, n+4, 2);
59         assert(r == 0);
60 
61         n[0] = char(0xE1);
62         n[1] = char(0x80);
63         n[2] = char(0x85);
64         r = c.length(m, n, n+3, 2);
65         assert(r == 0);
66 
67         n[0] = char(0xD1);
68         n[1] = char(0x93);
69         r = c.length(m, n, n+2, 2);
70         assert(r == 2);
71 
72         n[0] = char(0x56);
73         r = c.length(m, n, n+1, 2);
74         assert(r == 1);
75     }
76     {
77         typedef std::codecvt_utf8_utf16<wchar_t, 0x10ffff, std::consume_header> C;
78         C c;
79         char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
80         std::mbstate_t m;
81         int r = c.length(m, n, n+7, 2);
82         assert(r == 7);
83 
84         n[0] = char(0xE1);
85         n[1] = char(0x80);
86         n[2] = char(0x85);
87         r = c.length(m, n, n+3, 2);
88         assert(r == 3);
89 
90         n[0] = char(0xD1);
91         n[1] = char(0x93);
92         r = c.length(m, n, n+2, 2);
93         assert(r == 2);
94 
95         n[0] = char(0x56);
96         r = c.length(m, n, n+1, 2);
97         assert(r == 1);
98     }
99 #endif // TEST_HAS_NO_WIDE_CHARACTERS
100     {
101         typedef std::codecvt_utf8_utf16<char32_t> C;
102         C c;
103         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
104         std::mbstate_t m;
105         int r = c.length(m, n, n+4, 2);
106         assert(r == 4);
107 
108         n[0] = char(0xE1);
109         n[1] = char(0x80);
110         n[2] = char(0x85);
111         r = c.length(m, n, n+3, 2);
112         assert(r == 3);
113 
114         n[0] = char(0xD1);
115         n[1] = char(0x93);
116         r = c.length(m, n, n+2, 2);
117         assert(r == 2);
118 
119         n[0] = char(0x56);
120         r = c.length(m, n, n+1, 2);
121         assert(r == 1);
122     }
123     {
124         typedef std::codecvt_utf8_utf16<char32_t, 0x1000> C;
125         C c;
126         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
127         std::mbstate_t m;
128         int r = c.length(m, n, n+4, 2);
129         assert(r == 0);
130 
131         n[0] = char(0xE1);
132         n[1] = char(0x80);
133         n[2] = char(0x85);
134         r = c.length(m, n, n+3, 2);
135         assert(r == 0);
136 
137         n[0] = char(0xD1);
138         n[1] = char(0x93);
139         r = c.length(m, n, n+2, 2);
140         assert(r == 2);
141 
142         n[0] = char(0x56);
143         r = c.length(m, n, n+1, 2);
144         assert(r == 1);
145     }
146     {
147         typedef std::codecvt_utf8_utf16<char32_t, 0x10ffff, std::consume_header> C;
148         C c;
149         char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
150         std::mbstate_t m;
151         int r = c.length(m, n, n+7, 2);
152         assert(r == 7);
153 
154         n[0] = char(0xE1);
155         n[1] = char(0x80);
156         n[2] = char(0x85);
157         r = c.length(m, n, n+3, 2);
158         assert(r == 3);
159 
160         n[0] = char(0xD1);
161         n[1] = char(0x93);
162         r = c.length(m, n, n+2, 2);
163         assert(r == 2);
164 
165         n[0] = char(0x56);
166         r = c.length(m, n, n+1, 2);
167         assert(r == 1);
168     }
169     {
170         typedef std::codecvt_utf8_utf16<char16_t> C;
171         C c;
172         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
173         std::mbstate_t m;
174         int r = c.length(m, n, n+4, 2);
175         assert(r == 4);
176 
177         n[0] = char(0xE1);
178         n[1] = char(0x80);
179         n[2] = char(0x85);
180         r = c.length(m, n, n+3, 2);
181         assert(r == 3);
182 
183         n[0] = char(0xD1);
184         n[1] = char(0x93);
185         r = c.length(m, n, n+2, 2);
186         assert(r == 2);
187 
188         n[0] = char(0x56);
189         r = c.length(m, n, n+1, 2);
190         assert(r == 1);
191     }
192     {
193         typedef std::codecvt_utf8_utf16<char16_t, 0x1000> C;
194         C c;
195         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
196         std::mbstate_t m;
197         int r = c.length(m, n, n+4, 2);
198         assert(r == 0);
199 
200         n[0] = char(0xE1);
201         n[1] = char(0x80);
202         n[2] = char(0x85);
203         r = c.length(m, n, n+3, 2);
204         assert(r == 0);
205 
206         n[0] = char(0xD1);
207         n[1] = char(0x93);
208         r = c.length(m, n, n+2, 2);
209         assert(r == 2);
210 
211         n[0] = char(0x56);
212         r = c.length(m, n, n+1, 2);
213         assert(r == 1);
214     }
215     {
216         typedef std::codecvt_utf8_utf16<char16_t, 0x10ffff, std::consume_header> C;
217         C c;
218         char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
219         std::mbstate_t m;
220         int r = c.length(m, n, n+7, 2);
221         assert(r == 7);
222 
223         n[0] = char(0xE1);
224         n[1] = char(0x80);
225         n[2] = char(0x85);
226         r = c.length(m, n, n+3, 2);
227         assert(r == 3);
228 
229         n[0] = char(0xD1);
230         n[1] = char(0x93);
231         r = c.length(m, n, n+2, 2);
232         assert(r == 2);
233 
234         n[0] = char(0x56);
235         r = c.length(m, n, n+1, 2);
236         assert(r == 1);
237     }
238 
239   return 0;
240 }
241