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