| 
 |   
| version 1.1.1.1, 2012/02/21 23:47:56 | version 1.1.1.3, 2013/07/22 01:31:52 | 
|---|---|
| Line 2 | Line 2 | 
| +----------------------------------------------------------------------+ | +----------------------------------------------------------------------+ | 
| | PHP Version 5 | | | PHP Version 5 | | 
| +----------------------------------------------------------------------+ | +----------------------------------------------------------------------+ | 
| | Copyright (c) 1997-2012 The PHP Group | | | Copyright (c) 1997-2013 The PHP Group | | 
| +----------------------------------------------------------------------+ | +----------------------------------------------------------------------+ | 
| | This source file is subject to version 3.01 of the PHP license, | | | This source file is subject to version 3.01 of the PHP license, | | 
| | that is bundled with this package in the file LICENSE, and is | | | that is bundled with this package in the file LICENSE, and is | | 
| Line 112 ZEND_BEGIN_ARG_INFO(arginfo_iconv, 0) | Line 112 ZEND_BEGIN_ARG_INFO(arginfo_iconv, 0) | 
| ZEND_ARG_INFO(0, str) | ZEND_ARG_INFO(0, str) | 
| ZEND_END_ARG_INFO() | ZEND_END_ARG_INFO() | 
| ZEND_BEGIN_ARG_INFO(arginfo_ob_iconv_handler, 0) | |
| ZEND_ARG_INFO(0, contents) | |
| ZEND_ARG_INFO(0, status) | |
| ZEND_END_ARG_INFO() | |
| ZEND_BEGIN_ARG_INFO(arginfo_iconv_set_encoding, 0) | ZEND_BEGIN_ARG_INFO(arginfo_iconv_set_encoding, 0) | 
| ZEND_ARG_INFO(0, type) | ZEND_ARG_INFO(0, type) | 
| ZEND_ARG_INFO(0, charset) | ZEND_ARG_INFO(0, charset) | 
| Line 132 ZEND_END_ARG_INFO() | Line 127 ZEND_END_ARG_INFO() | 
| */ | */ | 
| const zend_function_entry iconv_functions[] = { | const zend_function_entry iconv_functions[] = { | 
| PHP_RAW_NAMED_FE(iconv,php_if_iconv, arginfo_iconv) | PHP_RAW_NAMED_FE(iconv,php_if_iconv, arginfo_iconv) | 
| PHP_FE(ob_iconv_handler, arginfo_ob_iconv_handler) | |
| PHP_FE(iconv_get_encoding, arginfo_iconv_get_encoding) | PHP_FE(iconv_get_encoding, arginfo_iconv_get_encoding) | 
| PHP_FE(iconv_set_encoding, arginfo_iconv_set_encoding) | PHP_FE(iconv_set_encoding, arginfo_iconv_set_encoding) | 
| PHP_FE(iconv_strlen, arginfo_iconv_strlen) | PHP_FE(iconv_strlen, arginfo_iconv_strlen) | 
| Line 196 typedef enum _php_iconv_enc_scheme_t { | Line 190 typedef enum _php_iconv_enc_scheme_t { | 
| #define PHP_ICONV_MIME_DECODE_STRICT (1<<0) | #define PHP_ICONV_MIME_DECODE_STRICT (1<<0) | 
| #define PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR (1<<1) | #define PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR (1<<1) | 
| /* {{{ prototypes */ | /* {{{ prototypes */ | 
| static php_iconv_err_t _php_iconv_appendl(smart_str *d, const char *s, size_t l, iconv_t cd); | static php_iconv_err_t _php_iconv_appendl(smart_str *d, const char *s, size_t l, iconv_t cd); | 
| static php_iconv_err_t _php_iconv_appendc(smart_str *d, const char c, iconv_t cd); | static php_iconv_err_t _php_iconv_appendc(smart_str *d, const char c, iconv_t cd); | 
| Line 214 static php_iconv_err_t _php_iconv_mime_decode(smart_st | Line 208 static php_iconv_err_t _php_iconv_mime_decode(smart_st | 
| static php_iconv_err_t php_iconv_stream_filter_register_factory(TSRMLS_D); | static php_iconv_err_t php_iconv_stream_filter_register_factory(TSRMLS_D); | 
| static php_iconv_err_t php_iconv_stream_filter_unregister_factory(TSRMLS_D); | static php_iconv_err_t php_iconv_stream_filter_unregister_factory(TSRMLS_D); | 
| static int php_iconv_output_conflict(const char *handler_name, size_t handler_name_len TSRMLS_DC); | |
| static php_output_handler *php_iconv_output_handler_init(const char *name, size_t name_len, size_t chunk_size, int flags TSRMLS_DC); | |
| static int php_iconv_output_handler(void **nothing, php_output_context *output_context); | |
| /* }}} */ | /* }}} */ | 
| /* {{{ static globals */ | /* {{{ static globals */ | 
| Line 251 PHP_MINIT_FUNCTION(miconv) | Line 249 PHP_MINIT_FUNCTION(miconv) | 
| { | { | 
| static char buf[16]; | static char buf[16]; | 
| snprintf(buf, sizeof(buf), "%d.%d", | snprintf(buf, sizeof(buf), "%d.%d", | 
| ((_libiconv_version >> 8) & 0x0f), (_libiconv_version & 0x0f)); | ((_libiconv_version >> 8) & 0x0f), (_libiconv_version & 0x0f)); | 
| version = buf; | version = buf; | 
| } | } | 
| #elif HAVE_GLIBC_ICONV | #elif HAVE_GLIBC_ICONV | 
| Line 278 PHP_MINIT_FUNCTION(miconv) | Line 276 PHP_MINIT_FUNCTION(miconv) | 
| return FAILURE; | return FAILURE; | 
| } | } | 
| php_output_handler_alias_register(ZEND_STRL("ob_iconv_handler"), php_iconv_output_handler_init TSRMLS_CC); | |
| php_output_handler_conflict_register(ZEND_STRL("ob_iconv_handler"), php_iconv_output_conflict TSRMLS_CC); | |
| return SUCCESS; | return SUCCESS; | 
| } | } | 
| /* }}} */ | /* }}} */ | 
| Line 312 PHP_MINFO_FUNCTION(miconv) | Line 313 PHP_MINFO_FUNCTION(miconv) | 
| } | } | 
| /* }}} */ | /* }}} */ | 
| static int php_iconv_output_conflict(const char *handler_name, size_t handler_name_len TSRMLS_DC) | |
| { | |
| if (php_output_get_level(TSRMLS_C)) { | |
| if (php_output_handler_conflict(handler_name, handler_name_len, ZEND_STRL("ob_iconv_handler") TSRMLS_CC) | |
| || php_output_handler_conflict(handler_name, handler_name_len, ZEND_STRL("mb_output_handler") TSRMLS_CC)) { | |
| return FAILURE; | |
| } | |
| } | |
| return SUCCESS; | |
| } | |
| static php_output_handler *php_iconv_output_handler_init(const char *handler_name, size_t handler_name_len, size_t chunk_size, int flags TSRMLS_DC) | |
| { | |
| return php_output_handler_create_internal(handler_name, handler_name_len, php_iconv_output_handler, chunk_size, flags TSRMLS_CC); | |
| } | |
| static int php_iconv_output_handler(void **nothing, php_output_context *output_context) | |
| { | |
| char *s, *content_type, *mimetype = NULL; | |
| int output_status, mimetype_len = 0; | |
| PHP_OUTPUT_TSRMLS(output_context); | |
| if (output_context->op & PHP_OUTPUT_HANDLER_START) { | |
| output_status = php_output_get_status(TSRMLS_C); | |
| if (output_status & PHP_OUTPUT_SENT) { | |
| return FAILURE; | |
| } | |
| if (SG(sapi_headers).mimetype && !strncasecmp(SG(sapi_headers).mimetype, "text/", 5)) { | |
| if ((s = strchr(SG(sapi_headers).mimetype,';')) == NULL){ | |
| mimetype = SG(sapi_headers).mimetype; | |
| } else { | |
| mimetype = SG(sapi_headers).mimetype; | |
| mimetype_len = s - SG(sapi_headers).mimetype; | |
| } | |
| } else if (SG(sapi_headers).send_default_content_type) { | |
| mimetype = SG(default_mimetype) ? SG(default_mimetype) : SAPI_DEFAULT_MIMETYPE; | |
| } | |
| if (mimetype != NULL && !(output_context->op & PHP_OUTPUT_HANDLER_CLEAN)) { | |
| int len; | |
| char *p = strstr(ICONVG(output_encoding), "//"); | |
| if (p) { | |
| len = spprintf(&content_type, 0, "Content-Type:%.*s; charset=%.*s", mimetype_len ? mimetype_len : (int) strlen(mimetype), mimetype, (int)(p - ICONVG(output_encoding)), ICONVG(output_encoding)); | |
| } else { | |
| len = spprintf(&content_type, 0, "Content-Type:%.*s; charset=%s", mimetype_len ? mimetype_len : (int) strlen(mimetype), mimetype, ICONVG(output_encoding)); | |
| } | |
| if (content_type && SUCCESS == sapi_add_header(content_type, len, 0)) { | |
| SG(sapi_headers).send_default_content_type = 0; | |
| php_output_handler_hook(PHP_OUTPUT_HANDLER_HOOK_IMMUTABLE, NULL TSRMLS_CC); | |
| } | |
| } | |
| } | |
| if (output_context->in.used) { | |
| output_context->out.free = 1; | |
| _php_iconv_show_error(php_iconv_string(output_context->in.data, output_context->in.used, &output_context->out.data, &output_context->out.used, ICONVG(output_encoding), ICONVG(internal_encoding)), ICONVG(output_encoding), ICONVG(internal_encoding) TSRMLS_CC); | |
| } | |
| return SUCCESS; | |
| } | |
| /* {{{ _php_iconv_appendl() */ | /* {{{ _php_iconv_appendl() */ | 
| static php_iconv_err_t _php_iconv_appendl(smart_str *d, const char *s, size_t l, iconv_t cd) | static php_iconv_err_t _php_iconv_appendl(smart_str *d, const char *s, size_t l, iconv_t cd) | 
| { | { | 
| Line 336 static php_iconv_err_t _php_iconv_appendl(smart_str *d | Line 400 static php_iconv_err_t _php_iconv_appendl(smart_str *d | 
| if (iconv(cd, (char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) { | if (iconv(cd, (char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) { | 
| #if ICONV_SUPPORTS_ERRNO | #if ICONV_SUPPORTS_ERRNO | 
| switch (errno) { | switch (errno) { | 
| case EINVAL: | case EINVAL: | 
| return PHP_ICONV_ERR_ILLEGAL_CHAR; | return PHP_ICONV_ERR_ILLEGAL_CHAR; | 
| Line 351 static php_iconv_err_t _php_iconv_appendl(smart_str *d | Line 415 static php_iconv_err_t _php_iconv_appendl(smart_str *d | 
| } | } | 
| #else | #else | 
| if (prev_in_left == in_left) { | if (prev_in_left == in_left) { | 
| return PHP_ICONV_ERR_UNKNOWN; | return PHP_ICONV_ERR_UNKNOWN; | 
| } | } | 
| #endif | #endif | 
| } | } | 
| Line 382 static php_iconv_err_t _php_iconv_appendl(smart_str *d | Line 446 static php_iconv_err_t _php_iconv_appendl(smart_str *d | 
| #else | #else | 
| if (out_left != 0) { | if (out_left != 0) { | 
| return PHP_ICONV_ERR_UNKNOWN; | return PHP_ICONV_ERR_UNKNOWN; | 
| } | } | 
| #endif | #endif | 
| } | } | 
| (d)->len += (buf_growth - out_left); | (d)->len += (buf_growth - out_left); | 
| Line 428 PHP_ICONV_API php_iconv_err_t php_iconv_string(const c | Line 492 PHP_ICONV_API php_iconv_err_t php_iconv_string(const c | 
| in_size = in_len; | in_size = in_len; | 
| cd = iconv_open(out_charset, in_charset); | cd = iconv_open(out_charset, in_charset); | 
| if (cd == (iconv_t)(-1)) { | if (cd == (iconv_t)(-1)) { | 
| return PHP_ICONV_ERR_UNKNOWN; | return PHP_ICONV_ERR_UNKNOWN; | 
| } | } | 
| out_buffer = (char *) emalloc(out_size + 1); | out_buffer = (char *) emalloc(out_size + 1); | 
| out_p = out_buffer; | out_p = out_buffer; | 
| #ifdef NETWARE | #ifdef NETWARE | 
| result = iconv(cd, (char **) &in_p, &in_size, (char **) | result = iconv(cd, (char **) &in_p, &in_size, (char **) | 
| #else | #else | 
| result = iconv(cd, (const char **) &in_p, &in_size, (char **) | result = iconv(cd, (const char **) &in_p, &in_size, (char **) | 
| #endif | #endif | 
| &out_p, &out_left); | &out_p, &out_left); | 
| if (result == (size_t)(-1)) { | if (result == (size_t)(-1)) { | 
| efree(out_buffer); | efree(out_buffer); | 
| return PHP_ICONV_ERR_UNKNOWN; | return PHP_ICONV_ERR_UNKNOWN; | 
| } | } | 
| if (out_left < 8) { | if (out_left < 8) { | 
| out_buffer = (char *) erealloc(out_buffer, out_size + 8); | size_t pos = out_p - out_buffer; | 
| out_buffer = (char *) safe_erealloc(out_buffer, out_size, 1, 8); | |
| out_p = out_buffer+pos; | |
| out_size += 7; | |
| out_left += 7; | |
| } | } | 
| /* flush the shift-out sequences */ | /* flush the shift-out sequences */ | 
| result = iconv(cd, NULL, NULL, &out_p, &out_left); | result = iconv(cd, NULL, NULL, &out_p, &out_left); | 
| if (result == (size_t)(-1)) { | if (result == (size_t)(-1)) { | 
| Line 491 PHP_ICONV_API php_iconv_err_t php_iconv_string(const c | Line 559 PHP_ICONV_API php_iconv_err_t php_iconv_string(const c | 
| } | } | 
| } | } | 
| in_left= in_len; | in_left= in_len; | 
| out_left = in_len + 32; /* Avoid realloc() most cases */ | out_left = in_len + 32; /* Avoid realloc() most cases */ | 
| out_size = 0; | out_size = 0; | 
| bsz = out_left; | bsz = out_left; | 
| out_buf = (char *) emalloc(bsz+1); | out_buf = (char *) emalloc(bsz+1); | 
| out_p = out_buf; | out_p = out_buf; | 
| while (in_left > 0) { | while (in_left > 0) { | 
| Line 509 PHP_ICONV_API php_iconv_err_t php_iconv_string(const c | Line 577 PHP_ICONV_API php_iconv_err_t php_iconv_string(const c | 
| out_p = out_buf = tmp_buf; | out_p = out_buf = tmp_buf; | 
| out_p += out_size; | out_p += out_size; | 
| out_left = bsz - out_size; | out_left = bsz - out_size; | 
| continue; | continue; | 
| } | } | 
| } | } | 
| break; | break; | 
| } | } | 
| if (result != (size_t)(-1)) { | if (result != (size_t)(-1)) { | 
| /* flush the shift-out sequences */ | /* flush the shift-out sequences */ | 
| for (;;) { | for (;;) { | 
| result = iconv(cd, NULL, NULL, (char **) &out_p, &out_left); | result = iconv(cd, NULL, NULL, (char **) &out_p, &out_left); | 
| out_size = bsz - out_left; | out_size = bsz - out_left; | 
| Line 528 PHP_ICONV_API php_iconv_err_t php_iconv_string(const c | Line 596 PHP_ICONV_API php_iconv_err_t php_iconv_string(const c | 
| if (errno == E2BIG) { | if (errno == E2BIG) { | 
| bsz += 16; | bsz += 16; | 
| tmp_buf = (char *) erealloc(out_buf, bsz); | tmp_buf = (char *) erealloc(out_buf, bsz); | 
| out_p = out_buf = tmp_buf; | out_p = out_buf = tmp_buf; | 
| out_p += out_size; | out_p += out_size; | 
| out_left = bsz - out_size; | out_left = bsz - out_size; | 
| Line 620 static php_iconv_err_t _php_iconv_strlen(unsigned int | Line 688 static php_iconv_err_t _php_iconv_strlen(unsigned int | 
| } | } | 
| if (out_left > 0) { | if (out_left > 0) { | 
| cnt -= out_left / GENERIC_SUPERSET_NBYTES; | cnt -= out_left / GENERIC_SUPERSET_NBYTES; | 
| } | } | 
| #if ICONV_SUPPORTS_ERRNO | #if ICONV_SUPPORTS_ERRNO | 
| Line 671 static php_iconv_err_t _php_iconv_substr(smart_str *pr | Line 739 static php_iconv_err_t _php_iconv_substr(smart_str *pr | 
| unsigned int cnt; | unsigned int cnt; | 
| int total_len; | int total_len; | 
| err = _php_iconv_strlen(&total_len, str, nbytes, enc); | err = _php_iconv_strlen(&total_len, str, nbytes, enc); | 
| if (err != PHP_ICONV_ERR_SUCCESS) { | if (err != PHP_ICONV_ERR_SUCCESS) { | 
| return err; | return err; | 
| } | } | 
| if (len < 0) { | if (len < 0) { | 
| if ((len += (total_len - offset)) < 0) { | if ((len += (total_len - offset)) < 0) { | 
| return PHP_ICONV_ERR_SUCCESS; | return PHP_ICONV_ERR_SUCCESS; | 
| Line 708 static php_iconv_err_t _php_iconv_substr(smart_str *pr | Line 776 static php_iconv_err_t _php_iconv_substr(smart_str *pr | 
| smart_str_0(pretval); | smart_str_0(pretval); | 
| return PHP_ICONV_ERR_SUCCESS; | return PHP_ICONV_ERR_SUCCESS; | 
| } | } | 
| cd1 = iconv_open(GENERIC_SUPERSET_NAME, enc); | cd1 = iconv_open(GENERIC_SUPERSET_NAME, enc); | 
| if (cd1 == (iconv_t)(-1)) { | if (cd1 == (iconv_t)(-1)) { | 
| Line 793 static php_iconv_err_t _php_iconv_substr(smart_str *pr | Line 861 static php_iconv_err_t _php_iconv_substr(smart_str *pr | 
| if (cd2 != (iconv_t)NULL) { | if (cd2 != (iconv_t)NULL) { | 
| iconv_close(cd2); | iconv_close(cd2); | 
| } | } | 
| return err; | return err; | 
| } | } | 
| Line 978 static php_iconv_err_t _php_iconv_strpos(unsigned int | Line 1046 static php_iconv_err_t _php_iconv_strpos(unsigned int | 
| if (ndl_buf) { | if (ndl_buf) { | 
| efree(ndl_buf); | efree(ndl_buf); | 
| } | } | 
| iconv_close(cd); | iconv_close(cd); | 
| return err; | return err; | 
| Line 1025 static php_iconv_err_t _php_iconv_mime_encode(smart_st | Line 1093 static php_iconv_err_t _php_iconv_mime_encode(smart_st | 
| if ((fname_nbytes + 2) >= max_line_len | if ((fname_nbytes + 2) >= max_line_len | 
| || (out_charset_len + 12) >= max_line_len) { | || (out_charset_len + 12) >= max_line_len) { | 
| /* field name is too long */ | /* field name is too long */ | 
| err = PHP_ICONV_ERR_TOO_BIG; | err = PHP_ICONV_ERR_TOO_BIG; | 
| goto out; | goto out; | 
| } | } | 
| Line 1067 static php_iconv_err_t _php_iconv_mime_encode(smart_st | Line 1135 static php_iconv_err_t _php_iconv_mime_encode(smart_st | 
| char_cnt -= 2; | char_cnt -= 2; | 
| in_p = fval; | in_p = fval; | 
| in_left = fval_nbytes; | in_left = fval_nbytes; | 
| do { | do { | 
| size_t prev_in_left; | size_t prev_in_left; | 
| Line 1078 static php_iconv_err_t _php_iconv_mime_encode(smart_st | Line 1146 static php_iconv_err_t _php_iconv_mime_encode(smart_st | 
| smart_str_appendl(pretval, lfchars, lfchars_len); | smart_str_appendl(pretval, lfchars, lfchars_len); | 
| smart_str_appendc(pretval, ' '); | smart_str_appendc(pretval, ' '); | 
| char_cnt = max_line_len - 1; | char_cnt = max_line_len - 1; | 
| } | } | 
| smart_str_appendl(pretval, "=?", sizeof("=?") - 1); | smart_str_appendl(pretval, "=?", sizeof("=?") - 1); | 
| char_cnt -= 2; | char_cnt -= 2; | 
| smart_str_appendl(pretval, out_charset, out_charset_len); | smart_str_appendl(pretval, out_charset, out_charset_len); | 
| Line 1231 static php_iconv_err_t _php_iconv_mime_encode(smart_st | Line 1299 static php_iconv_err_t _php_iconv_mime_encode(smart_st | 
| goto out; | goto out; | 
| } | } | 
| break; | break; | 
| default: | default: | 
| err = PHP_ICONV_ERR_UNKNOWN; | err = PHP_ICONV_ERR_UNKNOWN; | 
| goto out; | goto out; | 
| Line 1308 out: | Line 1376 out: | 
| } | } | 
| if (encoded != NULL) { | if (encoded != NULL) { | 
| efree(encoded); | efree(encoded); | 
| } | } | 
| if (buf != NULL) { | if (buf != NULL) { | 
| efree(buf); | efree(buf); | 
| } | } | 
| Line 1327 static php_iconv_err_t _php_iconv_mime_decode(smart_st | Line 1395 static php_iconv_err_t _php_iconv_mime_decode(smart_st | 
| size_t str_left; | size_t str_left; | 
| unsigned int scan_stat = 0; | unsigned int scan_stat = 0; | 
| const char *csname = NULL; | const char *csname = NULL; | 
| size_t csname_len; | size_t csname_len; | 
| const char *encoded_text = NULL; | const char *encoded_text = NULL; | 
| size_t encoded_text_len = 0; | size_t encoded_text_len = 0; | 
| const char *encoded_word = NULL; | const char *encoded_word = NULL; | 
| Line 1366 static php_iconv_err_t _php_iconv_mime_decode(smart_st | Line 1434 static php_iconv_err_t _php_iconv_mime_decode(smart_st | 
| break; | break; | 
| case '\n': | case '\n': | 
| scan_stat = 8; | scan_stat = 8; | 
| break; | break; | 
| case '=': /* first letter of an encoded chunk */ | case '=': /* first letter of an encoded chunk */ | 
| Line 1391 static php_iconv_err_t _php_iconv_mime_decode(smart_st | Line 1459 static php_iconv_err_t _php_iconv_mime_decode(smart_st | 
| case 1: /* expecting a delimiter */ | case 1: /* expecting a delimiter */ | 
| if (*p1 != '?') { | if (*p1 != '?') { | 
| err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); | err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); | 
| if (err != PHP_ICONV_ERR_SUCCESS) { | if (err != PHP_ICONV_ERR_SUCCESS) { | 
| goto out; | goto out; | 
| } | } | 
| Line 1406 static php_iconv_err_t _php_iconv_mime_decode(smart_st | Line 1474 static php_iconv_err_t _php_iconv_mime_decode(smart_st | 
| csname = p1 + 1; | csname = p1 + 1; | 
| scan_stat = 2; | scan_stat = 2; | 
| break; | break; | 
| case 2: /* expecting a charset name */ | case 2: /* expecting a charset name */ | 
| switch (*p1) { | switch (*p1) { | 
| case '?': /* normal delimiter: encoding scheme follows */ | case '?': /* normal delimiter: encoding scheme follows */ | 
| Line 1416 static php_iconv_err_t _php_iconv_mime_decode(smart_st | Line 1484 static php_iconv_err_t _php_iconv_mime_decode(smart_st | 
| case '*': /* new style delimiter: locale id follows */ | case '*': /* new style delimiter: locale id follows */ | 
| scan_stat = 10; | scan_stat = 10; | 
| break; | break; | 
| } | } | 
| if (scan_stat != 2) { | if (scan_stat != 2) { | 
| char tmpbuf[80]; | char tmpbuf[80]; | 
| Line 1429 static php_iconv_err_t _php_iconv_mime_decode(smart_st | Line 1497 static php_iconv_err_t _php_iconv_mime_decode(smart_st | 
| if (csname_len > sizeof(tmpbuf) - 1) { | if (csname_len > sizeof(tmpbuf) - 1) { | 
| if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { | if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { | 
| err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); | err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); | 
| if (err != PHP_ICONV_ERR_SUCCESS) { | if (err != PHP_ICONV_ERR_SUCCESS) { | 
| goto out; | goto out; | 
| } | } | 
| Line 1485 static php_iconv_err_t _php_iconv_mime_decode(smart_st | Line 1553 static php_iconv_err_t _php_iconv_mime_decode(smart_st | 
| --str_left; | --str_left; | 
| } | } | 
| err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); | err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); | 
| if (err != PHP_ICONV_ERR_SUCCESS) { | if (err != PHP_ICONV_ERR_SUCCESS) { | 
| goto out; | goto out; | 
| } | } | 
| Line 1544 static php_iconv_err_t _php_iconv_mime_decode(smart_st | Line 1612 static php_iconv_err_t _php_iconv_mime_decode(smart_st | 
| } | } | 
| } | } | 
| break; | break; | 
| case 4: /* expecting a delimiter */ | case 4: /* expecting a delimiter */ | 
| if (*p1 != '?') { | if (*p1 != '?') { | 
| if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { | if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { | 
| /* pass the entire chunk through the converter */ | /* pass the entire chunk through the converter */ | 
| err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); | err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); | 
| if (err != PHP_ICONV_ERR_SUCCESS) { | if (err != PHP_ICONV_ERR_SUCCESS) { | 
| goto out; | goto out; | 
| } | } | 
| Line 1605 static php_iconv_err_t _php_iconv_mime_decode(smart_st | Line 1673 static php_iconv_err_t _php_iconv_mime_decode(smart_st | 
| if (*p1 != '=') { | if (*p1 != '=') { | 
| if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { | if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { | 
| /* pass the entire chunk through the converter */ | /* pass the entire chunk through the converter */ | 
| err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); | err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); | 
| if (err != PHP_ICONV_ERR_SUCCESS) { | if (err != PHP_ICONV_ERR_SUCCESS) { | 
| goto out; | goto out; | 
| } | } | 
| Line 1632 static php_iconv_err_t _php_iconv_mime_decode(smart_st | Line 1700 static php_iconv_err_t _php_iconv_mime_decode(smart_st | 
| switch (*p1) { | switch (*p1) { | 
| default: | default: | 
| /* Handle non-RFC-compliant formats | /* Handle non-RFC-compliant formats | 
| * | * | 
| * RFC2047 requires the character that comes right | * RFC2047 requires the character that comes right | 
| * after an encoded word (chunk) to be a whitespace, | * after an encoded word (chunk) to be a whitespace, | 
| * while there are lots of broken implementations that | * while there are lots of broken implementations that | 
| * generate such malformed headers that don't fulfill | * generate such malformed headers that don't fulfill | 
| * that requirement. | * that requirement. | 
| */ | */ | 
| if (!eos) { | if (!eos) { | 
| if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { | if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { | 
| /* pass the entire chunk through the converter */ | /* pass the entire chunk through the converter */ | 
| err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); | err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); | 
| if (err != PHP_ICONV_ERR_SUCCESS) { | if (err != PHP_ICONV_ERR_SUCCESS) { | 
| goto out; | goto out; | 
| } | } | 
| Line 1674 static php_iconv_err_t _php_iconv_mime_decode(smart_st | Line 1742 static php_iconv_err_t _php_iconv_mime_decode(smart_st | 
| if (decoded_text == NULL) { | if (decoded_text == NULL) { | 
| if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { | if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { | 
| /* pass the entire chunk through the converter */ | /* pass the entire chunk through the converter */ | 
| err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); | err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); | 
| if (err != PHP_ICONV_ERR_SUCCESS) { | if (err != PHP_ICONV_ERR_SUCCESS) { | 
| goto out; | goto out; | 
| } | } | 
| Line 1697 static php_iconv_err_t _php_iconv_mime_decode(smart_st | Line 1765 static php_iconv_err_t _php_iconv_mime_decode(smart_st | 
| if (err != PHP_ICONV_ERR_SUCCESS) { | if (err != PHP_ICONV_ERR_SUCCESS) { | 
| if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { | if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { | 
| /* pass the entire chunk through the converter */ | /* pass the entire chunk through the converter */ | 
| err = _php_iconv_appendl(pretval, encoded_word, (size_t)(p1 - encoded_word), cd_pl); | err = _php_iconv_appendl(pretval, encoded_word, (size_t)(p1 - encoded_word), cd_pl); | 
| encoded_word = NULL; | encoded_word = NULL; | 
| if (err != PHP_ICONV_ERR_SUCCESS) { | if (err != PHP_ICONV_ERR_SUCCESS) { | 
| break; | break; | 
| Line 1752 static php_iconv_err_t _php_iconv_mime_decode(smart_st | Line 1820 static php_iconv_err_t _php_iconv_mime_decode(smart_st | 
| break; | break; | 
| case '\n': | case '\n': | 
| scan_stat = 8; | scan_stat = 8; | 
| break; | break; | 
| case '=': /* first letter of an encoded chunk */ | case '=': /* first letter of an encoded chunk */ | 
| Line 1892 PHP_FUNCTION(iconv_strlen) | Line 1960 PHP_FUNCTION(iconv_strlen) | 
| char *charset = ICONVG(internal_encoding); | char *charset = ICONVG(internal_encoding); | 
| int charset_len = 0; | int charset_len = 0; | 
| char *str; | char *str; | 
| int str_len; | int str_len; | 
| php_iconv_err_t err; | php_iconv_err_t err; | 
| Line 1908 PHP_FUNCTION(iconv_strlen) | Line 1976 PHP_FUNCTION(iconv_strlen) | 
| RETURN_FALSE; | RETURN_FALSE; | 
| } | } | 
| err = _php_iconv_strlen(&retval, str, str_len, charset); | err = _php_iconv_strlen(&retval, str, str_len, charset); | 
| _php_iconv_show_error(err, GENERIC_SUPERSET_NAME, charset TSRMLS_CC); | _php_iconv_show_error(err, GENERIC_SUPERSET_NAME, charset TSRMLS_CC); | 
| if (err == PHP_ICONV_ERR_SUCCESS) { | if (err == PHP_ICONV_ERR_SUCCESS) { | 
| RETVAL_LONG(retval); | RETVAL_LONG(retval); | 
| Line 1925 PHP_FUNCTION(iconv_substr) | Line 1993 PHP_FUNCTION(iconv_substr) | 
| char *charset = ICONVG(internal_encoding); | char *charset = ICONVG(internal_encoding); | 
| int charset_len = 0; | int charset_len = 0; | 
| char *str; | char *str; | 
| int str_len; | int str_len; | 
| long offset, length = 0; | long offset, length = 0; | 
| php_iconv_err_t err; | php_iconv_err_t err; | 
| Line 1944 PHP_FUNCTION(iconv_substr) | Line 2012 PHP_FUNCTION(iconv_substr) | 
| } | } | 
| if (ZEND_NUM_ARGS() < 3) { | if (ZEND_NUM_ARGS() < 3) { | 
| length = str_len; | length = str_len; | 
| } | } | 
| err = _php_iconv_substr(&retval, str, str_len, offset, length, charset); | err = _php_iconv_substr(&retval, str, str_len, offset, length, charset); | 
| _php_iconv_show_error(err, GENERIC_SUPERSET_NAME, charset TSRMLS_CC); | _php_iconv_show_error(err, GENERIC_SUPERSET_NAME, charset TSRMLS_CC); | 
| if (err == PHP_ICONV_ERR_SUCCESS && str != NULL && retval.c != NULL) { | if (err == PHP_ICONV_ERR_SUCCESS && str != NULL && retval.c != NULL) { | 
| Line 1965 PHP_FUNCTION(iconv_strpos) | Line 2033 PHP_FUNCTION(iconv_strpos) | 
| char *charset = ICONVG(internal_encoding); | char *charset = ICONVG(internal_encoding); | 
| int charset_len = 0; | int charset_len = 0; | 
| char *haystk; | char *haystk; | 
| int haystk_len; | int haystk_len; | 
| char *ndl; | char *ndl; | 
| int ndl_len; | int ndl_len; | 
| long offset = 0; | long offset = 0; | 
| Line 1995 PHP_FUNCTION(iconv_strpos) | Line 2063 PHP_FUNCTION(iconv_strpos) | 
| } | } | 
| err = _php_iconv_strpos(&retval, haystk, haystk_len, ndl, ndl_len, | err = _php_iconv_strpos(&retval, haystk, haystk_len, ndl, ndl_len, | 
| offset, charset); | offset, charset); | 
| _php_iconv_show_error(err, GENERIC_SUPERSET_NAME, charset TSRMLS_CC); | _php_iconv_show_error(err, GENERIC_SUPERSET_NAME, charset TSRMLS_CC); | 
| if (err == PHP_ICONV_ERR_SUCCESS && retval != (unsigned int)-1) { | if (err == PHP_ICONV_ERR_SUCCESS && retval != (unsigned int)-1) { | 
| Line 2013 PHP_FUNCTION(iconv_strrpos) | Line 2081 PHP_FUNCTION(iconv_strrpos) | 
| char *charset = ICONVG(internal_encoding); | char *charset = ICONVG(internal_encoding); | 
| int charset_len = 0; | int charset_len = 0; | 
| char *haystk; | char *haystk; | 
| int haystk_len; | int haystk_len; | 
| char *ndl; | char *ndl; | 
| int ndl_len; | int ndl_len; | 
| Line 2037 PHP_FUNCTION(iconv_strrpos) | Line 2105 PHP_FUNCTION(iconv_strrpos) | 
| } | } | 
| err = _php_iconv_strpos(&retval, haystk, haystk_len, ndl, ndl_len, | err = _php_iconv_strpos(&retval, haystk, haystk_len, ndl, ndl_len, | 
| -1, charset); | -1, charset); | 
| _php_iconv_show_error(err, GENERIC_SUPERSET_NAME, charset TSRMLS_CC); | _php_iconv_show_error(err, GENERIC_SUPERSET_NAME, charset TSRMLS_CC); | 
| if (err == PHP_ICONV_ERR_SUCCESS && retval != (unsigned int)-1) { | if (err == PHP_ICONV_ERR_SUCCESS && retval != (unsigned int)-1) { | 
| Line 2177 PHP_FUNCTION(iconv_mime_decode) | Line 2245 PHP_FUNCTION(iconv_mime_decode) | 
| char *charset = ICONVG(internal_encoding); | char *charset = ICONVG(internal_encoding); | 
| int charset_len = 0; | int charset_len = 0; | 
| long mode = 0; | long mode = 0; | 
| smart_str retval = {0}; | smart_str retval = {0}; | 
| php_iconv_err_t err; | php_iconv_err_t err; | 
| Line 2218 PHP_FUNCTION(iconv_mime_decode_headers) | Line 2286 PHP_FUNCTION(iconv_mime_decode_headers) | 
| char *charset = ICONVG(internal_encoding); | char *charset = ICONVG(internal_encoding); | 
| int charset_len = 0; | int charset_len = 0; | 
| long mode = 0; | long mode = 0; | 
| php_iconv_err_t err = PHP_ICONV_ERR_SUCCESS; | php_iconv_err_t err = PHP_ICONV_ERR_SUCCESS; | 
| if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ls", | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ls", | 
| Line 2286 PHP_FUNCTION(iconv_mime_decode_headers) | Line 2354 PHP_FUNCTION(iconv_mime_decode_headers) | 
| zend_hash_update(Z_ARRVAL_P(return_value), header_name, header_name_len, (void *)&new_elem, sizeof(new_elem), NULL); | zend_hash_update(Z_ARRVAL_P(return_value), header_name, header_name_len, (void *)&new_elem, sizeof(new_elem), NULL); | 
| elem = &new_elem; | elem = &new_elem; | 
| } | } | 
| add_next_index_stringl(*elem, header_value, header_value_len, 1); | add_next_index_stringl(*elem, header_value, header_value_len, 1); | 
| } else { | } else { | 
| add_assoc_stringl_ex(return_value, header_name, header_name_len, header_value, header_value_len, 1); | add_assoc_stringl_ex(return_value, header_name, header_name_len, header_value, header_value_len, 1); | 
| } | } | 
| } | } | 
| encoded_str_len -= next_pos - encoded_str; | encoded_str_len -= next_pos - encoded_str; | 
| encoded_str = next_pos; | encoded_str = next_pos; | 
| smart_str_free(&decoded_header); | smart_str_free(&decoded_header); | 
| } | } | 
| Line 2314 PHP_NAMED_FUNCTION(php_if_iconv) | Line 2382 PHP_NAMED_FUNCTION(php_if_iconv) | 
| size_t out_len; | size_t out_len; | 
| int in_charset_len = 0, out_charset_len = 0, in_buffer_len; | int in_charset_len = 0, out_charset_len = 0, in_buffer_len; | 
| php_iconv_err_t err; | php_iconv_err_t err; | 
| if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", | 
| &in_charset, &in_charset_len, &out_charset, &out_charset_len, &in_buffer, &in_buffer_len) == FAILURE) | &in_charset, &in_charset_len, &out_charset, &out_charset_len, &in_buffer, &in_buffer_len) == FAILURE) | 
| return; | return; | 
| Line 2326 PHP_NAMED_FUNCTION(php_if_iconv) | Line 2394 PHP_NAMED_FUNCTION(php_if_iconv) | 
| err = php_iconv_string(in_buffer, (size_t)in_buffer_len, | err = php_iconv_string(in_buffer, (size_t)in_buffer_len, | 
| &out_buffer, &out_len, out_charset, in_charset); | &out_buffer, &out_len, out_charset, in_charset); | 
| _php_iconv_show_error(err, out_charset, in_charset TSRMLS_CC); | _php_iconv_show_error(err, out_charset, in_charset TSRMLS_CC); | 
| if (out_buffer != NULL) { | if (err == PHP_ICONV_ERR_SUCCESS && out_buffer != NULL) { | 
| RETVAL_STRINGL(out_buffer, out_len, 0); | RETVAL_STRINGL(out_buffer, out_len, 0); | 
| } else { | } else { | 
| RETURN_FALSE; | |
| } | |
| } | |
| /* }}} */ | |
| /* {{{ proto string ob_iconv_handler(string contents, int status) | |
| Returns str in output buffer converted to the iconv.output_encoding character set */ | |
| PHP_FUNCTION(ob_iconv_handler) | |
| { | |
| char *out_buffer, *content_type, *mimetype = NULL, *s; | |
| zval *zv_string; | |
| size_t out_len; | |
| int mimetype_alloced = 0; | |
| long status; | |
| if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zl", &zv_string, &status) == FAILURE) | |
| return; | |
| convert_to_string(zv_string); | |
| if (SG(sapi_headers).mimetype && | |
| strncasecmp(SG(sapi_headers).mimetype, "text/", 5) == 0) { | |
| if ((s = strchr(SG(sapi_headers).mimetype,';')) == NULL){ | |
| mimetype = SG(sapi_headers).mimetype; | |
| } else { | |
| mimetype = estrndup(SG(sapi_headers).mimetype, s-SG(sapi_headers).mimetype); | |
| mimetype_alloced = 1; | |
| } | |
| } else if (SG(sapi_headers).send_default_content_type) { | |
| mimetype =(SG(default_mimetype) ? SG(default_mimetype) : SAPI_DEFAULT_MIMETYPE); | |
| } | |
| if (mimetype != NULL) { | |
| php_iconv_err_t err = php_iconv_string(Z_STRVAL_P(zv_string), | |
| Z_STRLEN_P(zv_string), &out_buffer, &out_len, | |
| ICONVG(output_encoding), ICONVG(internal_encoding)); | |
| _php_iconv_show_error(err, ICONVG(output_encoding), ICONVG(internal_encoding) TSRMLS_CC); | |
| if (out_buffer != NULL) { | if (out_buffer != NULL) { | 
| int len; | efree(out_buffer); | 
| char *p = strstr(ICONVG(output_encoding), "//"); | |
| if (p) { | |
| len = spprintf(&content_type, 0, "Content-Type:%s; charset=%.*s", mimetype, (int)(p - ICONVG(output_encoding)), ICONVG(output_encoding)); | |
| } else { | |
| len = spprintf(&content_type, 0, "Content-Type:%s; charset=%s", mimetype, ICONVG(output_encoding)); | |
| } | |
| if (content_type && sapi_add_header(content_type, len, 0) != FAILURE) { | |
| SG(sapi_headers).send_default_content_type = 0; | |
| } | |
| if (mimetype_alloced) { | |
| efree(mimetype); | |
| } | |
| RETURN_STRINGL(out_buffer, out_len, 0); | |
| } | } | 
| if (mimetype_alloced) { | RETURN_FALSE; | 
| efree(mimetype); | |
| } | |
| } | } | 
| zval_dtor(return_value); | |
| *return_value = *zv_string; | |
| zval_copy_ctor(return_value); | |
| } | } | 
| /* }}} */ | /* }}} */ | 
| Line 2521 static int php_iconv_stream_filter_append_bucket( | Line 2534 static int php_iconv_stream_filter_append_bucket( | 
| char *pd, *pt; | char *pd, *pt; | 
| size_t ocnt, prev_ocnt, icnt, tcnt; | size_t ocnt, prev_ocnt, icnt, tcnt; | 
| size_t initial_out_buf_size; | size_t initial_out_buf_size; | 
| if (ps == NULL) { | if (ps == NULL) { | 
| initial_out_buf_size = 64; | initial_out_buf_size = 64; | 
| icnt = 1; | icnt = 1; | 
| Line 2530 static int php_iconv_stream_filter_append_bucket( | Line 2543 static int php_iconv_stream_filter_append_bucket( | 
| icnt = buf_len; | icnt = buf_len; | 
| } | } | 
| out_buf_size = ocnt = prev_ocnt = initial_out_buf_size; | out_buf_size = ocnt = prev_ocnt = initial_out_buf_size; | 
| if (NULL == (out_buf = pemalloc(out_buf_size, persistent))) { | if (NULL == (out_buf = pemalloc(out_buf_size, persistent))) { | 
| return FAILURE; | return FAILURE; | 
| } | } | 
| Line 2817 static php_stream_filter *php_iconv_stream_filter_fact | Line 2830 static php_stream_filter *php_iconv_stream_filter_fact | 
| pefree(inst, persistent); | pefree(inst, persistent); | 
| } | } | 
| return retval; | return retval; | 
| } | } | 
| /* }}} */ | /* }}} */ |