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