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