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