Skip to content

Commit 1a011a6

Browse files
committed
ext/soap: Refactor to_zval_bool()
- Early return style - Improve logic to get rid of unnecessary comparisons and calls to stricmp() - Do not use convert_to_boolean API
1 parent 399cb4c commit 1a011a6

File tree

1 file changed

+32
-18
lines changed

1 file changed

+32
-18
lines changed

ext/soap/php_encoding.c

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,29 +1134,43 @@ static xmlNodePtr to_xml_double(encodeTypePtr type, zval *data, int style, xmlNo
11341134

11351135
static zval *to_zval_bool(zval *ret, encodeTypePtr type, xmlNodePtr data)
11361136
{
1137-
ZVAL_NULL(ret);
11381137
FIND_XML_NULL(data, ret);
11391138

1140-
if (data && data->children) {
1141-
if (data->children->type == XML_TEXT_NODE && data->children->next == NULL) {
1142-
whiteSpace_collapse(data->children->content);
1143-
if (stricmp((char*)data->children->content, "true") == 0 ||
1144-
stricmp((char*)data->children->content, "t") == 0 ||
1145-
strcmp((char*)data->children->content, "1") == 0) {
1146-
ZVAL_TRUE(ret);
1147-
} else if (stricmp((char*)data->children->content, "false") == 0 ||
1148-
stricmp((char*)data->children->content, "f") == 0 ||
1149-
strcmp((char*)data->children->content, "0") == 0) {
1139+
if (!data || !data->children) {
1140+
ZVAL_NULL(ret);
1141+
return ret;
1142+
}
1143+
if (data->children->type != XML_TEXT_NODE || data->children->next != NULL) {
1144+
// TODO Convert to exception?
1145+
soap_error0(E_ERROR, "Encoding: Violation of encoding rules");
1146+
}
1147+
1148+
whiteSpace_collapse(data->children->content);
1149+
size_t len = strlen((const char*)data->children->content);
1150+
if (len == 0) {
1151+
ZVAL_FALSE(ret);
1152+
} else if (len == 1) {
1153+
switch (data->children->content[0]) {
1154+
case 'f':
1155+
case 'F':
1156+
case '0':
11501157
ZVAL_FALSE(ret);
1151-
} else {
1152-
ZVAL_STRING(ret, (char*)data->children->content);
1153-
convert_to_boolean(ret);
1154-
}
1155-
} else {
1156-
soap_error0(E_ERROR, "Encoding: Violation of encoding rules");
1158+
break;
1159+
default:
1160+
ZVAL_TRUE(ret);
1161+
break;
11571162
}
1163+
} else if (
1164+
len == 5
1165+
&& (data->children->content[0] == 'f' || data->children->content[0] == 'F')
1166+
&& (data->children->content[1] == 'a' || data->children->content[1] == 'A')
1167+
&& (data->children->content[2] == 'l' || data->children->content[2] == 'L')
1168+
&& (data->children->content[3] == 's' || data->children->content[3] == 'S')
1169+
&& (data->children->content[4] == 'e' || data->children->content[4] == 'E')
1170+
) {
1171+
ZVAL_FALSE(ret);
11581172
} else {
1159-
ZVAL_NULL(ret);
1173+
ZVAL_TRUE(ret);
11601174
}
11611175
return ret;
11621176
}

0 commit comments

Comments
 (0)