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