69 for (; (u = *string8); string8++) {
71 if ((u & 0x01 << 7) == 0) {
76 if ((u & 0x07 << 5) == 0xC0) {
81 if ((u & 0x0F << 4) == 0xE0) {
86 if ((u & 0x1F << 3) == 0xF0) {
93 if ((u & 0xC0) == 0x80) {
94 u32 = (u32 << 6) | (u & 0x3F);
103 if ((0 < u32 && u32 < 0xD800) || (0xE000 <= u32 && u32 < 0x10000)) {
106 else if (0x10000 <= u32 && u32 < 0x110000) {
118 char *out8end = out8 + size8;
121 if (!size8 || !in16 || !out8) {
126 for (; out8 < out8end && (u = *in16); in16++, out8++) {
130 else if (u < 0x0800) {
131 if (out8 + 1 >= out8end) {
134 *out8++ = (0x3 << 6) | (0x1F & (u >> 6));
135 *out8 = (0x1 << 7) | (0x3F & (u));
137 else if (u < 0xD800 || u >= 0xE000) {
138 if (out8 + 2 >= out8end) {
141 *out8++ = (0x7 << 5) | (0xF & (u >> 12));
142 *out8++ = (0x1 << 7) | (0x3F & (u >> 6));
143 *out8 = (0x1 << 7) | (0x3F & (u));
145 else if (u < 0xDC00) {
146 wchar_t u2 = *++in16;
151 if (u2 >= 0xDC00 && u2 < 0xE000) {
152 if (out8 + 3 >= out8end) {
155 unsigned int uc = 0x10000 + (u2 - 0xDC00) + ((u - 0xD800) << 10);
157 *out8++ = (0xF << 4) | (0x7 & (uc >> 18));
158 *out8++ = (0x1 << 7) | (0x3F & (uc >> 12));
159 *out8++ = (0x1 << 7) | (0x3F & (uc >> 6));
160 *out8 = (0x1 << 7) | (0x3F & (uc));
167 else if (u < 0xE000) {
173 *out8 = *out8end = 0;
186 unsigned int u32 = 0;
187 wchar_t *out16end = out16 + size16;
189 if (!size16 || !in8 || !out16) {
194 for (; out16 < out16end && (u = *in8); in8++) {
196 if ((u & 0x01 << 7) == 0) {
202 if ((u & 0x07 << 5) == 0xC0) {
207 if ((u & 0x0F << 4) == 0xE0) {
212 if ((u & 0x1F << 3) == 0xF0) {
220 if ((u & 0xC0) == 0x80) {
221 u32 = (u32 << 6) | (u & 0x3F);
231 if ((0 < u32 && u32 < 0xD800) || (0xE000 <= u32 && u32 < 0x10000)) {
235 else if (0x10000 <= u32 && u32 < 0x110000) {
236 if (out16 + 1 >= out16end) {
240 *out16 = 0xD800 + (u32 >> 10);
242 *out16 = 0xDC00 + (u32 & 0x3FF);
249 *out16 = *out16end = 0;