diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-03-30 16:06:41 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-03-30 16:15:12 +0200 |
commit | 50d07ff28c9e91f310bf6145b657fccd17b09bec (patch) | |
tree | c212faee882b2fd805db7c36736fca7b67ea5ff9 /ext/mbstring/mbstring.c | |
parent | 47ddd95836142a5bea28abab26999e72d5f85493 (diff) | |
download | php-git-50d07ff28c9e91f310bf6145b657fccd17b09bec.tar.gz |
mb_detect_encoding(): Use proper array|string parameter
Needed to add support for nullabiltiy in some places.
Diffstat (limited to 'ext/mbstring/mbstring.c')
-rw-r--r-- | ext/mbstring/mbstring.c | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 1118200cd9..774e6adc7e 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2961,8 +2961,9 @@ PHP_FUNCTION(mb_detect_encoding) { char *str; size_t str_len; - zend_bool strict=0; - zval *encoding_list = NULL; + zend_string *encoding_str = NULL; + HashTable *encoding_ht = NULL; + zend_bool strict = 0; mbfl_string string; const mbfl_encoding *ret; @@ -2970,30 +2971,21 @@ PHP_FUNCTION(mb_detect_encoding) size_t size; zend_bool free_elist; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z!b", &str, &str_len, &encoding_list, &strict) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 3) + Z_PARAM_STRING(str, str_len) + Z_PARAM_OPTIONAL + Z_PARAM_STR_OR_ARRAY_HT_OR_NULL(encoding_str, encoding_ht) + Z_PARAM_BOOL(strict) + ZEND_PARSE_PARAMETERS_END(); /* make encoding list */ - if (encoding_list) { - switch (Z_TYPE_P(encoding_list)) { - case IS_ARRAY: - if (FAILURE == php_mb_parse_encoding_array(Z_ARRVAL_P(encoding_list), &elist, &size, 0)) { - RETURN_FALSE; - } - break; - default: - if (!try_convert_to_string(encoding_list)) { - RETURN_THROWS(); - } - if (FAILURE == php_mb_parse_encoding_list(Z_STRVAL_P(encoding_list), Z_STRLEN_P(encoding_list), &elist, &size, 0)) { - RETURN_FALSE; - } - break; + if (encoding_ht) { + if (FAILURE == php_mb_parse_encoding_array(encoding_ht, &elist, &size, 0)) { + RETURN_FALSE; } - if (size == 0) { - efree(elist); - php_error_docref(NULL, E_WARNING, "Must specify at least one encoding"); + free_elist = 1; + } else if (encoding_str) { + if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(encoding_str), ZSTR_LEN(encoding_str), &elist, &size, 0)) { RETURN_FALSE; } free_elist = 1; @@ -3003,11 +2995,16 @@ PHP_FUNCTION(mb_detect_encoding) free_elist = 0; } + if (size == 0) { + efree(elist); + php_error_docref(NULL, E_WARNING, "Must specify at least one encoding"); + RETURN_FALSE; + } + if (ZEND_NUM_ARGS() < 3) { strict = MBSTRG(strict_detection); } - mbfl_string_init(&string); string.no_language = MBSTRG(language); string.val = (unsigned char *)str; |