moriyoshi Fri Jan 3 00:32:13 2003 EDT Modified files: /php4/ext/iconv iconv.c Log: Give mo' shift-sequence awareness to iconv_mime_encode Index: php4/ext/iconv/iconv.c diff -u php4/ext/iconv/iconv.c:1.71 php4/ext/iconv/iconv.c:1.72 --- php4/ext/iconv/iconv.c:1.71 Fri Jan 3 00:28:25 2003 +++ php4/ext/iconv/iconv.c Fri Jan 3 00:32:13 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: iconv.c,v 1.71 2003/01/03 05:28:25 moriyoshi Exp $ */ +/* $Id: iconv.c,v 1.72 2003/01/03 05:32:13 moriyoshi Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -1022,7 +1022,7 @@ in_left = fval_nbytes; do { - size_t prev_in_left = in_left; + size_t prev_in_left; size_t out_size; if (char_cnt < (out_charset_len + 12)) { @@ -1041,39 +1041,84 @@ switch (enc_scheme) { case PHP_ICONV_ENC_SCHEME_BASE64: { + size_t ini_in_left; + const char *ini_in_p; + size_t out_reserved = 4; + smart_str_appendc(pretval, 'B'); char_cnt--; smart_str_appendc(pretval, '?'); char_cnt--; - out_p = buf; - out_left = out_size = (char_cnt - 2) / 4 * 3; + prev_in_left = ini_in_left = in_left; + ini_in_p = in_p; - if (icv(cd, &in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) { + out_size = (char_cnt - 2) / 4 * 3; + + for (;;) { + out_p = buf; + + if (out_size <= out_reserved) { + err = PHP_ICONV_ERR_TOO_BIG; + goto out; + } + + out_left = out_size - out_reserved; + + if (icv(cd, &in_p, &in_left, (char **) &out_p, +&out_left) == (size_t)-1) { #if ICONV_SUPPORTS_ERRNO - switch (errno) { - case EINVAL: - err = PHP_ICONV_ERR_ILLEGAL_CHAR; - goto out; + switch (errno) { + case EINVAL: + err = +PHP_ICONV_ERR_ILLEGAL_CHAR; + goto out; - case EILSEQ: - err = PHP_ICONV_ERR_ILLEGAL_SEQ; - goto out; + case EILSEQ: + err = +PHP_ICONV_ERR_ILLEGAL_SEQ; + goto out; - case E2BIG: - break; + case E2BIG: + break; - default: + default: + err = +PHP_ICONV_ERR_UNKNOWN; + goto out; + } +#else + if (prev_in_left == in_left) { err = PHP_ICONV_ERR_UNKNOWN; goto out; + } +#endif } + + out_left += out_reserved; + + if (icv(cd, NULL, NULL, (char **) &out_p, +&out_left) == (size_t)-1) { +#if ICONV_SUPPORTS_ERRNO + if (errno != E2BIG) { + err = PHP_ICONV_ERR_UNKNOWN; + goto out; + } #else - if (prev_in_left == in_left) { + if (out_left != 0) { + err = PHP_ICONV_ERR_UNKNOWN; + goto out; + } +#endif + } else { + break; + } + + if (icv(cd, NULL, NULL, NULL, NULL) == +(size_t)-1) { err = PHP_ICONV_ERR_UNKNOWN; goto out; } -#endif + + out_reserved += 4; + in_left = ini_in_left; + in_p = ini_in_p; } + prev_in_left = in_left; encoded = php_base64_encode(buf, (int)(out_size - out_left), &encoded_len); @@ -1090,15 +1135,6 @@ efree(encoded); encoded = NULL; - icv_close(cd); - - /* reconstruct the converter */ - cd = icv_open(out_charset, enc); - if (cd == (iconv_t)(-1)) { - err = PHP_ICONV_ERR_UNKNOWN; - goto out; - } - } break; /* case PHP_ICONV_ENC_SCHEME_BASE64: */ case PHP_ICONV_ENC_SCHEME_QPRINT: { @@ -1173,11 +1209,7 @@ smart_str_appendl(pretval, "?=", sizeof("?=") - 1); char_cnt -= 2; - icv_close(cd); - - /* reconstruct the converter */ - cd = icv_open(out_charset, enc); - if (cd == (iconv_t)(-1)) { + if (icv(cd, NULL, NULL, NULL, NULL) == (size_t)-1) { err = PHP_ICONV_ERR_UNKNOWN; goto out; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php