@@ -1134,29 +1134,43 @@ static xmlNodePtr to_xml_double(encodeTypePtr type, zval *data, int style, xmlNo
11341134
11351135static 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