38#ifdef HAVE_GLIBC_ICONV
39#include <gnu/libc-version.h>
46#if defined(__NetBSD__)
49#define ICONV_CONST const
59#define PHP_ICONV_IMPL_VALUE PHP_ICONV_IMPL
60#elif defined(HAVE_LIBICONV)
61#define PHP_ICONV_IMPL_VALUE "libiconv"
63#define PHP_ICONV_IMPL_VALUE "unknown"
66static char *get_iconv_version(
void) {
67 char *version =
"unknown";
71 snprintf(
buf,
sizeof(
buf),
"%d.%d", _libiconv_version >> 8, _libiconv_version & 0xff);
73#elif defined(HAVE_GLIBC_ICONV)
74 version = (
char *) gnu_get_libc_version();
80#define PHP_ICONV_MIME_DECODE_STRICT (1<<0)
81#define PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR (1<<1)
85#define _php_iconv_memequal(a, b, c) \
86 (memcmp(a, b, c) == 0)
110#ifdef COMPILE_DL_ICONV
120#if defined(COMPILE_DL_ICONV) && defined(ZTS)
123 iconv_globals->input_encoding =
NULL;
124 iconv_globals->output_encoding =
NULL;
125 iconv_globals->internal_encoding =
NULL;
129#if defined(HAVE_LIBICONV) && defined(ICONV_ALIASED_LIBICONV)
130#define iconv libiconv
134typedef enum _php_iconv_enc_scheme_t {
135 PHP_ICONV_ENC_SCHEME_BASE64,
136 PHP_ICONV_ENC_SCHEME_QPRINT
137} php_iconv_enc_scheme_t;
141static php_iconv_err_t _php_iconv_appendl(
smart_str *d,
const char *
s,
size_t l, iconv_t cd);
142static php_iconv_err_t _php_iconv_appendc(
smart_str *d,
const char c, iconv_t cd);
144static void _php_iconv_show_error(php_iconv_err_t
err,
const char *out_charset,
const char *in_charset);
146static php_iconv_err_t _php_iconv_strlen(
size_t *pretval,
const char *str,
size_t nbytes,
const char *enc);
150static php_iconv_err_t _php_iconv_mime_encode(
smart_str *pretval,
const char *fname,
size_t fname_nbytes,
const char *fval,
size_t fval_nbytes,
size_t max_line_len,
const char *lfchars, php_iconv_enc_scheme_t enc_scheme,
const char *out_charset,
const char *enc);
152static php_iconv_err_t _php_iconv_mime_decode(
smart_str *pretval,
const char *str,
size_t str_nbytes,
const char *enc,
const char **next_pos,
int mode);
154static php_iconv_err_t php_iconv_stream_filter_register_factory(
void);
155static php_iconv_err_t php_iconv_stream_filter_unregister_factory(
void);
157static zend_result php_iconv_output_conflict(
const char *handler_name,
size_t handler_name_len);
163static const char _generic_superset_name[] = ICONV_UCS4_ENCODING;
164#define GENERIC_SUPERSET_NAME _generic_superset_name
165#define GENERIC_SUPERSET_NBYTES 4
171 if (
ZSTR_LEN(new_value) >= ICONV_CSNMAXLEN) {
177 OnUpdateString(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
184 if (
ZSTR_LEN(new_value) >= ICONV_CSNMAXLEN) {
190 OnUpdateString(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
197 if (
ZSTR_LEN(new_value) >= ICONV_CSNMAXLEN) {
203 OnUpdateString(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
221 if (php_iconv_stream_filter_register_factory() != PHP_ICONV_ERR_SUCCESS) {
225 register_iconv_symbols(module_number);
237 php_iconv_stream_filter_unregister_factory();
246 zval *iconv_impl, *iconv_ver;
261static const char *get_internal_encoding(
void) {
268static const char *get_input_encoding(
void) {
269 if (ICONVG(input_encoding) && ICONVG(input_encoding)[0]) {
270 return ICONVG(input_encoding);
275static const char *get_output_encoding(
void) {
276 if (ICONVG(output_encoding) && ICONVG(output_encoding)[0]) {
277 return ICONVG(output_encoding);
283static zend_result php_iconv_output_conflict(
const char *handler_name,
size_t handler_name_len)
294static php_output_handler *php_iconv_output_handler_init(
const char *handler_name,
size_t handler_name_len,
size_t chunk_size,
int flags)
301 char *
s, *content_type, *mimetype =
NULL;
302 int output_status, mimetype_len = 0;
310 if (
SG(sapi_headers).mimetype && !
strncasecmp(
SG(sapi_headers).mimetype,
"text/", 5)) {
312 mimetype =
SG(sapi_headers).mimetype;
314 mimetype =
SG(sapi_headers).mimetype;
315 mimetype_len = (int)(
s -
SG(sapi_headers).mimetype);
317 }
else if (
SG(sapi_headers).send_default_content_type) {
323 char *
p =
strstr(get_output_encoding(),
"//");
326 len =
spprintf(&content_type, 0,
"Content-Type:%.*s; charset=%.*s", mimetype_len ? mimetype_len : (
int)
strlen(mimetype), mimetype, (
int) (
p - get_output_encoding()), get_output_encoding());
328 len =
spprintf(&content_type, 0,
"Content-Type:%.*s; charset=%s", mimetype_len ? mimetype_len : (
int)
strlen(mimetype), mimetype, get_output_encoding());
331 SG(sapi_headers).send_default_content_type = 0;
337 if (output_context->
in.
used) {
340 _php_iconv_show_error(php_iconv_string(output_context->
in.
data, output_context->
in.
used, &
out, get_output_encoding(), get_internal_encoding()), get_output_encoding(), get_internal_encoding());
344 zend_string_efree(
out);
355static php_iconv_err_t _php_iconv_appendl(
smart_str *d,
const char *
s,
size_t l, iconv_t cd)
357 const char *in_p =
s;
361 size_t buf_growth = 128;
364 while (in_left > 0) {
365 out_left = buf_growth;
366 smart_str_alloc(d, out_left, 0);
370 if (
iconv(cd, (ICONV_CONST
char **)&in_p, &in_left, (
char **) &out_p, &out_left) == (
size_t)-1) {
373 return PHP_ICONV_ERR_ILLEGAL_CHAR;
376 return PHP_ICONV_ERR_ILLEGAL_SEQ;
382 return PHP_ICONV_ERR_UNKNOWN;
385 ZSTR_LEN((d)->
s) += (buf_growth - out_left);
390 out_left = buf_growth;
391 smart_str_alloc(d, out_left, 0);
395 if (
iconv(cd,
NULL,
NULL, (
char **) &out_p, &out_left) == (
size_t)0) {
396 ZSTR_LEN((d)->
s) += (buf_growth - out_left);
399 if (
errno != E2BIG) {
400 return PHP_ICONV_ERR_UNKNOWN;
403 ZSTR_LEN((d)->
s) += (buf_growth - out_left);
407 return PHP_ICONV_ERR_SUCCESS;
412static php_iconv_err_t _php_iconv_appendc(
smart_str *d,
const char c, iconv_t cd)
414 return _php_iconv_appendl(d, &c, 1, cd);
419#ifdef ICONV_BROKEN_IGNORE
420static int _php_check_ignore(
const char *
charset)
426 if (clen >= 19 &&
strcmp(
"//IGNORE//TRANSLIT",
charset+clen-18) == 0) {
432#define _php_check_ignore(x) (0)
437PHP_ICONV_API php_iconv_err_t php_iconv_string(
const char *in_p,
size_t in_len,
zend_string **
out,
const char *out_charset,
const char *in_charset)
440 size_t in_left, out_size, out_left;
443 php_iconv_err_t
retval = PHP_ICONV_ERR_SUCCESS;
445 int ignore_ilseq = _php_check_ignore(out_charset);
449 cd = iconv_open(out_charset, in_charset);
451 if (cd == (iconv_t)(-1)) {
452 if (
errno == EINVAL) {
453 return PHP_ICONV_ERR_WRONG_CHARSET;
455 return PHP_ICONV_ERR_CONVERTER;
459 out_left = in_len + 32;
462 out_buf = zend_string_alloc(bsz, 0);
465 while (in_left > 0) {
466 result =
iconv(cd, (ICONV_CONST
char **) &in_p, &in_left, (
char **) &out_p, &out_left);
467 out_size = bsz - out_left;
468 if (
result == (
size_t)(-1)) {
469 if (ignore_ilseq &&
errno == EILSEQ) {
480 if (
errno == E2BIG && in_left > 0) {
484 out_buf = zend_string_extend(out_buf, bsz, 0);
487 out_left = bsz - out_size;
494 if (
result != (
size_t)(-1)) {
498 out_size = bsz - out_left;
500 if (
result != (
size_t)(-1)) {
504 if (
errno == E2BIG) {
506 out_buf = zend_string_extend(out_buf, bsz, 0);
509 out_left = bsz - out_size;
518 if (
result == (
size_t)(-1)) {
521 retval = PHP_ICONV_ERR_ILLEGAL_CHAR;
525 retval = PHP_ICONV_ERR_ILLEGAL_SEQ;
530 retval = PHP_ICONV_ERR_TOO_BIG;
535 zend_string_efree(out_buf);
536 return PHP_ICONV_ERR_UNKNOWN;
547static php_iconv_err_t _php_iconv_strlen(
size_t *pretval,
const char *str,
size_t nbytes,
const char *enc)
549 char buf[GENERIC_SUPERSET_NBYTES*2];
551 php_iconv_err_t
err = PHP_ICONV_ERR_SUCCESS;
564 *pretval = (size_t)-1;
566 cd = iconv_open(GENERIC_SUPERSET_NAME, enc);
568 if (cd == (iconv_t)(-1)) {
569 if (
errno == EINVAL) {
570 return PHP_ICONV_ERR_WRONG_CHARSET;
572 return PHP_ICONV_ERR_CONVERTER;
580 for (in_p = str, in_left = nbytes, cnt = 0; more;) {
582 out_left =
sizeof(
buf);
586 iconv(cd, more ? (ICONV_CONST
char **)&in_p :
NULL, more ? &in_left :
NULL, (
char **) &out_p, &out_left);
587 if (out_left ==
sizeof(
buf)) {
590 ZEND_ASSERT((
sizeof(
buf) - out_left) % GENERIC_SUPERSET_NBYTES == 0);
591 cnt += (
sizeof(
buf) - out_left) / GENERIC_SUPERSET_NBYTES;
597 err = PHP_ICONV_ERR_ILLEGAL_CHAR;
601 err = PHP_ICONV_ERR_ILLEGAL_SEQ;
610 err = PHP_ICONV_ERR_UNKNOWN;
622static php_iconv_err_t _php_iconv_substr(
smart_str *pretval,
625 char buf[GENERIC_SUPERSET_NBYTES];
627 php_iconv_err_t
err = PHP_ICONV_ERR_SUCCESS;
641 err = _php_iconv_strlen(&total_len, str, nbytes, enc);
642 if (
err != PHP_ICONV_ERR_SUCCESS) {
647 if ((
offset += total_len) < 0) {
650 }
else if ((
size_t)
offset > total_len) {
658 }
else if ((
size_t)
len > total_len) {
662 if ((
size_t)(
offset +
len) > total_len ) {
668 smart_str_appendl(pretval,
"", 0);
669 smart_str_0(pretval);
670 return PHP_ICONV_ERR_SUCCESS;
673 cd1 = iconv_open(GENERIC_SUPERSET_NAME, enc);
675 if (cd1 == (iconv_t)(-1)) {
676 if (
errno == EINVAL) {
677 return PHP_ICONV_ERR_WRONG_CHARSET;
679 return PHP_ICONV_ERR_CONVERTER;
685 more = nbytes > 0 &&
len > 0;
687 for (in_p = str, in_left = nbytes, cnt = 0; more; ++cnt) {
689 out_left =
sizeof(
buf);
691 more = in_left > 0 &&
len > 0;
693 iconv(cd1, more ? (ICONV_CONST
char **)&in_p :
NULL, more ? &in_left :
NULL, (
char **) &out_p, &out_left);
694 if (out_left ==
sizeof(
buf)) {
699 if (cd2 == (iconv_t)
NULL) {
700 cd2 = iconv_open(enc, GENERIC_SUPERSET_NAME);
702 if (cd2 == (iconv_t)(-1)) {
704 if (
errno == EINVAL) {
705 err = PHP_ICONV_ERR_WRONG_CHARSET;
707 err = PHP_ICONV_ERR_CONVERTER;
713 if (_php_iconv_appendl(pretval,
buf,
sizeof(
buf), cd2) != PHP_ICONV_ERR_SUCCESS) {
723 err = PHP_ICONV_ERR_ILLEGAL_CHAR;
727 err = PHP_ICONV_ERR_ILLEGAL_SEQ;
733 if (
err == PHP_ICONV_ERR_SUCCESS) {
734 if (cd2 != (iconv_t)
NULL) {
735 _php_iconv_appendl(pretval,
NULL, 0, cd2);
737 smart_str_0(pretval);
740 if (cd1 != (iconv_t)
NULL) {
744 if (cd2 != (iconv_t)
NULL) {
753static php_iconv_err_t _php_iconv_strpos(
size_t *pretval,
754 const char *haystk,
size_t haystk_nbytes,
755 const char *ndl,
size_t ndl_nbytes,
756 size_t offset,
const char *enc,
bool reverse)
758 char buf[GENERIC_SUPERSET_NBYTES];
760 php_iconv_err_t
err = PHP_ICONV_ERR_SUCCESS;
773 const char *ndl_buf_p;
780 *pretval = (size_t)-1;
782 err = php_iconv_string(ndl, ndl_nbytes, &ndl_buf, GENERIC_SUPERSET_NAME, enc);
784 if (
err != PHP_ICONV_ERR_SUCCESS) {
785 if (ndl_buf !=
NULL) {
786 zend_string_efree(ndl_buf);
791 cd = iconv_open(GENERIC_SUPERSET_NAME, enc);
793 if (cd == (iconv_t)(-1)) {
794 if (ndl_buf !=
NULL) {
795 zend_string_efree(ndl_buf);
797 if (
errno == EINVAL) {
798 return PHP_ICONV_ERR_WRONG_CHARSET;
800 return PHP_ICONV_ERR_CONVERTER;
806 match_ofs = (size_t)-1;
807 more = haystk_nbytes > 0;
809 for (in_p = haystk, in_left = haystk_nbytes, cnt = 0; more; ++cnt) {
811 out_left =
sizeof(
buf);
815 iconv_ret =
iconv(cd, more ? (ICONV_CONST
char **)&in_p :
NULL, more ? &in_left :
NULL, (
char **) &out_p, &out_left);
816 if (out_left ==
sizeof(
buf)) {
819 if (iconv_ret == (
size_t)-1) {
822 err = PHP_ICONV_ERR_ILLEGAL_CHAR;
826 err = PHP_ICONV_ERR_ILLEGAL_SEQ;
833 err = PHP_ICONV_ERR_UNKNOWN;
838 if (_php_iconv_memequal(
buf, ndl_buf_p,
sizeof(
buf))) {
839 if (match_ofs == (
size_t)-1) {
842 ndl_buf_p += GENERIC_SUPERSET_NBYTES;
843 ndl_buf_left -= GENERIC_SUPERSET_NBYTES;
844 if (ndl_buf_left == 0) {
845 *pretval = match_ofs;
860 j = GENERIC_SUPERSET_NBYTES;
861 lim = (size_t)(ndl_buf_p -
ZSTR_VAL(ndl_buf));
865 GENERIC_SUPERSET_NBYTES)) {
866 i += GENERIC_SUPERSET_NBYTES;
871 j += GENERIC_SUPERSET_NBYTES;
874 if (_php_iconv_memequal(
buf, &
ZSTR_VAL(ndl_buf)[i],
sizeof(
buf))) {
875 match_ofs += (lim - i) / GENERIC_SUPERSET_NBYTES;
876 i += GENERIC_SUPERSET_NBYTES;
878 ndl_buf_left =
ZSTR_LEN(ndl_buf) - i;
880 match_ofs = (size_t)-1;
889 zend_string_efree(ndl_buf);
894 if (
err == PHP_ICONV_ERR_SUCCESS &&
offset > cnt) {
895 return PHP_ICONV_ERR_OUT_BY_BOUNDS;
903static php_iconv_err_t _php_iconv_mime_encode(
smart_str *pretval,
const char *fname,
size_t fname_nbytes,
const char *fval,
size_t fval_nbytes,
size_t max_line_len,
const char *lfchars, php_iconv_enc_scheme_t enc_scheme,
const char *out_charset,
const char *enc)
905 php_iconv_err_t
err = PHP_ICONV_ERR_SUCCESS;
906 iconv_t cd = (iconv_t)(-1), cd_pl = (iconv_t)(-1);
908 size_t out_charset_len;
916 static const int qp_table[256] = {
917 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
918 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
919 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
920 1, 1, 1, 1, 1, 1, 1 ,1, 1, 1, 1, 1, 1, 3, 1, 3,
921 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
922 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
923 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
924 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
925 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
926 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
927 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
928 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
929 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
930 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
931 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
932 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
935 out_charset_len =
strlen(out_charset);
936 lfchars_len =
strlen(lfchars);
938 if ((fname_nbytes + 2) >= max_line_len
939 || (out_charset_len + 12) >= max_line_len) {
941 err = PHP_ICONV_ERR_TOO_BIG;
945 cd_pl = iconv_open(ICONV_ASCII_ENCODING, enc);
946 if (cd_pl == (iconv_t)(-1)) {
947 if (
errno == EINVAL) {
948 err = PHP_ICONV_ERR_WRONG_CHARSET;
950 err = PHP_ICONV_ERR_CONVERTER;
955 cd = iconv_open(out_charset, enc);
956 if (cd == (iconv_t)(-1)) {
957 if (
errno == EINVAL) {
958 err = PHP_ICONV_ERR_WRONG_CHARSET;
960 err = PHP_ICONV_ERR_CONVERTER;
967 char_cnt = max_line_len;
969 _php_iconv_appendl(pretval, fname, fname_nbytes, cd_pl);
970 char_cnt -= fname_nbytes;
971 smart_str_appendl(pretval,
": ",
sizeof(
": ") - 1);
975 in_left = fval_nbytes;
980 size_t encoded_word_min_len =
sizeof(
"=\?\?X\?\?=")-1 + out_charset_len + (enc_scheme == PHP_ICONV_ENC_SCHEME_BASE64 ? 4 : 3);
982 if (char_cnt < encoded_word_min_len + lfchars_len + 1) {
984 smart_str_appendl(pretval, lfchars, lfchars_len);
985 smart_str_appendc(pretval,
' ');
986 char_cnt = max_line_len - 1;
989 smart_str_appendl(pretval,
"=?",
sizeof(
"=?") - 1);
991 smart_str_appendl(pretval, out_charset, out_charset_len);
992 char_cnt -= out_charset_len;
993 smart_str_appendc(pretval,
'?');
996 switch (enc_scheme) {
997 case PHP_ICONV_ENC_SCHEME_BASE64: {
999 const char *ini_in_p;
1000 size_t out_reserved = 4;
1002 smart_str_appendc(pretval,
'B');
1004 smart_str_appendc(pretval,
'?');
1007 prev_in_left = ini_in_left = in_left;
1010 out_size = (char_cnt - 2) / 4 * 3;
1015 if (out_size <= out_reserved) {
1016 err = PHP_ICONV_ERR_TOO_BIG;
1020 out_left = out_size - out_reserved;
1022 if (
iconv(cd, (ICONV_CONST
char **)&in_p, &in_left, (
char **) &out_p, &out_left) == (
size_t)-1) {
1025 err = PHP_ICONV_ERR_ILLEGAL_CHAR;
1029 err = PHP_ICONV_ERR_ILLEGAL_SEQ;
1033 if (prev_in_left == in_left) {
1034 err = PHP_ICONV_ERR_TOO_BIG;
1040 err = PHP_ICONV_ERR_UNKNOWN;
1045 out_left += out_reserved;
1047 if (
iconv(cd,
NULL,
NULL, (
char **) &out_p, &out_left) == (
size_t)-1) {
1048 if (
errno != E2BIG) {
1049 err = PHP_ICONV_ERR_UNKNOWN;
1057 err = PHP_ICONV_ERR_UNKNOWN;
1062 in_left = ini_in_left;
1066 prev_in_left = in_left;
1068 encoded = php_base64_encode((
unsigned char *)
buf, (out_size - out_left));
1070 if (char_cnt <
ZSTR_LEN(encoded)) {
1072 err = PHP_ICONV_ERR_UNKNOWN;
1078 smart_str_appendl(pretval,
"?=",
sizeof(
"?=") - 1);
1085 case PHP_ICONV_ENC_SCHEME_QPRINT: {
1087 const char *ini_in_p;
1088 const unsigned char *
p;
1089 size_t nbytes_required;
1091 smart_str_appendc(pretval,
'Q');
1093 smart_str_appendc(pretval,
'?');
1096 prev_in_left = ini_in_left = in_left;
1099 for (out_size = (char_cnt - 2); out_size > 0;) {
1101 nbytes_required = 0;
1104 out_left = out_size;
1106 if (
iconv(cd, (ICONV_CONST
char **)&in_p, &in_left, (
char **) &out_p, &out_left) == (
size_t)-1) {
1109 err = PHP_ICONV_ERR_ILLEGAL_CHAR;
1113 err = PHP_ICONV_ERR_ILLEGAL_SEQ;
1117 if (prev_in_left == in_left) {
1118 err = PHP_ICONV_ERR_UNKNOWN;
1124 err = PHP_ICONV_ERR_UNKNOWN;
1128 if (
iconv(cd,
NULL,
NULL, (
char **) &out_p, &out_left) == (
size_t)-1) {
1129 if (
errno != E2BIG) {
1130 err = PHP_ICONV_ERR_UNKNOWN;
1135 for (
p = (
unsigned char *)
buf;
p < (
unsigned char *)out_p;
p++) {
1136 nbytes_required += qp_table[*
p];
1139 if (nbytes_required <= char_cnt - 2) {
1143 out_size -= ((nbytes_required - (char_cnt - 2)) + 2) / 3;
1144 in_left = ini_in_left;
1148 for (
p = (
unsigned char *)
buf;
p < (
unsigned char *)out_p;
p++) {
1149 if (qp_table[*
p] == 1) {
1150 smart_str_appendc(pretval, *(
char *)
p);
1153 static const char qp_digits[] =
"0123456789ABCDEF";
1154 smart_str_appendc(pretval,
'=');
1155 smart_str_appendc(pretval, qp_digits[(*
p >> 4) & 0x0f]);
1156 smart_str_appendc(pretval, qp_digits[(*
p & 0x0f)]);
1161 smart_str_appendl(pretval,
"?=",
sizeof(
"?=") - 1);
1165 err = PHP_ICONV_ERR_UNKNOWN;
1171 }
while (in_left > 0);
1173 smart_str_0(pretval);
1176 if (cd != (iconv_t)(-1)) {
1179 if (cd_pl != (iconv_t)(-1)) {
1182 if (encoded !=
NULL) {
1193static php_iconv_err_t _php_iconv_mime_decode(
smart_str *pretval,
const char *str,
size_t str_nbytes,
const char *enc,
const char **next_pos,
int mode)
1195 php_iconv_err_t
err = PHP_ICONV_ERR_SUCCESS;
1197 iconv_t cd = (iconv_t)(-1), cd_pl = (iconv_t)(-1);
1201 unsigned int scan_stat = 0;
1202 const char *csname =
NULL;
1204 const char *encoded_text =
NULL;
1205 size_t encoded_text_len = 0;
1206 const char *encoded_word =
NULL;
1207 const char *spaces =
NULL;
1209 php_iconv_enc_scheme_t enc_scheme = PHP_ICONV_ENC_SCHEME_BASE64;
1211 if (next_pos !=
NULL) {
1215 cd_pl = iconv_open(enc, ICONV_ASCII_ENCODING);
1217 if (cd_pl == (iconv_t)(-1)) {
1218 if (
errno == EINVAL) {
1219 err = PHP_ICONV_ERR_WRONG_CHARSET;
1221 err = PHP_ICONV_ERR_CONVERTER;
1227 for (str_left = str_nbytes; str_left > 0; str_left--, p1++) {
1230 switch (scan_stat) {
1246 case ' ':
case '\t':
1252 err = _php_iconv_appendc(pretval, *p1, cd_pl);
1253 if (
err != PHP_ICONV_ERR_SUCCESS) {
1254 if (
mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR) {
1255 err = PHP_ICONV_ERR_SUCCESS;
1260 encoded_word =
NULL;
1261 if ((
mode & PHP_ICONV_MIME_DECODE_STRICT)) {
1270 if (*p1 ==
'\r' || *p1 ==
'\n') {
1273 err = _php_iconv_appendl(pretval, encoded_word, (
size_t)((p1 + 1) - encoded_word), cd_pl);
1274 if (
err != PHP_ICONV_ERR_SUCCESS) {
1277 encoded_word =
NULL;
1278 if ((
mode & PHP_ICONV_MIME_DECODE_STRICT)) {
1299 case '\r':
case '\n':
1301 _php_iconv_appendc(pretval,
'=', cd_pl);
1302 _php_iconv_appendc(pretval,
'?', cd_pl);
1303 err = _php_iconv_appendl(pretval, csname, (
size_t)((p1 + 1) - csname), cd_pl);
1304 if (
err != PHP_ICONV_ERR_SUCCESS) {
1308 if ((
mode & PHP_ICONV_MIME_DECODE_STRICT)) {
1316 if (scan_stat != 2) {
1319 if (csname ==
NULL) {
1320 err = PHP_ICONV_ERR_MALFORMED;
1324 csname_len = (size_t)(p1 - csname);
1326 if (csname_len >
sizeof(tmpbuf) - 1) {
1327 if ((
mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
1328 err = _php_iconv_appendl(pretval, encoded_word, (
size_t)((p1 + 1) - encoded_word), cd_pl);
1329 if (
err != PHP_ICONV_ERR_SUCCESS) {
1332 encoded_word =
NULL;
1333 if ((
mode & PHP_ICONV_MIME_DECODE_STRICT)) {
1340 err = PHP_ICONV_ERR_MALFORMED;
1345 memcpy(tmpbuf, csname, csname_len);
1346 tmpbuf[csname_len] =
'\0';
1348 if (cd != (iconv_t)(-1)) {
1352 cd = iconv_open(enc, tmpbuf);
1354 if (cd == (iconv_t)(-1)) {
1355 if ((
mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
1368 while (qmarks > 0 && str_left > 1) {
1369 if (*(++p1) ==
'?') {
1379 if (*(p1 + 1) ==
'=') {
1386 err = _php_iconv_appendl(pretval, encoded_word, (
size_t)((p1 + 1) - encoded_word), cd_pl);
1387 if (
err != PHP_ICONV_ERR_SUCCESS) {
1397 if (
errno == EINVAL) {
1398 err = PHP_ICONV_ERR_WRONG_CHARSET;
1400 err = PHP_ICONV_ERR_CONVERTER;
1412 enc_scheme = PHP_ICONV_ENC_SCHEME_BASE64;
1418 enc_scheme = PHP_ICONV_ENC_SCHEME_QPRINT;
1423 if ((
mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
1424 err = _php_iconv_appendl(pretval, encoded_word, (
size_t)((p1 + 1) - encoded_word), cd_pl);
1425 if (
err != PHP_ICONV_ERR_SUCCESS) {
1428 encoded_word =
NULL;
1429 if ((
mode & PHP_ICONV_MIME_DECODE_STRICT)) {
1436 err = PHP_ICONV_ERR_MALFORMED;
1444 if ((
mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
1446 err = _php_iconv_appendl(pretval, encoded_word, (
size_t)((p1 + 1) - encoded_word), cd_pl);
1447 if (
err != PHP_ICONV_ERR_SUCCESS) {
1450 encoded_word =
NULL;
1451 if ((
mode & PHP_ICONV_MIME_DECODE_STRICT)) {
1458 err = PHP_ICONV_ERR_MALFORMED;
1462 encoded_text = p1 + 1;
1468 encoded_text_len = (size_t)(p1 - encoded_text);
1478 _php_iconv_appendc(pretval,
'\r', cd_pl);
1479 _php_iconv_appendc(pretval, *p1, cd_pl);
1486 if (*p1 !=
' ' && *p1 !=
'\t') {
1491 if (encoded_word ==
NULL) {
1492 _php_iconv_appendc(pretval,
' ', cd_pl);
1500 if ((
mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
1502 err = _php_iconv_appendl(pretval, encoded_word, (
size_t)((p1 + 1) - encoded_word), cd_pl);
1503 if (
err != PHP_ICONV_ERR_SUCCESS) {
1506 encoded_word =
NULL;
1507 if ((
mode & PHP_ICONV_MIME_DECODE_STRICT)) {
1514 err = PHP_ICONV_ERR_MALFORMED;
1519 if (str_left == 1) {
1539 if ((
mode & PHP_ICONV_MIME_DECODE_STRICT)) {
1541 err = _php_iconv_appendl(pretval, encoded_word, (
size_t)((p1 + 1) - encoded_word), cd_pl);
1542 if (
err != PHP_ICONV_ERR_SUCCESS) {
1551 case '\r':
case '\n':
case ' ':
case '\t': {
1554 switch (enc_scheme) {
1555 case PHP_ICONV_ENC_SCHEME_BASE64:
1556 decoded_text = php_base64_decode((
unsigned char*)encoded_text, encoded_text_len);
1559 case PHP_ICONV_ENC_SCHEME_QPRINT:
1563 decoded_text =
NULL;
1567 if (decoded_text ==
NULL) {
1568 if ((
mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
1570 err = _php_iconv_appendl(pretval, encoded_word, (
size_t)((p1 + 1) - encoded_word), cd_pl);
1571 if (
err != PHP_ICONV_ERR_SUCCESS) {
1574 encoded_word =
NULL;
1575 if ((
mode & PHP_ICONV_MIME_DECODE_STRICT)) {
1582 err = PHP_ICONV_ERR_UNKNOWN;
1588 if (
err == PHP_ICONV_ERR_SUCCESS) {
1589 err = _php_iconv_appendl(pretval,
NULL, 0, cd);
1593 if (
err != PHP_ICONV_ERR_SUCCESS) {
1594 if ((
mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
1596 err = _php_iconv_appendl(pretval, encoded_word, (
size_t)(p1 - encoded_word), cd_pl);
1597 encoded_word =
NULL;
1598 if (
err != PHP_ICONV_ERR_SUCCESS) {
1624 case ' ':
case '\t':
1630 _php_iconv_appendc(pretval, *p1, cd_pl);
1655 if (spaces !=
NULL && encoded_word ==
NULL) {
1656 _php_iconv_appendl(pretval, spaces, (
size_t)(p1 - spaces), cd_pl);
1663 case ' ':
case '\t':
1667 if (spaces !=
NULL) {
1668 _php_iconv_appendl(pretval, spaces, (
size_t)(p1 - spaces), cd_pl);
1671 _php_iconv_appendc(pretval, *p1, cd_pl);
1672 encoded_word =
NULL;
1673 if ((
mode & PHP_ICONV_MIME_DECODE_STRICT)) {
1692 case ' ':
case '\t':
1698 if (!(
mode & PHP_ICONV_MIME_DECODE_STRICT)) {
1706 _php_iconv_appendc(pretval, *p1, cd_pl);
1712 switch (scan_stat) {
1713 case 0:
case 8:
case 11:
case 12:
1716 if ((
mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
1717 if (scan_stat == 1) {
1718 _php_iconv_appendc(pretval,
'=', cd_pl);
1720 err = PHP_ICONV_ERR_SUCCESS;
1722 err = PHP_ICONV_ERR_MALFORMED;
1727 if (next_pos !=
NULL) {
1731 smart_str_0(pretval);
1733 if (cd != (iconv_t)(-1)) {
1736 if (cd_pl != (iconv_t)(-1)) {
1744static void _php_iconv_show_error(php_iconv_err_t
err,
const char *out_charset,
const char *in_charset)
1747 case PHP_ICONV_ERR_SUCCESS:
1750 case PHP_ICONV_ERR_CONVERTER:
1754 case PHP_ICONV_ERR_WRONG_CHARSET:
1756 in_charset, out_charset);
1759 case PHP_ICONV_ERR_ILLEGAL_CHAR:
1763 case PHP_ICONV_ERR_ILLEGAL_SEQ:
1767 case PHP_ICONV_ERR_TOO_BIG:
1772 case PHP_ICONV_ERR_MALFORMED:
1776 case PHP_ICONV_ERR_OUT_BY_BOUNDS:
1795 php_iconv_err_t
err;
1805 charset = get_internal_encoding();
1806 }
else if (charset_len >= ICONV_CSNMAXLEN) {
1812 _php_iconv_show_error(
err, GENERIC_SUPERSET_NAME,
charset);
1813 if (
err == PHP_ICONV_ERR_SUCCESS) {
1828 bool len_is_null = 1;
1830 php_iconv_err_t
err;
1835 &str, &
offset, &length, &len_is_null,
1841 charset = get_internal_encoding();
1842 }
else if (charset_len >= ICONV_CSNMAXLEN) {
1852 _php_iconv_show_error(
err, GENERIC_SUPERSET_NAME,
charset);
1866 size_t charset_len, haystk_len;
1871 php_iconv_err_t
err;
1882 charset = get_internal_encoding();
1883 }
else if (charset_len >= ICONV_CSNMAXLEN) {
1891 if (
err != PHP_ICONV_ERR_SUCCESS) {
1892 _php_iconv_show_error(
err, GENERIC_SUPERSET_NAME,
charset);
1907 err = _php_iconv_strpos(
1910 _php_iconv_show_error(
err, GENERIC_SUPERSET_NAME,
charset);
1912 if (
err == PHP_ICONV_ERR_SUCCESS &&
retval != (
size_t)-1) {
1928 php_iconv_err_t
err;
1943 charset = get_internal_encoding();
1944 }
else if (charset_len >= ICONV_CSNMAXLEN) {
1949 err = _php_iconv_strpos(
1952 _php_iconv_show_error(
err, GENERIC_SUPERSET_NAME,
charset);
1954 if (
err == PHP_ICONV_ERR_SUCCESS &&
retval != (
size_t)-1) {
1970 php_iconv_err_t
err;
1972 const char *in_charset = get_internal_encoding();
1973 const char *out_charset = in_charset;
1975 const char *lfchars =
"\r\n";
1976 php_iconv_enc_scheme_t scheme_id = PHP_ICONV_ENC_SCHEME_BASE64;
1979 &field_name, &field_value,
1992 scheme_id = PHP_ICONV_ENC_SCHEME_BASE64;
1996 scheme_id = PHP_ICONV_ENC_SCHEME_QPRINT;
2025 if ((pzval = zend_hash_str_find_deref(
Z_ARRVAL_P(pref),
"line-length",
sizeof(
"line-length") - 1)) !=
NULL) {
2026 line_len = zval_get_long(pzval);
2029 if ((pzval = zend_hash_str_find_deref(
Z_ARRVAL_P(pref),
"line-break-chars",
sizeof(
"line-break-chars") - 1)) !=
NULL) {
2043 ZSTR_VAL(field_value),
ZSTR_LEN(field_value), line_len, lfchars, scheme_id,
2044 out_charset, in_charset);
2045 _php_iconv_show_error(
err, out_charset, in_charset);
2047 if (
err == PHP_ICONV_ERR_SUCCESS) {
2070 php_iconv_err_t
err;
2079 charset = get_internal_encoding();
2080 }
else if (charset_len >= ICONV_CSNMAXLEN) {
2088 if (
err == PHP_ICONV_ERR_SUCCESS) {
2105 size_t enc_str_len_tmp;
2107 php_iconv_err_t
err = PHP_ICONV_ERR_SUCCESS;
2116 charset = get_internal_encoding();
2117 }
else if (charset_len >= ICONV_CSNMAXLEN) {
2124 enc_str_tmp =
ZSTR_VAL(encoded_str);
2125 enc_str_len_tmp =
ZSTR_LEN(encoded_str);
2126 while (enc_str_len_tmp > 0) {
2128 char *header_name =
NULL;
2129 size_t header_name_len = 0;
2130 char *header_value =
NULL;
2131 size_t header_value_len = 0;
2133 const char *next_pos;
2135 if (PHP_ICONV_ERR_SUCCESS != (
err = _php_iconv_mime_decode(&decoded_header, enc_str_tmp, enc_str_len_tmp,
charset, &next_pos, (
int)
mode))) {
2136 smart_str_free(&decoded_header);
2140 if (decoded_header.
s ==
NULL) {
2148 header_name =
ZSTR_VAL(decoded_header.
s);
2149 header_name_len =
p -
ZSTR_VAL(decoded_header.
s);
2151 while (++
p < limit) {
2152 if (*
p !=
' ' && *
p !=
'\t') {
2158 header_value_len = limit -
p;
2164 if (header_name !=
NULL) {
2173 add_next_index_zval(&new_elem, elem);
2182 enc_str_len_tmp -= next_pos - enc_str_tmp;
2183 enc_str_tmp = (
char *)next_pos;
2185 smart_str_free(&decoded_header);
2188 if (
err != PHP_ICONV_ERR_SUCCESS) {
2199 char *in_charset, *out_charset;
2201 size_t in_charset_len = 0, out_charset_len = 0;
2202 php_iconv_err_t
err;
2206 &in_charset, &in_charset_len, &out_charset, &out_charset_len, &in_buffer) ==
FAILURE) {
2210 if (in_charset_len >= ICONV_CSNMAXLEN || out_charset_len >= ICONV_CSNMAXLEN) {
2215 err = php_iconv_string(
ZSTR_VAL(in_buffer), (
size_t)
ZSTR_LEN(in_buffer), &out_buffer, out_charset, in_charset);
2216 _php_iconv_show_error(
err, out_charset, in_charset);
2217 if (
err == PHP_ICONV_ERR_SUCCESS && out_buffer !=
NULL) {
2220 if (out_buffer !=
NULL) {
2221 zend_string_efree(out_buffer);
2277 add_assoc_string(
return_value,
"input_encoding", get_input_encoding());
2278 add_assoc_string(
return_value,
"output_encoding", get_output_encoding());
2279 add_assoc_string(
return_value,
"internal_encoding", get_internal_encoding());
2295typedef struct _php_iconv_stream_filter {
2299 size_t to_charset_len;
2301 size_t from_charset_len;
2304} php_iconv_stream_filter;
2308static void php_iconv_stream_filter_dtor(php_iconv_stream_filter *self)
2310 iconv_close(self->cd);
2311 pefree(self->to_charset, self->persistent);
2312 pefree(self->from_charset, self->persistent);
2317static php_iconv_err_t php_iconv_stream_filter_ctor(php_iconv_stream_filter *self,
2318 const char *to_charset,
size_t to_charset_len,
2319 const char *from_charset,
size_t from_charset_len,
int persistent)
2322 self->to_charset_len = to_charset_len;
2324 self->from_charset_len = from_charset_len;
2326 memcpy(self->to_charset, to_charset, to_charset_len);
2327 self->to_charset[to_charset_len] =
'\0';
2328 memcpy(self->from_charset, from_charset, from_charset_len);
2329 self->from_charset[from_charset_len] =
'\0';
2331 if ((iconv_t)-1 == (self->cd = iconv_open(self->to_charset, self->from_charset))) {
2334 return PHP_ICONV_ERR_UNKNOWN;
2338 return PHP_ICONV_ERR_SUCCESS;
2343static int php_iconv_stream_filter_append_bucket(
2344 php_iconv_stream_filter *self,
2347 const char *ps,
size_t buf_len,
size_t *consumed,
2351 char *out_buf =
NULL;
2352 size_t out_buf_size;
2354 size_t ocnt, prev_ocnt, icnt, tcnt;
2355 size_t initial_out_buf_size;
2358 initial_out_buf_size = 64;
2361 initial_out_buf_size = buf_len;
2365 out_buf_size = ocnt = prev_ocnt = initial_out_buf_size;
2370 if (self->stub_len > 0) {
2372 tcnt = self->stub_len;
2375 if (
iconv(self->cd, (ICONV_CONST
char **)&pt, &tcnt, &pd, &ocnt) == (
size_t)-1) {
2378 php_error_docref(
NULL,
E_WARNING,
"iconv stream filter (\"%s\"=>\"%s\"): invalid multibyte sequence", self->from_charset, self->to_charset);
2384 if (self->stub_len >=
sizeof(self->stub)) {
2388 self->stub[self->stub_len++] = *(ps++);
2391 tcnt = self->stub_len;
2397 php_error_docref(
NULL,
E_WARNING,
"iconv stream filter (\"%s\"=>\"%s\"): invalid multibyte sequence", self->from_charset, self->to_charset);
2404 size_t new_out_buf_size;
2406 new_out_buf_size = out_buf_size << 1;
2408 if (new_out_buf_size < out_buf_size) {
2416 out_buf_size = ocnt = initial_out_buf_size;
2421 pd = new_out_buf + (pd - out_buf);
2422 ocnt += (new_out_buf_size - out_buf_size);
2423 out_buf = new_out_buf;
2424 out_buf_size = new_out_buf_size;
2435 memmove(self->stub, pt, tcnt);
2436 self->stub_len = tcnt;
2441 iconv(self->cd, (ICONV_CONST
char **)&ps, &icnt, &pd, &ocnt)) == (
size_t)-1) {
2444 php_error_docref(
NULL,
E_WARNING,
"iconv stream filter (\"%s\"=>\"%s\"): invalid multibyte sequence", self->from_charset, self->to_charset);
2449 if (icnt >
sizeof(self->stub)) {
2453 memcpy(self->stub, ps, icnt);
2454 self->stub_len = icnt;
2465 size_t new_out_buf_size;
2467 new_out_buf_size = out_buf_size << 1;
2469 if (new_out_buf_size < out_buf_size) {
2477 out_buf_size = ocnt = initial_out_buf_size;
2482 pd = new_out_buf + (pd - out_buf);
2483 ocnt += (new_out_buf_size - out_buf_size);
2484 out_buf = new_out_buf;
2485 out_buf_size = new_out_buf_size;
2501 if (out_buf_size > ocnt) {
2509 *consumed += buf_len - icnt;
2524 size_t *bytes_consumed,
int flags)
2527 size_t consumed = 0;
2528 php_iconv_stream_filter *self = (php_iconv_stream_filter *)
Z_PTR(filter->
abstract);
2531 bucket = buckets_in->
head;
2535 if (php_iconv_stream_filter_append_bucket(self, stream, filter,
2536 buckets_out, bucket->
buf, bucket->
buflen, &consumed,
2546 if (php_iconv_stream_filter_append_bucket(self, stream, filter,
2547 buckets_out,
NULL, 0, &consumed,
2553 if (bytes_consumed !=
NULL) {
2554 *bytes_consumed = consumed;
2564 php_iconv_stream_filter_dtor((php_iconv_stream_filter *)
Z_PTR(filter->
abstract));
2570 php_iconv_stream_filter_do_filter,
2571 php_iconv_stream_filter_cleanup,
2579 php_iconv_stream_filter *inst;
2580 char *from_charset =
NULL, *to_charset =
NULL;
2581 size_t from_charset_len, to_charset_len;
2587 if ((from_charset =
strchr(from_charset,
'.')) ==
NULL) {
2591 if ((to_charset =
strpbrk(from_charset,
"/.")) ==
NULL) {
2594 from_charset_len = to_charset - from_charset;
2596 to_charset_len =
strlen(to_charset);
2598 if (from_charset_len >= ICONV_CSNMAXLEN || to_charset_len >= ICONV_CSNMAXLEN) {
2604 if (php_iconv_stream_filter_ctor(inst, to_charset, to_charset_len, from_charset, from_charset_len,
persistent) != PHP_ICONV_ERR_SUCCESS) {
2610 php_iconv_stream_filter_dtor(inst);
2619static php_iconv_err_t php_iconv_stream_filter_register_factory(
void)
2622 php_iconv_stream_filter_factory_create
2626 php_iconv_stream_filter_ops.
label,
2628 return PHP_ICONV_ERR_UNKNOWN;
2630 return PHP_ICONV_ERR_SUCCESS;
2635static php_iconv_err_t php_iconv_stream_filter_unregister_factory(
void)
2638 php_iconv_stream_filter_ops.
label)) {
2639 return PHP_ICONV_ERR_UNKNOWN;
2641 return PHP_ICONV_ERR_SUCCESS;
#define SAPI_DEFAULT_MIMETYPE
#define sapi_add_header(a, b, c)
strpbrk(string $string, string $characters)
strstr(string $haystack, string $needle, bool $before_needle=false)
strchr(string $haystack, string $needle, bool $before_needle=false)
zend_ffi_ctype_name_buf buf
enum entity_charset charset
iconv(string $from_encoding, string $to_encoding, string $string)
iconv_mime_decode_headers(string $headers, int $mode=0, ?string $encoding=null)
iconv_mime_encode(string $field_name, string $field_value, array $options=[])
iconv_mime_decode(string $string, int $mode=0, ?string $encoding=null)
iconv_set_encoding(string $type, string $encoding)
iconv_substr(string $string, int $offset, ?int $length=null, ?string $encoding=null)
iconv_get_encoding(string $type="all")
iconv_strlen(string $string, ?string $encoding=null)
iconv_strrpos(string $haystack, string $needle, ?string $encoding=null)
iconv_strpos(string $haystack, string $needle, int $offset=0, ?string $encoding=null)
PHPAPI php_stream_bucket * php_stream_bucket_new(php_stream *stream, char *buf, size_t buflen, uint8_t own_buf, uint8_t buf_persistent)
PHPAPI void php_stream_bucket_append(php_stream_bucket_brigade *brigade, php_stream_bucket *bucket)
PHPAPI void php_stream_bucket_delref(php_stream_bucket *bucket)
PHPAPI void php_stream_bucket_unlink(php_stream_bucket *bucket)
PHPAPI int php_stream_filter_register_factory(const char *filterpattern, const php_stream_filter_factory *factory)
PHPAPI int php_stream_filter_unregister_factory(const char *filterpattern)
PHPAPI const char * php_get_output_encoding(void)
PHPAPI const char * php_get_input_encoding(void)
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
PHPAPI const char * php_get_internal_encoding(void)
const mbfl_encoding * internal_encoding
PHPAPI zend_result php_output_handler_hook(php_output_handler_hook_t type, void *arg)
PHPAPI bool php_output_handler_conflict(const char *handler_new, size_t handler_new_len, const char *handler_set, size_t handler_set_len)
PHPAPI zend_result php_output_handler_conflict_register(const char *name, size_t name_len, php_output_handler_conflict_check_t check_func)
PHPAPI php_output_handler * php_output_handler_create_internal(const char *name, size_t name_len, php_output_handler_context_func_t output_handler, size_t chunk_size, int flags)
PHPAPI int php_output_get_level(void)
PHPAPI zend_result php_output_handler_alias_register(const char *name, size_t name_len, php_output_handler_alias_ctor_t func)
PHPAPI int php_output_get_status(void)
php_info_print_table_start()
php_info_print_table_row(2, "PDO Driver for Firebird", "enabled")
php_info_print_table_end()
#define PHP_MSHUTDOWN_FUNCTION
#define PHP_MINIT_FUNCTION
#define PHP_MINFO_FUNCTION
#define PHP_GINIT_FUNCTION
#define PHP_MODULE_GLOBALS
#define PHP_ICONV_VERSION
#define PHP_INI_STAGE_ACTIVATE
#define PHP_INI_STAGE_RUNTIME
#define STD_PHP_INI_ENTRY
struct _php_output_handler php_output_handler
@ PHP_OUTPUT_HANDLER_HOOK_IMMUTABLE
#define PHP_OUTPUT_HANDLER_CLEAN
#define PHP_OUTPUT_HANDLER_FINAL
struct _php_output_context php_output_context
#define PHP_OUTPUT_HANDLER_START
#define php_stream_filter_alloc(fops, thisptr, persistent)
struct _php_stream_filter_ops php_stream_filter_ops
php_stream_filter_status_t
struct _php_stream_filter_factory php_stream_filter_factory
struct _php_stream_bucket php_stream_bucket
struct _php_stream_bucket_brigade php_stream_bucket_brigade
struct _php_stream php_stream
struct _php_stream_filter php_stream_filter
#define php_stream_is_persistent(stream)
PHPAPI zend_string * php_quot_print_decode(const unsigned char *str, size_t length, int replace_us_by_ws)
#define ZEND_TSRMLS_CACHE_UPDATE()
#define ZEND_TSRMLS_CACHE_DEFINE()
ZEND_API zend_result add_next_index_stringl(zval *arg, const char *str, size_t length)
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
ZEND_API void add_assoc_stringl_ex(zval *arg, const char *key, size_t key_len, const char *str, size_t length)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
#define ZEND_DECLARE_MODULE_GLOBALS(module_name)
#define RETVAL_NEW_STR(s)
#define ZEND_GET_MODULE(name)
#define estrndup(s, length)
#define perealloc(ptr, size, persistent)
#define pefree(ptr, persistent)
#define pemalloc(size, persistent)
#define safe_emalloc(nmemb, size, offset)
strcmp(string $string1, string $string2)
zend_string_release_ex(func->internal_function.function_name, 0)
#define strncasecmp(s1, s2, n)
ZEND_API zval * zend_get_constant_str(const char *name, size_t name_len)
ZEND_API zval *ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *str, size_t len)
ZEND_API zval *ZEND_FASTCALL zend_hash_str_update(HashTable *ht, const char *str, size_t len, zval *pData)
ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht)
ZEND_API zend_result zend_alter_ini_entry(zend_string *name, zend_string *new_value, int modify_type, int stage)
#define UNREGISTER_INI_ENTRIES()
#define REGISTER_INI_ENTRIES()
#define DISPLAY_INI_ENTRIES()
struct _zend_string zend_string
#define STANDARD_MODULE_HEADER
struct _zend_module_entry zend_module_entry
#define STANDARD_MODULE_PROPERTIES_EX
ZEND_API zend_string *ZEND_FASTCALL zval_try_get_string_func(zval *op)
#define UNEXPECTED(condition)
#define ZSTR_INIT_LITERAL(s, persistent)
#define zend_string_equals_literal_ci(str, c)
#define Z_STRVAL_P(zval_p)
#define Z_ARRVAL_P(zval_p)
#define Z_STRLEN_P(zval_p)
ZEND_RESULT_CODE zend_result