33static size_t mb_ucs4_to_wchar(
unsigned char **in,
size_t *in_len, uint32_t *
buf,
size_t bufsize,
unsigned int *
state);
34static size_t mb_ucs4be_to_wchar(
unsigned char **in,
size_t *in_len, uint32_t *
buf,
size_t bufsize,
unsigned int *
state);
36static size_t mb_ucs4le_to_wchar(
unsigned char **in,
size_t *in_len, uint32_t *
buf,
size_t bufsize,
unsigned int *
state);
39static const char *mbfl_encoding_ucs4_aliases[] = {
"ISO-10646-UCS-4",
"UCS4",
NULL};
44static const char *mbfl_encoding_ucs4be_aliases[] = {
"byte4be",
NULL};
45static const char *mbfl_encoding_ucs4le_aliases[] = {
"byte4le",
NULL};
53 mbfl_encoding_ucs4_aliases,
68 mbfl_encoding_ucs4be_aliases,
83 mbfl_encoding_ucs4le_aliases,
100 mbfl_filt_conv_ucs4_wchar_flush,
120 mbfl_filt_conv_ucs4_wchar_flush,
140 mbfl_filt_conv_ucs4_wchar_flush,
155#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
164 endian = filter->
status & 0xff00;
165 switch (filter->
status & 0xff) {
170 n = (c & 0xffu) << 24;
179 n = (c & 0xff) << 16;
186 n = (c & 0xff) << 16;
195 n = (c & 0xffu) << 24;
201 if ((
n & 0xffff) == 0 && ((
n >> 16) & 0xffff) == 0xfffe) {
207 }
else if (
n != 0xfeff) {
223 if (filter->
status == 0) {
225 n = (c & 0xffu) << 24;
227 }
else if (filter->
status == 1) {
229 n = (c & 0xff) << 16;
231 }
else if (filter->
status == 2) {
237 n = (c & 0xff) | filter->
cache;
267 if (filter->
status == 0) {
271 }
else if (filter->
status == 1) {
275 }
else if (filter->
status == 2) {
277 n = (c & 0xff) << 16;
281 n = ((c & 0xffu) << 24) | filter->
cache;
306 if (filter->
status & 0xF) {
322static size_t mb_ucs4_to_wchar(
unsigned char **in,
size_t *in_len, uint32_t *
buf,
size_t bufsize,
unsigned int *
state)
325 return mb_ucs4be_to_wchar(in, in_len,
buf, bufsize,
NULL);
327 return mb_ucs4le_to_wchar(in, in_len,
buf, bufsize,
NULL);
328 }
else if (*in_len >= 4) {
329 unsigned char *
p = *in;
334 uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4;
336 if (w == 0xFFFE0000) {
341 return mb_ucs4le_to_wchar(in, in_len,
buf, bufsize,
NULL);
342 }
else if (w == 0xFEFF) {
350 return mb_ucs4be_to_wchar(in, in_len,
buf, bufsize,
NULL);
353static size_t mb_ucs4be_to_wchar(
unsigned char **in,
size_t *in_len, uint32_t *
buf,
size_t bufsize,
unsigned int *
state)
355 unsigned char *
p = *in, *e =
p + (*in_len & ~3);
356 uint32_t *
out =
buf, *limit =
buf + bufsize;
358 while (
p < e &&
out < limit) {
363 uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4;
367 if (
p == e && (*in_len & 0x3) &&
out < limit) {
373 *in_len -= (
p - *in);
380 unsigned char *
out, *limit;
387 out = mb_convert_buf_add4(
out, (w >> 24) & 0xFF, (w >> 16) & 0xFF, (w >> 8) & 0xFF, w & 0xFF);
397static size_t mb_ucs4le_to_wchar(
unsigned char **in,
size_t *in_len, uint32_t *
buf,
size_t bufsize,
unsigned int *
state)
399 unsigned char *
p = *in, *e =
p + (*in_len & ~3);
400 uint32_t *
out =
buf, *limit =
buf + bufsize;
402 while (
p < e &&
out < limit) {
407 uint32_t w = (c4 << 24) | (c3 << 16) | (c2 << 8) | c1;
411 if (
p == e && (*in_len & 0x3) &&
out < limit) {
417 *in_len -= (
p - *in);
424 unsigned char *
out, *limit;
431 out = mb_convert_buf_add4(
out, w & 0xFF, (w >> 8) & 0xFF, (w >> 16) & 0xFF, (w >> 24) & 0xFF);
zend_ffi_ctype_name_buf buf
int mbfl_filt_conv_ucs4le_wchar(int c, mbfl_convert_filter *filter)
const struct mbfl_convert_vtbl vtbl_wchar_ucs4be
int mbfl_filt_conv_wchar_ucs4le(int c, mbfl_convert_filter *filter)
const struct mbfl_convert_vtbl vtbl_ucs4_wchar
const struct mbfl_convert_vtbl vtbl_wchar_ucs4le
const struct mbfl_convert_vtbl vtbl_ucs4le_wchar
int mbfl_filt_conv_ucs4_wchar(int c, mbfl_convert_filter *filter)
const mbfl_encoding mbfl_encoding_ucs4be
int mbfl_filt_conv_wchar_ucs4be(int c, mbfl_convert_filter *filter)
const struct mbfl_convert_vtbl vtbl_wchar_ucs4
int mbfl_filt_conv_ucs4be_wchar(int c, mbfl_convert_filter *filter)
const mbfl_encoding mbfl_encoding_ucs4
const mbfl_encoding mbfl_encoding_ucs4le
const struct mbfl_convert_vtbl vtbl_ucs4be_wchar
#define MBFL_ENCTYPE_WCS4
int mbfl_filt_conv_common_flush(mbfl_convert_filter *filter)
int mbfl_filt_conv_illegal_output(int c, mbfl_convert_filter *filter)
void mbfl_filt_conv_common_ctor(mbfl_convert_filter *filter)
struct _mbfl_convert_filter mbfl_convert_filter
@ mbfl_no_encoding_ucs4le
@ mbfl_no_encoding_ucs4be
#define MB_CONVERT_BUF_STORE(buf, _out, _limit)
#define MB_CONVERT_BUF_ENSURE(buf, out, limit, needed)
#define MB_CONVERT_ERROR(buf, out, limit, bad_cp, conv_fn)
#define MB_CONVERT_BUF_LOAD(buf, _out, _limit)
unsigned const char * end
output_function_t output_function
flush_function_t flush_function