2 * Character Set Conversion Library 1.2
4 * (c) 1998--2004 Martin Mares <mj@ucw.cz>
5 * (c) 2007 Pavel Charvat <pchar@ucw.cz>
7 * This software may be freely distributed and used according to the terms
8 * of the GNU Lesser General Public License.
11 /* Generator of inlined conversion routines */
22 unsigned short *in_to_x = c->in_to_x;
26 unsigned short *x_to_out = c->x_to_out;
33 if (unlikely(c->state))
47 if (unlikely(s >= se))
49 #ifndef CONV_WRITE_STD
50 code = x_to_uni[in_to_x[*s++]];
55 if (unlikely(s >= se))
66 if ((s[0] & 0xc0) != 0x80)
69 code = (code << 6) | (*s++ & 0x3f);
73 if ((s[0] & 0xc0) != 0x80 || (s[1] & 0xc0) != 0x80)
76 code = (code << 6) | (*s++ & 0x3f);
77 code = (code << 6) | (*s++ & 0x3f);
83 if ((*s++ & 0xc0) != 0x80)
95 code = UNI_REPLACEMENT;
99 #ifdef CONV_READ_UTF16_BE
100 if (unlikely(s + 4 >= se))
102 c->state = UTF16_BE_READ;
105 s = utf16_be_get(s, &code);
108 #ifdef CONV_READ_UTF16_LE
109 if (unlikely(s + 4 >= se))
111 c->state = UTF16_LE_READ;
114 s = utf16_le_get(s, &code);
121 #ifdef CONV_WRITE_STD
122 #ifndef CONV_READ_STD
123 code = x_to_out[uni_to_x[code >> 8U][code & 0xff]];
125 code = x_to_out[in_to_x[*s++]];
129 if (unlikely(d >= de))
131 c->state = SINGLE_WRITE;
139 byte *k = string_table + code - 0x100;
141 if (unlikely(de - d < len))
143 c->state = SEQ_WRITE;
153 #ifdef CONV_WRITE_UTF8
160 else if (code < 0x800)
164 *d++ = 0xc0 | (code >> 6);
165 *d++ = 0x80 | (code & 0x3f);
171 *d++ = 0xe0 | (code >> 12);
172 *d++ = 0x80 | ((code >> 6) & 0x3f);
173 *d++ = 0x80 | (code & 0x3f);
177 #ifdef CONV_WRITE_UTF16_BE
178 if (unlikely(de - d < 2))
180 else if (code < 0xd800 || code - 0xe000 < 0x2000 ||
181 ((code -= 0x10000) >= 0x10000 && (code = UNI_REPLACEMENT)))
186 else if (likely(de - d < 4))
188 *d++ = 0xd8 | (code >> 18);
189 *d++ = (code >> 10) & 0xff;
190 *d++ = 0xdc | ((code >> 8) & 3);
196 c->state = UTF16_BE_WRITE;
201 #ifdef CONV_WRITE_UTF16_LE
202 if (unlikely(de - d < 2))
204 else if (code < 0xd800 || code - 0xe000 < 0x2000 ||
205 ((code -= 0x10000) >= 0x10000 && (code = UNI_REPLACEMENT)))
210 else if (likely(de - d < 4))
212 *d++ = (code >> 10) & 0xff;
213 *d++ = 0xd8 | (code >> 18);
215 *d++ = 0xdc | ((code >> 8) & 3);
220 c->state = UTF16_LE_WRITE;
231 return CONV_SOURCE_END;
233 #ifdef CONV_READ_UTF8
235 if (cc < 0xe0) { c->code = cc & 0x1f; c->remains = 1; }
236 else if (cc < 0xf0) { c->code = cc & 0x0f; c->remains = 2; }
240 if (cc < 0xf8) c->remains = 3;
241 else if (cc < 0xfc) c->remains = 4;
242 else if (cc < 0xfe) c->remains = 5;
245 c->state = UTF8_READ;
249 #ifdef CONV_WRITE_UTF8
251 c->state = UTF8_WRITE_START;
276 /*** Undefine all parameters ***/
279 #undef CONV_READ_UTF8
280 #undef CONV_READ_UTF16_BE
281 #undef CONV_READ_UTF16_LE
282 #undef CONV_WRITE_STD
283 #undef CONV_WRITE_UTF8
284 #undef CONV_WRITE_UTF16_BE
285 #undef CONV_WRITE_UTF16_LE