34static size_t mb_utf32_to_wchar(
unsigned char **in,
size_t *in_len, uint32_t *
buf,
size_t bufsize,
unsigned int *
state);
35static size_t mb_utf32be_to_wchar(
unsigned char **in,
size_t *in_len, uint32_t *
buf,
size_t bufsize,
unsigned int *
state);
37static size_t mb_utf32le_to_wchar(
unsigned char **in,
size_t *in_len, uint32_t *
buf,
size_t bufsize,
unsigned int *
state);
40static const char *mbfl_encoding_utf32_aliases[] = {
"utf32",
NULL};
46 mbfl_encoding_utf32_aliases,
93 mbfl_filt_conv_utf32_wchar_flush,
113 mbfl_filt_conv_utf32_wchar_flush,
133 mbfl_filt_conv_utf32_wchar_flush,
147#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
162 filter->
cache = (filter->
cache << 8) | (c & 0xFF);
165 int n = ((
unsigned int)filter->
cache << 8) | (c & 0xFF);
168 if (
n == 0xFFFE0000) {
174 CK(emit_char_if_valid(
n, filter));
185 filter->
cache = (filter->
cache << 8) | (c & 0xFF);
188 int n = ((
unsigned int)filter->
cache << 8) | (c & 0xFF);
190 CK(emit_char_if_valid(
n, filter));
212 filter->
cache |= ((c & 0xFFU) << (8 * filter->
status));
215 int n = ((c & 0xFFU) << 24) | filter->
cache;
217 CK(emit_char_if_valid(
n, filter));
254static size_t mb_utf32_to_wchar(
unsigned char **in,
size_t *in_len, uint32_t *
buf,
size_t bufsize,
unsigned int *
state)
257 return mb_utf32be_to_wchar(in, in_len,
buf, bufsize,
NULL);
259 return mb_utf32le_to_wchar(in, in_len,
buf, bufsize,
NULL);
260 }
else if (*in_len >= 4) {
261 unsigned char *
p = *in;
266 uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4;
268 if (w == 0xFFFE0000) {
273 return mb_utf32le_to_wchar(in, in_len,
buf, bufsize,
NULL);
274 }
else if (w == 0xFEFF) {
282 return mb_utf32be_to_wchar(in, in_len,
buf, bufsize,
NULL);
285static size_t mb_utf32be_to_wchar(
unsigned char **in,
size_t *in_len, uint32_t *
buf,
size_t bufsize,
unsigned int *
state)
287 unsigned char *
p = *in, *e =
p + (*in_len & ~3);
288 uint32_t *
out =
buf, *limit =
buf + bufsize;
290 while (
p < e &&
out < limit) {
295 uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4;
304 if (
p == e && (*in_len & 0x3) &&
out < limit) {
310 *in_len -= (
p - *in);
317 unsigned char *
out, *limit;
324 out = mb_convert_buf_add4(
out, (w >> 24) & 0xFF, (w >> 16) & 0xFF, (w >> 8) & 0xFF, w & 0xFF);
334static size_t mb_utf32le_to_wchar(
unsigned char **in,
size_t *in_len, uint32_t *
buf,
size_t bufsize,
unsigned int *
state)
336 unsigned char *
p = *in, *e =
p + (*in_len & ~3);
337 uint32_t *
out =
buf, *limit =
buf + bufsize;
339 while (
p < e &&
out < limit) {
344 uint32_t w = (c4 << 24) | (c3 << 16) | (c2 << 8) | c1;
353 if (
p == e && (*in_len & 0x3) &&
out < limit) {
359 *in_len -= (
p - *in);
366 unsigned char *
out, *limit;
373 out = mb_convert_buf_add4(
out, w & 0xFF, (w >> 8) & 0xFF, (w >> 16) & 0xFF, (w >> 24) & 0xFF);
zend_ffi_ctype_name_buf buf
const struct mbfl_convert_vtbl vtbl_utf32_wchar
int mbfl_filt_conv_wchar_utf32be(int c, mbfl_convert_filter *filter)
const mbfl_encoding mbfl_encoding_utf32be
int mbfl_filt_conv_utf32le_wchar(int c, mbfl_convert_filter *filter)
const mbfl_encoding mbfl_encoding_utf32
const struct mbfl_convert_vtbl vtbl_wchar_utf32
int mbfl_filt_conv_utf32be_wchar(int c, mbfl_convert_filter *filter)
int mbfl_filt_conv_wchar_utf32le(int c, mbfl_convert_filter *filter)
const struct mbfl_convert_vtbl vtbl_utf32be_wchar
const struct mbfl_convert_vtbl vtbl_utf32le_wchar
const mbfl_encoding mbfl_encoding_utf32le
const struct mbfl_convert_vtbl vtbl_wchar_utf32le
const struct mbfl_convert_vtbl vtbl_wchar_utf32be
int mbfl_filt_conv_utf32_wchar(int c, mbfl_convert_filter *filter)
#define MBFL_ENCTYPE_WCS4
#define MBFL_WCSPLANE_UTF32MAX
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_utf32be
@ mbfl_no_encoding_utf32le
#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
int(* filter_function)(int c, mbfl_convert_filter *filter)
flush_function_t flush_function