- New parameter parsing API (for mb_convert_variables())

This commit is contained in:
Felipe Pena 2008-08-18 00:37:16 +00:00
parent 252d7d76a8
commit d79b879927

View file

@ -3600,37 +3600,30 @@ PHP_FUNCTION(mb_convert_kana)
#define PHP_MBSTR_STACK_BLOCK_SIZE 32 #define PHP_MBSTR_STACK_BLOCK_SIZE 32
/* {{{ proto string mb_convert_variables(string to-encoding, mixed from-encoding [, mixed ...]) /* {{{ proto string mb_convert_variables(string to-encoding, mixed from-encoding, mixed vars [, ...])
Converts the string resource in variables to desired encoding */ Converts the string resource in variables to desired encoding */
PHP_FUNCTION(mb_convert_variables) PHP_FUNCTION(mb_convert_variables)
{ {
zval ***args, ***stack, **var, **hash_entry; zval ***args, ***stack, **var, **hash_entry, **zfrom_enc;
HashTable *target_hash; HashTable *target_hash;
mbfl_string string, result, *ret; mbfl_string string, result, *ret;
enum mbfl_no_encoding from_encoding, to_encoding; enum mbfl_no_encoding from_encoding, to_encoding;
mbfl_encoding_detector *identd; mbfl_encoding_detector *identd;
mbfl_buffer_converter *convd; mbfl_buffer_converter *convd;
int n, argc, stack_level, stack_max, elistsz; int n, to_enc_len, argc, stack_level, stack_max, elistsz;
enum mbfl_no_encoding *elist; enum mbfl_no_encoding *elist;
char *name; char *name, *to_enc;
void *ptmp; void *ptmp;
argc = ZEND_NUM_ARGS(); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sZ+", &to_enc, &to_enc_len, &zfrom_enc, &args, &argc) == FAILURE) {
if (argc < 3) { return;
WRONG_PARAM_COUNT;
}
args = (zval ***)ecalloc(argc, sizeof(zval **));
if (zend_get_parameters_array_ex(argc, args) == FAILURE) {
efree((void *)args);
WRONG_PARAM_COUNT;
} }
/* new encoding */ /* new encoding */
convert_to_string_ex(args[0]); to_encoding = mbfl_name2no_encoding(to_enc);
to_encoding = mbfl_name2no_encoding(Z_STRVAL_PP(args[0]));
if (to_encoding == mbfl_no_encoding_invalid) { if (to_encoding == mbfl_no_encoding_invalid) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", Z_STRVAL_PP(args[0])); php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", to_enc);
efree((void *)args); efree(args);
RETURN_FALSE; RETURN_FALSE;
} }
@ -3644,13 +3637,13 @@ PHP_FUNCTION(mb_convert_variables)
/* pre-conversion encoding */ /* pre-conversion encoding */
elist = NULL; elist = NULL;
elistsz = 0; elistsz = 0;
switch (Z_TYPE_PP(args[1])) { switch (Z_TYPE_PP(zfrom_enc)) {
case IS_ARRAY: case IS_ARRAY:
php_mb_parse_encoding_array(*args[1], &elist, &elistsz, 0 TSRMLS_CC); php_mb_parse_encoding_array(*zfrom_enc, &elist, &elistsz, 0 TSRMLS_CC);
break; break;
default: default:
convert_to_string_ex(args[1]); convert_to_string_ex(zfrom_enc);
php_mb_parse_encoding_list(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1]), &elist, &elistsz, 0 TSRMLS_CC); php_mb_parse_encoding_list(Z_STRVAL_PP(zfrom_enc), Z_STRLEN_PP(zfrom_enc), &elist, &elistsz, 0 TSRMLS_CC);
break; break;
} }
if (elistsz <= 0) { if (elistsz <= 0) {
@ -3665,7 +3658,7 @@ PHP_FUNCTION(mb_convert_variables)
stack_level = 0; stack_level = 0;
identd = mbfl_encoding_detector_new(elist, elistsz, MBSTRG(strict_detection)); identd = mbfl_encoding_detector_new(elist, elistsz, MBSTRG(strict_detection));
if (identd != NULL) { if (identd != NULL) {
n = 2; n = 0;
while (n < argc || stack_level > 0) { while (n < argc || stack_level > 0) {
if (stack_level <= 0) { if (stack_level <= 0) {
var = args[n++]; var = args[n++];
@ -3746,7 +3739,7 @@ detect_end:
stack_max = PHP_MBSTR_STACK_BLOCK_SIZE; stack_max = PHP_MBSTR_STACK_BLOCK_SIZE;
stack = (zval ***)safe_emalloc(stack_max, sizeof(zval **), 0); stack = (zval ***)safe_emalloc(stack_max, sizeof(zval **), 0);
stack_level = 0; stack_level = 0;
n = 2; n = 0;
while (n < argc || stack_level > 0) { while (n < argc || stack_level > 0) {
if (stack_level <= 0) { if (stack_level <= 0) {
var = args[n++]; var = args[n++];
@ -3812,7 +3805,7 @@ detect_end:
mbfl_buffer_converter_delete(convd); mbfl_buffer_converter_delete(convd);
} }
efree((void *)args); efree(args);
name = (char *)mbfl_no_encoding2name(from_encoding); name = (char *)mbfl_no_encoding2name(from_encoding);
if (name != NULL) { if (name != NULL) {