• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* XML handler functions for the Expat test suite
2                             __  __            _
3                          ___\ \/ /_ __   __ _| |_
4                         / _ \\  /| '_ \ / _` | __|
5                        |  __//  \| |_) | (_| | |_
6                         \___/_/\_\ .__/ \__,_|\__|
7                                  |_| XML parser
8 
9    Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
10    Copyright (c) 2003      Greg Stein <gstein@users.sourceforge.net>
11    Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
12    Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
13    Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
14    Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
15    Copyright (c) 2017      Joe Orton <jorton@redhat.com>
16    Copyright (c) 2017      José Gutiérrez de la Concha <jose@zeroc.com>
17    Copyright (c) 2018      Marco Maggi <marco.maggi-ipsu@poste.it>
18    Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
19    Copyright (c) 2020      Tim Gates <tim.gates@iress.com>
20    Copyright (c) 2021      Donghee Na <donghee.na@python.org>
21    Copyright (c) 2023      Sony Corporation / Snild Dolkow <snild@sony.com>
22    Licensed under the MIT license:
23 
24    Permission is  hereby granted,  free of charge,  to any  person obtaining
25    a  copy  of  this  software   and  associated  documentation  files  (the
26    "Software"),  to  deal in  the  Software  without restriction,  including
27    without  limitation the  rights  to use,  copy,  modify, merge,  publish,
28    distribute, sublicense, and/or sell copies of the Software, and to permit
29    persons  to whom  the Software  is  furnished to  do so,  subject to  the
30    following conditions:
31 
32    The above copyright  notice and this permission notice  shall be included
33    in all copies or substantial portions of the Software.
34 
35    THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
36    EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
37    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
38    NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
39    DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
40    OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
41    USE OR OTHER DEALINGS IN THE SOFTWARE.
42 */
43 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
48 #ifndef XML_HANDLERS_H
49 #  define XML_HANDLERS_H
50 
51 #  include "expat_config.h"
52 
53 #  include "expat.h"
54 
55 /* Variable holding the expected handler userData */
56 extern const void *g_handler_data;
57 /* Count of the number of times the comment handler has been invoked */
58 extern int g_comment_count;
59 /* Count of the number of skipped entities */
60 extern int g_skip_count;
61 /* Count of the number of times the XML declaration handler is invoked */
62 extern int g_xdecl_count;
63 
64 /* Start/End Element Handlers */
65 
66 extern void XMLCALL start_element_event_handler(void *userData,
67                                                 const XML_Char *name,
68                                                 const XML_Char **atts);
69 
70 extern void XMLCALL end_element_event_handler(void *userData,
71                                               const XML_Char *name);
72 
73 #  define STRUCT_START_TAG 0
74 #  define STRUCT_END_TAG 1
75 
76 extern void XMLCALL start_element_event_handler2(void *userData,
77                                                  const XML_Char *name,
78                                                  const XML_Char **attr);
79 
80 extern void XMLCALL end_element_event_handler2(void *userData,
81                                                const XML_Char *name);
82 
83 typedef struct attrInfo {
84   const XML_Char *name;
85   const XML_Char *value;
86 } AttrInfo;
87 
88 typedef struct elementInfo {
89   const XML_Char *name;
90   int attr_count;
91   const XML_Char *id_name;
92   AttrInfo *attributes;
93 } ElementInfo;
94 
95 extern void XMLCALL counting_start_element_handler(void *userData,
96                                                    const XML_Char *name,
97                                                    const XML_Char **atts);
98 
99 extern void XMLCALL suspending_end_handler(void *userData, const XML_Char *s);
100 
101 extern void XMLCALL start_element_suspender(void *userData,
102                                             const XML_Char *name,
103                                             const XML_Char **atts);
104 
105 extern int g_triplet_start_flag;
106 extern int g_triplet_end_flag;
107 
108 extern void XMLCALL triplet_start_checker(void *userData, const XML_Char *name,
109                                           const XML_Char **atts);
110 
111 extern void XMLCALL triplet_end_checker(void *userData, const XML_Char *name);
112 
113 extern void XMLCALL overwrite_start_checker(void *userData,
114                                             const XML_Char *name,
115                                             const XML_Char **atts);
116 
117 extern void XMLCALL overwrite_end_checker(void *userData, const XML_Char *name);
118 
119 extern void XMLCALL start_element_fail(void *userData, const XML_Char *name,
120                                        const XML_Char **atts);
121 
122 extern void XMLCALL start_ns_clearing_start_element(void *userData,
123                                                     const XML_Char *prefix,
124                                                     const XML_Char *uri);
125 
126 typedef struct {
127   XML_Parser parser;
128   int deep;
129 } DataIssue240;
130 
131 extern void XMLCALL start_element_issue_240(void *userData,
132                                             const XML_Char *name,
133                                             const XML_Char **atts);
134 
135 extern void XMLCALL end_element_issue_240(void *userData, const XML_Char *name);
136 
137 /* Text encoding handlers */
138 
139 extern int XMLCALL UnknownEncodingHandler(void *data, const XML_Char *encoding,
140                                           XML_Encoding *info);
141 
142 extern int XMLCALL UnrecognisedEncodingHandler(void *data,
143                                                const XML_Char *encoding,
144                                                XML_Encoding *info);
145 
146 extern int XMLCALL unknown_released_encoding_handler(void *data,
147                                                      const XML_Char *encoding,
148                                                      XML_Encoding *info);
149 
150 extern int XMLCALL MiscEncodingHandler(void *data, const XML_Char *encoding,
151                                        XML_Encoding *info);
152 
153 extern int XMLCALL long_encoding_handler(void *userData,
154                                          const XML_Char *encoding,
155                                          XML_Encoding *info);
156 
157 /* External Entity Handlers */
158 
159 typedef struct ExtOption {
160   const XML_Char *system_id;
161   const char *parse_text;
162 } ExtOption;
163 
164 extern int XMLCALL external_entity_optioner(XML_Parser parser,
165                                             const XML_Char *context,
166                                             const XML_Char *base,
167                                             const XML_Char *systemId,
168                                             const XML_Char *publicId);
169 
170 extern int XMLCALL external_entity_loader(XML_Parser parser,
171                                           const XML_Char *context,
172                                           const XML_Char *base,
173                                           const XML_Char *systemId,
174                                           const XML_Char *publicId);
175 
176 typedef struct ext_faults {
177   const char *parse_text;
178   const char *fail_text;
179   const XML_Char *encoding;
180   enum XML_Error error;
181 } ExtFaults;
182 
183 extern int XMLCALL external_entity_faulter(XML_Parser parser,
184                                            const XML_Char *context,
185                                            const XML_Char *base,
186                                            const XML_Char *systemId,
187                                            const XML_Char *publicId);
188 extern int XMLCALL external_entity_failer__if_not_xml_ge(
189     XML_Parser parser, const XML_Char *context, const XML_Char *base,
190     const XML_Char *systemId, const XML_Char *publicId);
191 extern int XMLCALL external_entity_null_loader(XML_Parser parser,
192                                                const XML_Char *context,
193                                                const XML_Char *base,
194                                                const XML_Char *systemId,
195                                                const XML_Char *publicId);
196 
197 extern int XMLCALL external_entity_resetter(XML_Parser parser,
198                                             const XML_Char *context,
199                                             const XML_Char *base,
200                                             const XML_Char *systemId,
201                                             const XML_Char *publicId);
202 
203 extern int XMLCALL external_entity_suspender(XML_Parser parser,
204                                              const XML_Char *context,
205                                              const XML_Char *base,
206                                              const XML_Char *systemId,
207                                              const XML_Char *publicId);
208 
209 extern int XMLCALL external_entity_suspend_xmldecl(XML_Parser parser,
210                                                    const XML_Char *context,
211                                                    const XML_Char *base,
212                                                    const XML_Char *systemId,
213                                                    const XML_Char *publicId);
214 
215 extern int XMLCALL external_entity_suspending_faulter(XML_Parser parser,
216                                                       const XML_Char *context,
217                                                       const XML_Char *base,
218                                                       const XML_Char *systemId,
219                                                       const XML_Char *publicId);
220 
221 extern int XMLCALL external_entity_cr_catcher(XML_Parser parser,
222                                               const XML_Char *context,
223                                               const XML_Char *base,
224                                               const XML_Char *systemId,
225                                               const XML_Char *publicId);
226 
227 extern int XMLCALL external_entity_bad_cr_catcher(XML_Parser parser,
228                                                   const XML_Char *context,
229                                                   const XML_Char *base,
230                                                   const XML_Char *systemId,
231                                                   const XML_Char *publicId);
232 
233 extern int XMLCALL external_entity_rsqb_catcher(XML_Parser parser,
234                                                 const XML_Char *context,
235                                                 const XML_Char *base,
236                                                 const XML_Char *systemId,
237                                                 const XML_Char *publicId);
238 
239 extern int XMLCALL external_entity_good_cdata_ascii(XML_Parser parser,
240                                                     const XML_Char *context,
241                                                     const XML_Char *base,
242                                                     const XML_Char *systemId,
243                                                     const XML_Char *publicId);
244 
245 /* Entity declaration handlers */
246 
247 extern void XMLCALL entity_suspending_decl_handler(void *userData,
248                                                    const XML_Char *name,
249                                                    XML_Content *model);
250 
251 extern void XMLCALL entity_suspending_xdecl_handler(void *userData,
252                                                     const XML_Char *version,
253                                                     const XML_Char *encoding,
254                                                     int standalone);
255 
256 extern int XMLCALL external_entity_param_checker(XML_Parser parser,
257                                                  const XML_Char *context,
258                                                  const XML_Char *base,
259                                                  const XML_Char *systemId,
260                                                  const XML_Char *publicId);
261 
262 extern int XMLCALL external_entity_ref_param_checker(XML_Parser parameter,
263                                                      const XML_Char *context,
264                                                      const XML_Char *base,
265                                                      const XML_Char *systemId,
266                                                      const XML_Char *publicId);
267 
268 extern int XMLCALL external_entity_param(XML_Parser parser,
269                                          const XML_Char *context,
270                                          const XML_Char *base,
271                                          const XML_Char *systemId,
272                                          const XML_Char *publicId);
273 
274 extern int XMLCALL external_entity_load_ignore(XML_Parser parser,
275                                                const XML_Char *context,
276                                                const XML_Char *base,
277                                                const XML_Char *systemId,
278                                                const XML_Char *publicId);
279 
280 extern int XMLCALL external_entity_load_ignore_utf16(XML_Parser parser,
281                                                      const XML_Char *context,
282                                                      const XML_Char *base,
283                                                      const XML_Char *systemId,
284                                                      const XML_Char *publicId);
285 
286 extern int XMLCALL external_entity_load_ignore_utf16_be(
287     XML_Parser parser, const XML_Char *context, const XML_Char *base,
288     const XML_Char *systemId, const XML_Char *publicId);
289 
290 extern int XMLCALL external_entity_valuer(XML_Parser parser,
291                                           const XML_Char *context,
292                                           const XML_Char *base,
293                                           const XML_Char *systemId,
294                                           const XML_Char *publicId);
295 
296 extern int XMLCALL external_entity_not_standalone(XML_Parser parser,
297                                                   const XML_Char *context,
298                                                   const XML_Char *base,
299                                                   const XML_Char *systemId,
300                                                   const XML_Char *publicId);
301 
302 extern int XMLCALL external_entity_value_aborter(XML_Parser parser,
303                                                  const XML_Char *context,
304                                                  const XML_Char *base,
305                                                  const XML_Char *systemId,
306                                                  const XML_Char *publicId);
307 
308 extern int XMLCALL external_entity_public(XML_Parser parser,
309                                           const XML_Char *context,
310                                           const XML_Char *base,
311                                           const XML_Char *systemId,
312                                           const XML_Char *publicId);
313 
314 extern int XMLCALL external_entity_devaluer(XML_Parser parser,
315                                             const XML_Char *context,
316                                             const XML_Char *base,
317                                             const XML_Char *systemId,
318                                             const XML_Char *publicId);
319 
320 typedef struct ext_hdlr_data {
321   const char *parse_text;
322   XML_ExternalEntityRefHandler handler;
323   CharData *storage;
324 } ExtHdlrData;
325 
326 extern int XMLCALL external_entity_oneshot_loader(XML_Parser parser,
327                                                   const XML_Char *context,
328                                                   const XML_Char *base,
329                                                   const XML_Char *systemId,
330                                                   const XML_Char *publicId);
331 
332 typedef struct ExtTest2 {
333   const char *parse_text;
334   int parse_len;
335   const XML_Char *encoding;
336   CharData *storage;
337 } ExtTest2;
338 
339 extern int XMLCALL external_entity_loader2(XML_Parser parser,
340                                            const XML_Char *context,
341                                            const XML_Char *base,
342                                            const XML_Char *systemId,
343                                            const XML_Char *publicId);
344 
345 typedef struct ExtFaults2 {
346   const char *parse_text;
347   int parse_len;
348   const char *fail_text;
349   const XML_Char *encoding;
350   enum XML_Error error;
351 } ExtFaults2;
352 
353 extern int XMLCALL external_entity_faulter2(XML_Parser parser,
354                                             const XML_Char *context,
355                                             const XML_Char *base,
356                                             const XML_Char *systemId,
357                                             const XML_Char *publicId);
358 
359 extern int XMLCALL external_entity_unfinished_attlist(XML_Parser parser,
360                                                       const XML_Char *context,
361                                                       const XML_Char *base,
362                                                       const XML_Char *systemId,
363                                                       const XML_Char *publicId);
364 
365 extern int XMLCALL external_entity_handler(XML_Parser parser,
366                                            const XML_Char *context,
367                                            const XML_Char *base,
368                                            const XML_Char *systemId,
369                                            const XML_Char *publicId);
370 
371 extern int XMLCALL external_entity_duff_loader(XML_Parser parser,
372                                                const XML_Char *context,
373                                                const XML_Char *base,
374                                                const XML_Char *systemId,
375                                                const XML_Char *publicId);
376 
377 extern int XMLCALL external_entity_dbl_handler(XML_Parser parser,
378                                                const XML_Char *context,
379                                                const XML_Char *base,
380                                                const XML_Char *systemId,
381                                                const XML_Char *publicId);
382 
383 extern int XMLCALL external_entity_dbl_handler_2(XML_Parser parser,
384                                                  const XML_Char *context,
385                                                  const XML_Char *base,
386                                                  const XML_Char *systemId,
387                                                  const XML_Char *publicId);
388 
389 extern int XMLCALL external_entity_alloc_set_encoding(XML_Parser parser,
390                                                       const XML_Char *context,
391                                                       const XML_Char *base,
392                                                       const XML_Char *systemId,
393                                                       const XML_Char *publicId);
394 
395 extern int XMLCALL external_entity_reallocator(XML_Parser parser,
396                                                const XML_Char *context,
397                                                const XML_Char *base,
398                                                const XML_Char *systemId,
399                                                const XML_Char *publicId);
400 
401 extern int XMLCALL external_entity_alloc(XML_Parser parser,
402                                          const XML_Char *context,
403                                          const XML_Char *base,
404                                          const XML_Char *systemId,
405                                          const XML_Char *publicId);
406 
407 extern int XMLCALL external_entity_parser_create_alloc_fail_handler(
408     XML_Parser parser, const XML_Char *context, const XML_Char *base,
409     const XML_Char *systemId, const XML_Char *publicId);
410 
411 struct AccountingTestCase {
412   const char *primaryText;
413   const char *firstExternalText;  /* often NULL */
414   const char *secondExternalText; /* often NULL */
415   const unsigned long long expectedCountBytesIndirectExtra;
416 };
417 
418 extern int accounting_external_entity_ref_handler(XML_Parser parser,
419                                                   const XML_Char *context,
420                                                   const XML_Char *base,
421                                                   const XML_Char *systemId,
422                                                   const XML_Char *publicId);
423 
424 /* NotStandalone handlers */
425 
426 extern int XMLCALL reject_not_standalone_handler(void *userData);
427 
428 extern int XMLCALL accept_not_standalone_handler(void *userData);
429 
430 /* Attribute List handlers */
431 
432 typedef struct AttTest {
433   const char *definition;
434   const XML_Char *element_name;
435   const XML_Char *attr_name;
436   const XML_Char *attr_type;
437   const XML_Char *default_value;
438   int is_required;
439 } AttTest;
440 
441 extern void XMLCALL verify_attlist_decl_handler(
442     void *userData, const XML_Char *element_name, const XML_Char *attr_name,
443     const XML_Char *attr_type, const XML_Char *default_value, int is_required);
444 
445 /* Character data handlers */
446 
447 extern void XMLCALL clearing_aborting_character_handler(void *userData,
448                                                         const XML_Char *s,
449                                                         int len);
450 
451 extern void XMLCALL parser_stop_character_handler(void *userData,
452                                                   const XML_Char *s, int len);
453 
454 extern void XMLCALL cr_cdata_handler(void *userData, const XML_Char *s,
455                                      int len);
456 
457 extern void XMLCALL rsqb_handler(void *userData, const XML_Char *s, int len);
458 
459 typedef struct ByteTestData {
460   int start_element_len;
461   int cdata_len;
462   int total_string_len;
463 } ByteTestData;
464 
465 extern void XMLCALL byte_character_handler(void *userData, const XML_Char *s,
466                                            int len);
467 
468 extern void XMLCALL ext2_accumulate_characters(void *userData,
469                                                const XML_Char *s, int len);
470 
471 /* Handlers that record their `len` arg and a single identifying character */
472 
473 struct handler_record_entry {
474   const char *name;
475   int arg;
476 };
477 struct handler_record_list {
478   int count;
479   struct handler_record_entry entries[50]; // arbitrary big-enough max count
480 };
481 
482 extern void XMLCALL record_default_handler(void *userData, const XML_Char *s,
483                                            int len);
484 
485 extern void XMLCALL record_cdata_handler(void *userData, const XML_Char *s,
486                                          int len);
487 
488 extern void XMLCALL record_cdata_nodefault_handler(void *userData,
489                                                    const XML_Char *s, int len);
490 
491 extern void XMLCALL record_skip_handler(void *userData,
492                                         const XML_Char *entityName,
493                                         int is_parameter_entity);
494 
495 extern void XMLCALL record_element_start_handler(void *userData,
496                                                  const XML_Char *name,
497                                                  const XML_Char **atts);
498 
499 extern void XMLCALL record_element_end_handler(void *userData,
500                                                const XML_Char *name);
501 
502 extern const struct handler_record_entry *
503 _handler_record_get(const struct handler_record_list *storage, int index,
504                     const char *file, int line);
505 
506 #  define handler_record_get(storage, index)                                   \
507     _handler_record_get((storage), (index), __FILE__, __LINE__)
508 
509 #  define assert_record_handler_called(storage, index, expected_name,          \
510                                        expected_arg)                           \
511     do {                                                                       \
512       const struct handler_record_entry *e                                     \
513           = handler_record_get(storage, index);                                \
514       assert_true(strcmp(e->name, expected_name) == 0);                        \
515       assert_true(e->arg == (expected_arg));                                   \
516     } while (0)
517 
518 /* Entity Declaration Handlers */
519 #  define ENTITY_MATCH_FAIL (-1)
520 #  define ENTITY_MATCH_NOT_FOUND (0)
521 #  define ENTITY_MATCH_SUCCESS (1)
522 
523 extern void XMLCALL param_entity_match_handler(
524     void *userData, const XML_Char *entityName, int is_parameter_entity,
525     const XML_Char *value, int value_length, const XML_Char *base,
526     const XML_Char *systemId, const XML_Char *publicId,
527     const XML_Char *notationName);
528 
529 extern void param_entity_match_init(const XML_Char *name,
530                                     const XML_Char *value);
531 
532 extern int get_param_entity_match_flag(void);
533 
534 /* Misc handlers */
535 
536 extern void XMLCALL xml_decl_handler(void *userData, const XML_Char *version,
537                                      const XML_Char *encoding, int standalone);
538 
539 extern void XMLCALL param_check_skip_handler(void *userData,
540                                              const XML_Char *entityName,
541                                              int is_parameter_entity);
542 
543 extern void XMLCALL data_check_comment_handler(void *userData,
544                                                const XML_Char *data);
545 
546 extern void XMLCALL selective_aborting_default_handler(void *userData,
547                                                        const XML_Char *s,
548                                                        int len);
549 
550 extern void XMLCALL suspending_comment_handler(void *userData,
551                                                const XML_Char *data);
552 
553 extern void XMLCALL element_decl_suspender(void *userData, const XML_Char *name,
554                                            XML_Content *model);
555 
556 extern void XMLCALL accumulate_pi_characters(void *userData,
557                                              const XML_Char *target,
558                                              const XML_Char *data);
559 
560 extern void XMLCALL accumulate_comment(void *userData, const XML_Char *data);
561 
562 extern void XMLCALL accumulate_entity_decl(
563     void *userData, const XML_Char *entityName, int is_parameter_entity,
564     const XML_Char *value, int value_length, const XML_Char *base,
565     const XML_Char *systemId, const XML_Char *publicId,
566     const XML_Char *notationName);
567 
568 extern void XMLCALL accumulate_char_data_and_suspend(void *userData,
569                                                      const XML_Char *s,
570                                                      int len);
571 
572 extern void XMLCALL accumulate_char_data(void *userData, const XML_Char *s,
573                                          int len);
574 
575 extern void XMLCALL accumulate_start_element(void *userData,
576                                              const XML_Char *name,
577                                              const XML_Char **atts);
578 
579 typedef struct default_check {
580   const XML_Char *expected;
581   const int expectedLen;
582   XML_Bool seen;
583 } DefaultCheck;
584 
585 void XMLCALL checking_default_handler(void *userData, const XML_Char *s,
586                                       int len);
587 
588 typedef struct {
589   XML_Parser parser;
590   CharData *storage;
591 } ParserPlusStorage;
592 
593 extern void XMLCALL
594 accumulate_and_suspend_comment_handler(void *userData, const XML_Char *data);
595 
596 #endif /* XML_HANDLERS_H */
597 
598 #ifdef __cplusplus
599 }
600 #endif
601