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