@@ -781,72 +781,77 @@ void _xml_characterDataHandler(void *userData, const XML_Char *s, int len)
781
781
zend_string * decoded_value ;
782
782
783
783
decoded_value = xml_utf8_decode (s , len , parser -> target_encoding );
784
- for (i = 0 ; i < ZSTR_LEN (decoded_value ); i ++ ) {
785
- switch (ZSTR_VAL (decoded_value )[i ]) {
786
- case ' ' :
787
- case '\t' :
788
- case '\n' :
789
- continue ;
790
- default :
791
- doprint = 1 ;
784
+ if (parser -> skipwhite ) {
785
+ for (i = 0 ; i < ZSTR_LEN (decoded_value ); i ++ ) {
786
+ switch (ZSTR_VAL (decoded_value )[i ]) {
787
+ case ' ' :
788
+ case '\t' :
789
+ case '\n' :
790
+ continue ;
791
+ default :
792
+ doprint = 1 ;
793
+ break ;
794
+ }
795
+ if (doprint ) {
792
796
break ;
793
- }
794
- if (doprint ) {
795
- break ;
797
+ }
796
798
}
797
799
}
798
- if (doprint || (! parser -> skipwhite )) {
799
- if (parser -> lastwasopen ) {
800
- zval * myval ;
801
-
802
- /* check if the current tag already has a value - if yes append to that! */
803
- if ((myval = zend_hash_str_find (Z_ARRVAL_P (parser -> ctag ), "value" , sizeof ("value" ) - 1 ))) {
804
- int newlen = Z_STRLEN_P (myval ) + ZSTR_LEN (decoded_value );
805
- Z_STR_P (myval ) = zend_string_extend (Z_STR_P (myval ), newlen , 0 );
806
- strncpy (Z_STRVAL_P (myval ) + Z_STRLEN_P (myval ) - ZSTR_LEN (decoded_value ),
807
- ZSTR_VAL (decoded_value ), ZSTR_LEN (decoded_value ) + 1 );
808
- zend_string_release_ex (decoded_value , 0 );
809
- } else {
800
+
801
+ if (parser -> lastwasopen ) {
802
+ zval * myval ;
803
+
804
+ /* check if the current tag already has a value - if yes append to that! */
805
+ if ((myval = zend_hash_str_find (Z_ARRVAL_P (parser -> ctag ), "value" , sizeof ("value" ) - 1 ))) {
806
+ size_t newlen = Z_STRLEN_P (myval ) + ZSTR_LEN (decoded_value );
807
+ Z_STR_P (myval ) = zend_string_extend (Z_STR_P (myval ), newlen , 0 );
808
+ strncpy (Z_STRVAL_P (myval ) + Z_STRLEN_P (myval ) - ZSTR_LEN (decoded_value ),
809
+ ZSTR_VAL (decoded_value ), ZSTR_LEN (decoded_value ) + 1 );
810
+ zend_string_release_ex (decoded_value , 0 );
811
+ } else {
812
+ if (doprint || (! parser -> skipwhite )) {
810
813
add_assoc_str (parser -> ctag , "value" , decoded_value );
814
+ } else {
815
+ zend_string_release_ex (decoded_value , 0 );
811
816
}
817
+ }
812
818
813
- } else {
814
- zval tag ;
815
- zval * curtag , * mytype , * myval ;
816
-
817
- ZEND_HASH_REVERSE_FOREACH_VAL (Z_ARRVAL (parser -> data ), curtag ) {
818
- if ((mytype = zend_hash_str_find (Z_ARRVAL_P (curtag ),"type" , sizeof ("type" ) - 1 ))) {
819
- if (!strcmp (Z_STRVAL_P (mytype ), "cdata" )) {
820
- if ((myval = zend_hash_str_find (Z_ARRVAL_P (curtag ), "value" , sizeof ("value" ) - 1 ))) {
821
- int newlen = Z_STRLEN_P (myval ) + ZSTR_LEN (decoded_value );
822
- Z_STR_P (myval ) = zend_string_extend (Z_STR_P (myval ), newlen , 0 );
823
- strncpy (Z_STRVAL_P (myval ) + Z_STRLEN_P (myval ) - ZSTR_LEN (decoded_value ),
824
- ZSTR_VAL (decoded_value ), ZSTR_LEN (decoded_value ) + 1 );
825
- zend_string_release_ex (decoded_value , 0 );
826
- return ;
827
- }
819
+ } else {
820
+ zval tag ;
821
+ zval * curtag , * mytype , * myval ;
822
+
823
+ ZEND_HASH_REVERSE_FOREACH_VAL (Z_ARRVAL (parser -> data ), curtag ) {
824
+ if ((mytype = zend_hash_str_find (Z_ARRVAL_P (curtag ),"type" , sizeof ("type" ) - 1 ))) {
825
+ if (!strcmp (Z_STRVAL_P (mytype ), "cdata" )) {
826
+ if ((myval = zend_hash_str_find (Z_ARRVAL_P (curtag ), "value" , sizeof ("value" ) - 1 ))) {
827
+ size_t newlen = Z_STRLEN_P (myval ) + ZSTR_LEN (decoded_value );
828
+ Z_STR_P (myval ) = zend_string_extend (Z_STR_P (myval ), newlen , 0 );
829
+ strncpy (Z_STRVAL_P (myval ) + Z_STRLEN_P (myval ) - ZSTR_LEN (decoded_value ),
830
+ ZSTR_VAL (decoded_value ), ZSTR_LEN (decoded_value ) + 1 );
831
+ zend_string_release_ex (decoded_value , 0 );
832
+ return ;
828
833
}
829
834
}
830
- break ;
831
- } ZEND_HASH_FOREACH_END ();
835
+ }
836
+ break ;
837
+ } ZEND_HASH_FOREACH_END ();
832
838
833
- if (parser -> level <= XML_MAXLEVEL && parser -> level > 0 ) {
834
- array_init (& tag );
839
+ if (parser -> level <= XML_MAXLEVEL && parser -> level > 0 && ( doprint || (! parser -> skipwhite )) ) {
840
+ array_init (& tag );
835
841
836
- _xml_add_to_info (parser ,SKIP_TAGSTART (parser -> ltags [parser -> level - 1 ]));
842
+ _xml_add_to_info (parser ,SKIP_TAGSTART (parser -> ltags [parser -> level - 1 ]));
837
843
838
- add_assoc_string (& tag , "tag" , SKIP_TAGSTART (parser -> ltags [parser -> level - 1 ]));
839
- add_assoc_str (& tag , "value" , decoded_value );
840
- add_assoc_string (& tag , "type" , "cdata" );
841
- add_assoc_long (& tag , "level" , parser -> level );
844
+ add_assoc_string (& tag , "tag" , SKIP_TAGSTART (parser -> ltags [parser -> level - 1 ]));
845
+ add_assoc_str (& tag , "value" , decoded_value );
846
+ add_assoc_string (& tag , "type" , "cdata" );
847
+ add_assoc_long (& tag , "level" , parser -> level );
842
848
843
- zend_hash_next_index_insert (Z_ARRVAL (parser -> data ), & tag );
844
- } else if (parser -> level == (XML_MAXLEVEL + 1 )) {
845
- php_error_docref (NULL , E_WARNING , "Maximum depth exceeded - Results truncated" );
846
- }
849
+ zend_hash_next_index_insert (Z_ARRVAL (parser -> data ), & tag );
850
+ } else if (parser -> level == (XML_MAXLEVEL + 1 )) {
851
+ php_error_docref (NULL , E_WARNING , "Maximum depth exceeded - Results truncated" );
852
+ } else {
853
+ zend_string_release_ex (decoded_value , 0 );
847
854
}
848
- } else {
849
- zend_string_release_ex (decoded_value , 0 );
850
855
}
851
856
}
852
857
}
0 commit comments