@@ -85,7 +85,7 @@ static zval *xml_call_handler(xml_parser *, zval *, int, zval **);
85
85
static zval * _xml_xmlchar_zval (const XML_Char * , int , const XML_Char * );
86
86
static int _xml_xmlcharlen (const XML_Char * );
87
87
static void _xml_add_to_info (xml_parser * parser ,char * name );
88
-
88
+ inline static char * _xml_decode_tag ( xml_parser * parser , const char * tag );
89
89
90
90
void _xml_startElementHandler (void * , const char * , const char * * );
91
91
void _xml_endElementHandler (void * , const char * );
@@ -621,47 +621,55 @@ static void _xml_add_to_info(xml_parser *parser,char *name)
621
621
622
622
parser -> curtag ++ ;
623
623
}
624
+ /* }}} */
625
+ /* {{{ _xml_decode_tag() */
626
+
627
+ static char * _xml_decode_tag (xml_parser * parser , const char * tag )
628
+ {
629
+ char * newstr ;
630
+ int out_len ;
631
+
632
+ newstr = xml_utf8_decode (tag , strlen (tag ), & out_len , parser -> target_encoding );
633
+
634
+ if (parser -> case_folding ) {
635
+ php_strtoupper (newstr , out_len );
636
+ }
637
+
638
+ return newstr ;
639
+ }
624
640
625
641
/* }}} */
626
- /* {{{ _xml_startElementHandler() */
642
+ /* {{{ _xml_startElementHandler() */
627
643
628
- void _xml_startElementHandler (void * userData , const char * name ,
629
- const char * * attributes )
644
+ void _xml_startElementHandler (void * userData , const char * name , const char * * attributes )
630
645
{
631
646
xml_parser * parser = (xml_parser * )userData ;
632
647
const char * * attrs = attributes ;
648
+ char * tag_name ;
649
+ char * att , * val ;
650
+ int att_len , val_len ;
651
+ zval * retval , * args [3 ];
633
652
634
653
if (parser ) {
635
- zval * retval , * args [3 ];
636
-
637
654
parser -> level ++ ;
638
655
639
- if (parser -> case_folding ) {
640
- name = php_strtoupper (estrdup (name ), strlen (name ));
641
- }
656
+ tag_name = _xml_decode_tag (parser , name );
642
657
643
658
if (parser -> startElementHandler ) {
644
659
args [0 ] = _xml_resource_zval (parser -> index );
645
- args [1 ] = _xml_string_zval (name );
660
+ args [1 ] = _xml_string_zval (tag_name );
646
661
MAKE_STD_ZVAL (args [2 ]);
647
662
array_init (args [2 ]);
663
+
648
664
while (attributes && * attributes ) {
649
- char * key = (char * )attributes [0 ];
650
- char * value = (char * )attributes [1 ];
651
- char * decoded_value ;
652
- int decoded_len ;
653
- if (parser -> case_folding ) {
654
- key = php_strtoupper (estrdup (key ), strlen (key ));
655
- }
656
- decoded_value = xml_utf8_decode (value , strlen (value ),
657
- & decoded_len ,
658
- parser -> target_encoding );
659
-
660
- add_assoc_stringl (args [2 ], key , decoded_value , decoded_len , 0 );
661
- if (parser -> case_folding ) {
662
- efree (key );
663
- }
665
+ att = _xml_decode_tag (parser , attributes [0 ]);
666
+ val = xml_utf8_decode (attributes [1 ], strlen (attributes [1 ]), & val_len , parser -> target_encoding );
667
+
668
+ add_assoc_stringl (args [2 ], att , val , val_len , 0 );
669
+
664
670
attributes += 2 ;
671
+
672
+ efree (att );
665
673
}
666
674
667
675
if ((retval = xml_call_handler (parser , parser -> startElementHandler , 3 , args ))) {
@@ -680,34 +688,27 @@ void _xml_startElementHandler(void *userData, const char *name,
680
688
array_init (tag );
681
689
array_init (atr );
682
690
683
- _xml_add_to_info (parser ,((char * ) name ) + parser -> toffset );
691
+ _xml_add_to_info (parser ,((char * ) tag_name ) + parser -> toffset );
684
692
685
- add_assoc_string (tag ,"tag" ,((char * ) name ) + parser -> toffset ,1 ); /* cast to avoid gcc-warning */
693
+ add_assoc_string (tag ,"tag" ,((char * ) tag_name ) + parser -> toffset ,1 ); /* cast to avoid gcc-warning */
686
694
add_assoc_string (tag ,"type" ,"open" ,1 );
687
695
add_assoc_long (tag ,"level" ,parser -> level );
688
696
689
- parser -> ltags [parser -> level - 1 ] = estrdup (name );
697
+ parser -> ltags [parser -> level - 1 ] = estrdup (tag_name );
690
698
parser -> lastwasopen = 1 ;
691
699
692
700
attributes = attrs ;
701
+
693
702
while (attributes && * attributes ) {
694
- char * key = (char * )attributes [0 ];
695
- char * value = (char * )attributes [1 ];
696
- char * decoded_value ;
697
- int decoded_len ;
698
- if (parser -> case_folding ) {
699
- key = php_strtoupper (estrdup (key ), strlen (key ));
700
- }
701
- decoded_value = xml_utf8_decode (value , strlen (value ),
702
- & decoded_len ,
703
- parser -> target_encoding );
703
+ att = _xml_decode_tag (parser , attributes [0 ]);
704
+ val = xml_utf8_decode (attributes [1 ], strlen (attributes [1 ]), & val_len , parser -> target_encoding );
704
705
705
- add_assoc_stringl (atr ,key ,decoded_value ,decoded_len ,0 );
706
+ add_assoc_stringl (atr ,att ,val ,val_len ,0 );
707
+
706
708
atcnt ++ ;
707
- if (parser -> case_folding ) {
708
- efree (key );
709
- }
710
709
attributes += 2 ;
710
+
711
+ efree (att );
711
712
}
712
713
713
714
if (atcnt ) {
@@ -720,9 +721,7 @@ void _xml_startElementHandler(void *userData, const char *name,
720
721
zend_hash_next_index_insert (parser -> data -> value .ht ,& tag ,sizeof (zval * ),(void * ) & parser -> ctag );
721
722
}
722
723
723
- if (parser -> case_folding ) {
724
- efree ((char * )name );
725
- }
724
+ efree (tag_name );
726
725
}
727
726
}
728
727
@@ -732,17 +731,16 @@ void _xml_startElementHandler(void *userData, const char *name,
732
731
void _xml_endElementHandler (void * userData , const char * name )
733
732
{
734
733
xml_parser * parser = (xml_parser * )userData ;
734
+ char * tag_name ;
735
735
736
736
if (parser ) {
737
737
zval * retval , * args [2 ];
738
738
739
- if (parser -> case_folding ) {
740
- name = php_strtoupper (estrdup (name ), strlen (name ));
741
- }
739
+ tag_name = _xml_decode_tag (parser , name );
742
740
743
741
if (parser -> endElementHandler ) {
744
742
args [0 ] = _xml_resource_zval (parser -> index );
745
- args [1 ] = _xml_string_zval (name );
743
+ args [1 ] = _xml_string_zval (tag_name );
746
744
747
745
if ((retval = xml_call_handler (parser , parser -> endElementHandler , 2 , args ))) {
748
746
zval_dtor (retval );
@@ -760,9 +758,9 @@ void _xml_endElementHandler(void *userData, const char *name)
760
758
761
759
array_init (tag );
762
760
763
- _xml_add_to_info (parser ,((char * ) name ) + parser -> toffset );
761
+ _xml_add_to_info (parser ,((char * ) tag_name ) + parser -> toffset );
764
762
765
- add_assoc_string (tag ,"tag" ,((char * ) name ) + parser -> toffset ,1 ); /* cast to avoid gcc-warning */
763
+ add_assoc_string (tag ,"tag" ,((char * ) tag_name ) + parser -> toffset ,1 ); /* cast to avoid gcc-warning */
766
764
add_assoc_string (tag ,"type" ,"close" ,1 );
767
765
add_assoc_long (tag ,"level" ,parser -> level );
768
766
@@ -772,12 +770,12 @@ void _xml_endElementHandler(void *userData, const char *name)
772
770
parser -> lastwasopen = 0 ;
773
771
}
774
772
775
- if (parser -> case_folding ) {
776
- efree ((char * )name );
777
- }
773
+ efree (tag_name );
774
+
778
775
if (parser -> ltags ) {
779
776
efree (parser -> ltags [parser -> level - 1 ]);
780
777
}
778
+
781
779
parser -> level -- ;
782
780
}
783
781
}
0 commit comments