mirror of
https://github.com/php/php-src.git
synced 2025-08-21 01:45:16 +02:00
- New parameter parsing API (for mb_convert_variables())
This commit is contained in:
parent
252d7d76a8
commit
d79b879927
1 changed files with 18 additions and 25 deletions
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue