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 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 int main(int, char**) 26 { 27 { 28 typedef std::codecvt_utf8<wchar_t> C; 29 C c; 30 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; 31 std::mbstate_t m; 32 int r = c.length(m, n, n+4, 1); 33 assert(r == 4); 34 35 n[0] = char(0xE1); 36 n[1] = char(0x80); 37 n[2] = char(0x85); 38 r = c.length(m, n, n+3, 2); 39 assert(r == 3); 40 41 n[0] = char(0xD1); 42 n[1] = char(0x93); 43 r = c.length(m, n, n+2, 3); 44 assert(r == 2); 45 46 n[0] = char(0x56); 47 r = c.length(m, n, n+1, 3); 48 assert(r == 1); 49 } 50 { 51 typedef std::codecvt_utf8<wchar_t, 0x1000> C; 52 C c; 53 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; 54 std::mbstate_t m; 55 int r = c.length(m, n, n+4, 1); 56 assert(r == 0); 57 58 n[0] = char(0xE1); 59 n[1] = char(0x80); 60 n[2] = char(0x85); 61 r = c.length(m, n, n+3, 2); 62 assert(r == 0); 63 64 n[0] = char(0xD1); 65 n[1] = char(0x93); 66 r = c.length(m, n, n+2, 3); 67 assert(r == 2); 68 69 n[0] = char(0x56); 70 r = c.length(m, n, n+1, 3); 71 assert(r == 1); 72 } 73 { 74 typedef std::codecvt_utf8<wchar_t, 0xFFFFFFFF, std::consume_header> C; 75 C c; 76 char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)}; 77 std::mbstate_t m; 78 int r = c.length(m, n, n+7, 1); 79 assert(r == 7); 80 81 n[0] = char(0xE1); 82 n[1] = char(0x80); 83 n[2] = char(0x85); 84 r = c.length(m, n, n+3, 2); 85 assert(r == 3); 86 87 n[0] = char(0xEF); 88 n[1] = char(0xBB); 89 n[2] = char(0xBF); 90 n[3] = char(0xD1); 91 n[4] = char(0x93); 92 r = c.length(m, n, n+5, 3); 93 assert(r == 5); 94 95 n[0] = char(0x56); 96 r = c.length(m, n, n+1, 3); 97 assert(r == 1); 98 } 99 { 100 typedef std::codecvt_utf8<char32_t> C; 101 C c; 102 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; 103 std::mbstate_t m; 104 int r = c.length(m, n, n+4, 1); 105 assert(r == 4); 106 107 n[0] = char(0xE1); 108 n[1] = char(0x80); 109 n[2] = char(0x85); 110 r = c.length(m, n, n+3, 2); 111 assert(r == 3); 112 113 n[0] = char(0xD1); 114 n[1] = char(0x93); 115 r = c.length(m, n, n+2, 3); 116 assert(r == 2); 117 118 n[0] = char(0x56); 119 r = c.length(m, n, n+1, 3); 120 assert(r == 1); 121 } 122 { 123 typedef std::codecvt_utf8<char32_t, 0x1000> C; 124 C c; 125 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; 126 std::mbstate_t m; 127 int r = c.length(m, n, n+4, 1); 128 assert(r == 0); 129 130 n[0] = char(0xE1); 131 n[1] = char(0x80); 132 n[2] = char(0x85); 133 r = c.length(m, n, n+3, 2); 134 assert(r == 0); 135 136 n[0] = char(0xD1); 137 n[1] = char(0x93); 138 r = c.length(m, n, n+2, 3); 139 assert(r == 2); 140 141 n[0] = char(0x56); 142 r = c.length(m, n, n+1, 3); 143 assert(r == 1); 144 } 145 { 146 typedef std::codecvt_utf8<char32_t, 0xFFFFFFFF, std::consume_header> C; 147 C c; 148 char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)}; 149 std::mbstate_t m; 150 int r = c.length(m, n, n+7, 1); 151 assert(r == 7); 152 153 n[0] = char(0xE1); 154 n[1] = char(0x80); 155 n[2] = char(0x85); 156 r = c.length(m, n, n+3, 2); 157 assert(r == 3); 158 159 n[0] = char(0xEF); 160 n[1] = char(0xBB); 161 n[2] = char(0xBF); 162 n[3] = char(0xD1); 163 n[4] = char(0x93); 164 r = c.length(m, n, n+5, 3); 165 assert(r == 5); 166 167 n[0] = char(0x56); 168 r = c.length(m, n, n+1, 3); 169 assert(r == 1); 170 } 171 { 172 typedef std::codecvt_utf8<char16_t> C; 173 C c; 174 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; 175 std::mbstate_t m; 176 int r = c.length(m, n, n+4, 1); 177 assert(r == 0); 178 179 n[0] = char(0xE1); 180 n[1] = char(0x80); 181 n[2] = char(0x85); 182 r = c.length(m, n, n+3, 2); 183 assert(r == 3); 184 185 n[0] = char(0xD1); 186 n[1] = char(0x93); 187 r = c.length(m, n, n+2, 3); 188 assert(r == 2); 189 190 n[0] = char(0x56); 191 r = c.length(m, n, n+1, 3); 192 assert(r == 1); 193 } 194 { 195 typedef std::codecvt_utf8<char16_t, 0x1000> C; 196 C c; 197 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; 198 std::mbstate_t m; 199 int r = c.length(m, n, n+4, 1); 200 assert(r == 0); 201 202 n[0] = char(0xE1); 203 n[1] = char(0x80); 204 n[2] = char(0x85); 205 r = c.length(m, n, n+3, 2); 206 assert(r == 0); 207 208 n[0] = char(0xD1); 209 n[1] = char(0x93); 210 r = c.length(m, n, n+2, 3); 211 assert(r == 2); 212 213 n[0] = char(0x56); 214 r = c.length(m, n, n+1, 3); 215 assert(r == 1); 216 } 217 { 218 typedef std::codecvt_utf8<char16_t, 0xFFFFFFFF, std::consume_header> C; 219 C c; 220 char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)}; 221 std::mbstate_t m; 222 int r = c.length(m, n, n+7, 1); 223 assert(r == 3); 224 225 n[0] = char(0xE1); 226 n[1] = char(0x80); 227 n[2] = char(0x85); 228 r = c.length(m, n, n+3, 2); 229 assert(r == 3); 230 231 n[0] = char(0xEF); 232 n[1] = char(0xBB); 233 n[2] = char(0xBF); 234 n[3] = char(0xD1); 235 n[4] = char(0x93); 236 r = c.length(m, n, n+5, 3); 237 assert(r == 5); 238 239 n[0] = char(0x56); 240 r = c.length(m, n, n+1, 3); 241 assert(r == 1); 242 } 243 244 return 0; 245 } 246