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