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