@@ -40,7 +40,7 @@ _qualify_namespace(XML_Parser parser, const xmlChar *name, const xmlChar *URI, x
40
40
/* Use libxml functions otherwise its memory deallocation is screwed up */
41
41
* qualified = xmlStrdup (URI );
42
42
* qualified = xmlStrncat (* qualified , parser -> _ns_seperator , 1 );
43
- * qualified = xmlStrncat (* qualified , name , strlen (name ));
43
+ * qualified = xmlStrncat (* qualified , name , xmlStrlen (name ));
44
44
} else {
45
45
* qualified = xmlStrdup (name );
46
46
}
@@ -104,7 +104,66 @@ _start_element_handler_ns(void *user, const xmlChar *name, const xmlChar *prefix
104
104
y = 0 ;
105
105
}
106
106
107
- if (parser -> h_start_element == NULL && parser -> h_default == NULL ) {
107
+ if (parser -> h_start_element == NULL ) {
108
+ if (parser -> h_default ) {
109
+
110
+ if (prefix ) {
111
+ qualified_name = xmlStrncatNew ((xmlChar * )"<" , prefix , xmlStrlen (prefix ));
112
+ qualified_name = xmlStrncat (qualified_name , (xmlChar * )":" , 1 );
113
+ qualified_name = xmlStrncat (qualified_name , name , xmlStrlen (name ));
114
+ } else {
115
+ qualified_name = xmlStrncatNew ((xmlChar * )"<" , name , xmlStrlen (name ));
116
+ }
117
+
118
+ if (namespaces ) {
119
+ int i , j ;
120
+ for (i = 0 ,j = 0 ;j < nb_namespaces ;j ++ ) {
121
+ int ns_len ;
122
+ char * ns_string , * ns_prefix , * ns_url ;
123
+
124
+ ns_prefix = (char * ) namespaces [i ++ ];
125
+ ns_url = (char * ) namespaces [i ++ ];
126
+
127
+ if (ns_prefix ) {
128
+ ns_len = spprintf (& ns_string , 0 , " xmlns:%s=\"%s\"" , ns_prefix , ns_url );
129
+ } else {
130
+ ns_len = spprintf (& ns_string , 0 , " xmlns=\"%s\"" , ns_url );
131
+ }
132
+ qualified_name = xmlStrncat (qualified_name , (xmlChar * )ns_string , ns_len );
133
+
134
+ efree (ns_string );
135
+ }
136
+ }
137
+
138
+ if (attributes ) {
139
+ for (i = 0 ; i < nb_attributes ; i += 1 ) {
140
+ int att_len ;
141
+ char * att_string , * att_name , * att_value , * att_prefix , * att_valueend ;
142
+
143
+ att_name = (char * ) attributes [y ++ ];
144
+ att_prefix = (char * )attributes [y ++ ];
145
+ y ++ ;
146
+ att_value = (char * )attributes [y ++ ];
147
+ att_valueend = (char * )attributes [y ++ ];
148
+
149
+ if (att_prefix ) {
150
+ att_len = spprintf (& att_string , 0 , " %s:%s=\"" , att_prefix , att_name );
151
+ } else {
152
+ att_len = spprintf (& att_string , 0 , " %s=\"" , att_name );
153
+ }
154
+
155
+ qualified_name = xmlStrncat (qualified_name , (xmlChar * )att_string , att_len );
156
+ qualified_name = xmlStrncat (qualified_name , (xmlChar * )att_value , att_valueend - att_value );
157
+ qualified_name = xmlStrncat (qualified_name , (xmlChar * )"\"" , 1 );
158
+
159
+ efree (att_string );
160
+ }
161
+
162
+ }
163
+ qualified_name = xmlStrncat (qualified_name , (xmlChar * )">" , 1 );
164
+ parser -> h_default (parser -> user , (const XML_Char * ) qualified_name , xmlStrlen (qualified_name ));
165
+ xmlFree (qualified_name );
166
+ }
108
167
return ;
109
168
}
110
169
_qualify_namespace (parser , name , URI , & qualified_name );
@@ -178,6 +237,18 @@ _end_element_handler_ns(void *user, const xmlChar *name, const xmlChar * prefix,
178
237
XML_Parser parser = (XML_Parser ) user ;
179
238
180
239
if (parser -> h_end_element == NULL ) {
240
+ if (parser -> h_default ) {
241
+ char * end_element ;
242
+ int end_element_len ;
243
+
244
+ if (prefix ) {
245
+ end_element_len = spprintf (& end_element , 0 , "</%s:%s>" , (char * ) prefix , (char * )name );
246
+ } else {
247
+ end_element_len = spprintf (& end_element , 0 , "</%s>" , (char * )name );
248
+ }
249
+ parser -> h_default (parser -> user , (const XML_Char * ) end_element , end_element_len );
250
+ efree (end_element );
251
+ }
181
252
return ;
182
253
}
183
254
@@ -212,7 +283,7 @@ _pi_handler(void *user, const xmlChar *target, const xmlChar *data)
212
283
if (parser -> h_default ) {
213
284
char * full_pi ;
214
285
spprintf (& full_pi , 0 , "<?%s %s?>" , (char * )target , (char * )data );
215
- parser -> h_default (parser -> user , (const XML_Char * ) full_pi , xmlStrlen (full_pi ));
286
+ parser -> h_default (parser -> user , (const XML_Char * ) full_pi , strlen (full_pi ));
216
287
efree (full_pi );
217
288
}
218
289
return ;
0 commit comments