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