Skip to content

Commit 6d1fe6e

Browse files
committed
ext/mbstring: Refactor mb_get_info()
1 parent 6dcf882 commit 6d1fe6e

File tree

2 files changed

+77
-50
lines changed

2 files changed

+77
-50
lines changed

ext/mbstring/mbstring.c

Lines changed: 55 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4676,8 +4676,10 @@ PHP_FUNCTION(mb_get_info)
46764676
size_t n;
46774677
char *name;
46784678
zval row;
4679-
const mbfl_language *lang = mbfl_no2language(MBSTRG(language));
46804679
const mbfl_encoding **entry;
4680+
const mbfl_language *lang = mbfl_no2language(MBSTRG(language));
4681+
4682+
ZEND_ASSERT(lang);
46814683

46824684
ZEND_PARSE_PARAMETERS_START(0, 1)
46834685
Z_PARAM_OPTIONAL
@@ -4695,29 +4697,32 @@ PHP_FUNCTION(mb_get_info)
46954697
if (MBSTRG(current_http_output_encoding)) {
46964698
add_assoc_string(return_value, "http_output", (char *)MBSTRG(current_http_output_encoding)->name);
46974699
}
4698-
if ((name = (char *)zend_ini_string("mbstring.http_output_conv_mimetypes", sizeof("mbstring.http_output_conv_mimetypes") - 1, 0)) != NULL) {
4699-
add_assoc_string(return_value, "http_output_conv_mimetypes", name);
4700-
}
4701-
if (lang != NULL) {
4702-
if ((name = (char *)mbfl_no_encoding2name(lang->mail_charset)) != NULL) {
4703-
add_assoc_string(return_value, "mail_charset", name);
4704-
}
4705-
if ((name = (char *)mbfl_no_encoding2name(lang->mail_header_encoding)) != NULL) {
4706-
add_assoc_string(return_value, "mail_header_encoding", name);
4707-
}
4708-
if ((name = (char *)mbfl_no_encoding2name(lang->mail_body_encoding)) != NULL) {
4709-
add_assoc_string(return_value, "mail_body_encoding", name);
4710-
}
4711-
}
4700+
4701+
add_assoc_str(return_value, "http_output_conv_mimetypes",
4702+
zend_ini_str("mbstring.http_output_conv_mimetypes", sizeof("mbstring.http_output_conv_mimetypes") - 1, 0)
4703+
);
4704+
4705+
name = (char *)mbfl_no_encoding2name(lang->mail_charset);
4706+
add_assoc_string(return_value, "mail_charset", name);
4707+
4708+
name = (char *)mbfl_no_encoding2name(lang->mail_header_encoding);
4709+
add_assoc_string(return_value, "mail_header_encoding", name);
4710+
4711+
name = (char *)mbfl_no_encoding2name(lang->mail_body_encoding);
4712+
add_assoc_string(return_value, "mail_body_encoding", name);
4713+
47124714
add_assoc_long(return_value, "illegal_chars", MBSTRG(illegalchars));
4715+
47134716
if (MBSTRG(encoding_translation)) {
47144717
add_assoc_string(return_value, "encoding_translation", "On");
47154718
} else {
47164719
add_assoc_string(return_value, "encoding_translation", "Off");
47174720
}
4718-
if ((name = (char *)mbfl_no_language2name(MBSTRG(language))) != NULL) {
4719-
add_assoc_string(return_value, "language", name);
4720-
}
4721+
4722+
name = (char *)mbfl_no_language2name(MBSTRG(language));
4723+
add_assoc_string(return_value, "language", name);
4724+
4725+
// TODO Seems to always have one entry at least?
47214726
n = MBSTRG(current_detect_order_list_size);
47224727
entry = MBSTRG(current_detect_order_list);
47234728
if (n > 0) {
@@ -4744,46 +4749,46 @@ PHP_FUNCTION(mb_get_info)
47444749
add_assoc_string(return_value, "strict_detection", "Off");
47454750
}
47464751
} else if (zend_string_equals_literal_ci(type, "internal_encoding")) {
4747-
if (MBSTRG(current_internal_encoding)) {
4748-
RETVAL_STRING((char *)MBSTRG(current_internal_encoding)->name);
4749-
}
4752+
ZEND_ASSERT(MBSTRG(current_internal_encoding));
4753+
RETURN_STRING((char *)MBSTRG(current_internal_encoding)->name);
47504754
} else if (zend_string_equals_literal_ci(type, "http_input")) {
47514755
if (MBSTRG(http_input_identify)) {
4752-
RETVAL_STRING((char *)MBSTRG(http_input_identify)->name);
4756+
RETURN_STRING((char *)MBSTRG(http_input_identify)->name);
47534757
}
4758+
RETURN_NULL();
47544759
} else if (zend_string_equals_literal_ci(type, "http_output")) {
4755-
if (MBSTRG(current_http_output_encoding)) {
4756-
RETVAL_STRING((char *)MBSTRG(current_http_output_encoding)->name);
4757-
}
4760+
ZEND_ASSERT(MBSTRG(current_http_output_encoding));
4761+
RETURN_STRING((char *)MBSTRG(current_http_output_encoding)->name);
47584762
} else if (zend_string_equals_literal_ci(type, "http_output_conv_mimetypes")) {
4759-
if ((name = (char *)zend_ini_string("mbstring.http_output_conv_mimetypes", sizeof("mbstring.http_output_conv_mimetypes") - 1, 0)) != NULL) {
4760-
RETVAL_STRING(name);
4761-
}
4763+
RETURN_STR(
4764+
zend_ini_str(
4765+
"mbstring.http_output_conv_mimetypes",
4766+
sizeof("mbstring.http_output_conv_mimetypes") - 1,
4767+
false
4768+
)
4769+
);
47624770
} else if (zend_string_equals_literal_ci(type, "mail_charset")) {
4763-
if (lang != NULL && (name = (char *)mbfl_no_encoding2name(lang->mail_charset)) != NULL) {
4764-
RETVAL_STRING(name);
4765-
}
4771+
name = (char *)mbfl_no_encoding2name(lang->mail_charset);
4772+
RETURN_STRING(name);
47664773
} else if (zend_string_equals_literal_ci(type, "mail_header_encoding")) {
4767-
if (lang != NULL && (name = (char *)mbfl_no_encoding2name(lang->mail_header_encoding)) != NULL) {
4768-
RETVAL_STRING(name);
4769-
}
4774+
name = (char *)mbfl_no_encoding2name(lang->mail_header_encoding);
4775+
RETURN_STRING(name);
47704776
} else if (zend_string_equals_literal_ci(type, "mail_body_encoding")) {
4771-
if (lang != NULL && (name = (char *)mbfl_no_encoding2name(lang->mail_body_encoding)) != NULL) {
4772-
RETVAL_STRING(name);
4773-
}
4777+
name = (char *)mbfl_no_encoding2name(lang->mail_body_encoding);
4778+
RETURN_STRING(name);
47744779
} else if (zend_string_equals_literal_ci(type, "illegal_chars")) {
4775-
RETVAL_LONG(MBSTRG(illegalchars));
4780+
RETURN_LONG(MBSTRG(illegalchars));
47764781
} else if (zend_string_equals_literal_ci(type, "encoding_translation")) {
47774782
if (MBSTRG(encoding_translation)) {
4778-
RETVAL_STRING("On");
4783+
RETURN_STRING("On");
47794784
} else {
4780-
RETVAL_STRING("Off");
4785+
RETURN_STRING("Off");
47814786
}
47824787
} else if (zend_string_equals_literal_ci(type, "language")) {
4783-
if ((name = (char *)mbfl_no_language2name(MBSTRG(language))) != NULL) {
4784-
RETVAL_STRING(name);
4785-
}
4788+
name = (char *)mbfl_no_language2name(MBSTRG(language));
4789+
RETURN_STRING(name);
47864790
} else if (zend_string_equals_literal_ci(type, "detect_order")) {
4791+
// TODO Seems to always have one entry at least?
47874792
n = MBSTRG(current_detect_order_list_size);
47884793
entry = MBSTRG(current_detect_order_list);
47894794
if (n > 0) {
@@ -4796,22 +4801,22 @@ PHP_FUNCTION(mb_get_info)
47964801
}
47974802
} else if (zend_string_equals_literal_ci(type, "substitute_character")) {
47984803
if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {
4799-
RETVAL_STRING("none");
4804+
RETURN_STRING("none");
48004805
} else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG) {
4801-
RETVAL_STRING("long");
4806+
RETURN_STRING("long");
48024807
} else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY) {
4803-
RETVAL_STRING("entity");
4808+
RETURN_STRING("entity");
48044809
} else {
4805-
RETVAL_LONG(MBSTRG(current_filter_illegal_substchar));
4810+
RETURN_LONG(MBSTRG(current_filter_illegal_substchar));
48064811
}
48074812
} else if (zend_string_equals_literal_ci(type, "strict_detection")) {
48084813
if (MBSTRG(strict_detection)) {
4809-
RETVAL_STRING("On");
4814+
RETURN_STRING("On");
48104815
} else {
4811-
RETVAL_STRING("Off");
4816+
RETURN_STRING("Off");
48124817
}
48134818
} else {
4814-
// TODO Convert to ValueError
4819+
php_error_docref(NULL, E_WARNING, "argument #1 ($type) must be a valid type");
48154820
RETURN_FALSE;
48164821
}
48174822
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
mb_get_info() errors
3+
--EXTENSIONS--
4+
mbstring
5+
--INI--
6+
--FILE--
7+
<?php
8+
var_dump(mb_get_info("http_input"));
9+
var_dump(mb_get_info("detect_order"));
10+
var_dump(mb_get_info("non_sense"));
11+
?>
12+
--EXPECTF--
13+
NULL
14+
array(2) {
15+
[0]=>
16+
string(5) "ASCII"
17+
[1]=>
18+
string(5) "UTF-8"
19+
}
20+
21+
Warning: mb_get_info(): argument #1 ($type) must be a valid type in %s on line %d
22+
bool(false)

0 commit comments

Comments
 (0)