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 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 45 extern "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 */ 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 const XML_Char *id_name; 92 AttrInfo *attributes; 93 } ElementInfo; 94 95 typedef struct StructParserAndElementInfo { 96 XML_Parser parser; 97 ElementInfo *info; 98 } ParserAndElementInfo; 99 100 extern void XMLCALL counting_start_element_handler(void *userData, 101 const XML_Char *name, 102 const XML_Char **atts); 103 104 extern void XMLCALL suspending_end_handler(void *userData, const XML_Char *s); 105 106 extern void XMLCALL start_element_suspender(void *userData, 107 const XML_Char *name, 108 const XML_Char **atts); 109 110 extern int g_triplet_start_flag; 111 extern int g_triplet_end_flag; 112 113 extern void XMLCALL triplet_start_checker(void *userData, const XML_Char *name, 114 const XML_Char **atts); 115 116 extern void XMLCALL triplet_end_checker(void *userData, const XML_Char *name); 117 118 extern void XMLCALL overwrite_start_checker(void *userData, 119 const XML_Char *name, 120 const XML_Char **atts); 121 122 extern void XMLCALL overwrite_end_checker(void *userData, const XML_Char *name); 123 124 extern void XMLCALL start_element_fail(void *userData, const XML_Char *name, 125 const XML_Char **atts); 126 127 extern void XMLCALL start_ns_clearing_start_element(void *userData, 128 const XML_Char *prefix, 129 const XML_Char *uri); 130 131 typedef struct { 132 XML_Parser parser; 133 int deep; 134 } DataIssue240; 135 136 extern void XMLCALL start_element_issue_240(void *userData, 137 const XML_Char *name, 138 const XML_Char **atts); 139 140 extern void XMLCALL end_element_issue_240(void *userData, const XML_Char *name); 141 142 /* Text encoding handlers */ 143 144 extern int XMLCALL UnknownEncodingHandler(void *data, const XML_Char *encoding, 145 XML_Encoding *info); 146 147 extern int XMLCALL UnrecognisedEncodingHandler(void *data, 148 const XML_Char *encoding, 149 XML_Encoding *info); 150 151 extern int XMLCALL unknown_released_encoding_handler(void *data, 152 const XML_Char *encoding, 153 XML_Encoding *info); 154 155 extern int XMLCALL MiscEncodingHandler(void *data, const XML_Char *encoding, 156 XML_Encoding *info); 157 158 extern int XMLCALL long_encoding_handler(void *userData, 159 const XML_Char *encoding, 160 XML_Encoding *info); 161 162 extern int XMLCALL user_data_checking_unknown_encoding_handler( 163 void *userData, const XML_Char *encoding, XML_Encoding *info); 164 165 /* External Entity Handlers */ 166 167 typedef struct ExtOption { 168 const XML_Char *system_id; 169 const char *parse_text; 170 } ExtOption; 171 172 extern int XMLCALL external_entity_optioner(XML_Parser parser, 173 const XML_Char *context, 174 const XML_Char *base, 175 const XML_Char *systemId, 176 const XML_Char *publicId); 177 178 extern int XMLCALL external_entity_loader(XML_Parser parser, 179 const XML_Char *context, 180 const XML_Char *base, 181 const XML_Char *systemId, 182 const XML_Char *publicId); 183 184 typedef struct ext_faults { 185 const char *parse_text; 186 const char *fail_text; 187 const XML_Char *encoding; 188 enum XML_Error error; 189 } ExtFaults; 190 191 extern int XMLCALL external_entity_faulter(XML_Parser parser, 192 const XML_Char *context, 193 const XML_Char *base, 194 const XML_Char *systemId, 195 const XML_Char *publicId); 196 extern int XMLCALL external_entity_failer__if_not_xml_ge( 197 XML_Parser parser, const XML_Char *context, const XML_Char *base, 198 const XML_Char *systemId, const XML_Char *publicId); 199 extern int XMLCALL external_entity_null_loader(XML_Parser parser, 200 const XML_Char *context, 201 const XML_Char *base, 202 const XML_Char *systemId, 203 const XML_Char *publicId); 204 205 extern int XMLCALL external_entity_resetter(XML_Parser parser, 206 const XML_Char *context, 207 const XML_Char *base, 208 const XML_Char *systemId, 209 const XML_Char *publicId); 210 211 extern int XMLCALL external_entity_suspender(XML_Parser parser, 212 const XML_Char *context, 213 const XML_Char *base, 214 const XML_Char *systemId, 215 const XML_Char *publicId); 216 217 extern int XMLCALL external_entity_suspend_xmldecl(XML_Parser parser, 218 const XML_Char *context, 219 const XML_Char *base, 220 const XML_Char *systemId, 221 const XML_Char *publicId); 222 223 extern int XMLCALL external_entity_suspending_faulter(XML_Parser parser, 224 const XML_Char *context, 225 const XML_Char *base, 226 const XML_Char *systemId, 227 const XML_Char *publicId); 228 229 extern int XMLCALL external_entity_cr_catcher(XML_Parser parser, 230 const XML_Char *context, 231 const XML_Char *base, 232 const XML_Char *systemId, 233 const XML_Char *publicId); 234 235 extern int XMLCALL external_entity_bad_cr_catcher(XML_Parser parser, 236 const XML_Char *context, 237 const XML_Char *base, 238 const XML_Char *systemId, 239 const XML_Char *publicId); 240 241 extern int XMLCALL external_entity_rsqb_catcher(XML_Parser parser, 242 const XML_Char *context, 243 const XML_Char *base, 244 const XML_Char *systemId, 245 const XML_Char *publicId); 246 247 extern int XMLCALL external_entity_good_cdata_ascii(XML_Parser parser, 248 const XML_Char *context, 249 const XML_Char *base, 250 const XML_Char *systemId, 251 const XML_Char *publicId); 252 253 /* Entity declaration handlers */ 254 255 extern void XMLCALL entity_suspending_decl_handler(void *userData, 256 const XML_Char *name, 257 XML_Content *model); 258 259 extern void XMLCALL entity_suspending_xdecl_handler(void *userData, 260 const XML_Char *version, 261 const XML_Char *encoding, 262 int standalone); 263 264 extern int XMLCALL external_entity_param_checker(XML_Parser parser, 265 const XML_Char *context, 266 const XML_Char *base, 267 const XML_Char *systemId, 268 const XML_Char *publicId); 269 270 extern int XMLCALL external_entity_ref_param_checker(XML_Parser parameter, 271 const XML_Char *context, 272 const XML_Char *base, 273 const XML_Char *systemId, 274 const XML_Char *publicId); 275 276 extern int XMLCALL external_entity_param(XML_Parser parser, 277 const XML_Char *context, 278 const XML_Char *base, 279 const XML_Char *systemId, 280 const XML_Char *publicId); 281 282 extern int XMLCALL external_entity_load_ignore(XML_Parser parser, 283 const XML_Char *context, 284 const XML_Char *base, 285 const XML_Char *systemId, 286 const XML_Char *publicId); 287 288 extern int XMLCALL external_entity_load_ignore_utf16(XML_Parser parser, 289 const XML_Char *context, 290 const XML_Char *base, 291 const XML_Char *systemId, 292 const XML_Char *publicId); 293 294 extern int XMLCALL external_entity_load_ignore_utf16_be( 295 XML_Parser parser, const XML_Char *context, const XML_Char *base, 296 const XML_Char *systemId, const XML_Char *publicId); 297 298 extern int XMLCALL external_entity_valuer(XML_Parser parser, 299 const XML_Char *context, 300 const XML_Char *base, 301 const XML_Char *systemId, 302 const XML_Char *publicId); 303 304 extern int XMLCALL external_entity_not_standalone(XML_Parser parser, 305 const XML_Char *context, 306 const XML_Char *base, 307 const XML_Char *systemId, 308 const XML_Char *publicId); 309 310 extern int XMLCALL external_entity_value_aborter(XML_Parser parser, 311 const XML_Char *context, 312 const XML_Char *base, 313 const XML_Char *systemId, 314 const XML_Char *publicId); 315 316 extern int XMLCALL external_entity_public(XML_Parser parser, 317 const XML_Char *context, 318 const XML_Char *base, 319 const XML_Char *systemId, 320 const XML_Char *publicId); 321 322 extern int XMLCALL external_entity_devaluer(XML_Parser parser, 323 const XML_Char *context, 324 const XML_Char *base, 325 const XML_Char *systemId, 326 const XML_Char *publicId); 327 328 typedef struct ext_hdlr_data { 329 const char *parse_text; 330 XML_ExternalEntityRefHandler handler; 331 CharData *storage; 332 } ExtHdlrData; 333 334 extern int XMLCALL external_entity_oneshot_loader(XML_Parser parser, 335 const XML_Char *context, 336 const XML_Char *base, 337 const XML_Char *systemId, 338 const XML_Char *publicId); 339 340 typedef struct ExtTest2 { 341 const char *parse_text; 342 int parse_len; 343 const XML_Char *encoding; 344 CharData *storage; 345 } ExtTest2; 346 347 extern int XMLCALL external_entity_loader2(XML_Parser parser, 348 const XML_Char *context, 349 const XML_Char *base, 350 const XML_Char *systemId, 351 const XML_Char *publicId); 352 353 typedef struct ExtFaults2 { 354 const char *parse_text; 355 int parse_len; 356 const char *fail_text; 357 const XML_Char *encoding; 358 enum XML_Error error; 359 } ExtFaults2; 360 361 extern int XMLCALL external_entity_faulter2(XML_Parser parser, 362 const XML_Char *context, 363 const XML_Char *base, 364 const XML_Char *systemId, 365 const XML_Char *publicId); 366 367 extern int XMLCALL external_entity_unfinished_attlist(XML_Parser parser, 368 const XML_Char *context, 369 const XML_Char *base, 370 const XML_Char *systemId, 371 const XML_Char *publicId); 372 373 extern int XMLCALL external_entity_handler(XML_Parser parser, 374 const XML_Char *context, 375 const XML_Char *base, 376 const XML_Char *systemId, 377 const XML_Char *publicId); 378 379 extern int XMLCALL external_entity_duff_loader(XML_Parser parser, 380 const XML_Char *context, 381 const XML_Char *base, 382 const XML_Char *systemId, 383 const XML_Char *publicId); 384 385 extern int XMLCALL external_entity_dbl_handler(XML_Parser parser, 386 const XML_Char *context, 387 const XML_Char *base, 388 const XML_Char *systemId, 389 const XML_Char *publicId); 390 391 extern int XMLCALL external_entity_dbl_handler_2(XML_Parser parser, 392 const XML_Char *context, 393 const XML_Char *base, 394 const XML_Char *systemId, 395 const XML_Char *publicId); 396 397 extern int XMLCALL external_entity_alloc_set_encoding(XML_Parser parser, 398 const XML_Char *context, 399 const XML_Char *base, 400 const XML_Char *systemId, 401 const XML_Char *publicId); 402 403 extern int XMLCALL external_entity_reallocator(XML_Parser parser, 404 const XML_Char *context, 405 const XML_Char *base, 406 const XML_Char *systemId, 407 const XML_Char *publicId); 408 409 extern int XMLCALL external_entity_alloc(XML_Parser parser, 410 const XML_Char *context, 411 const XML_Char *base, 412 const XML_Char *systemId, 413 const XML_Char *publicId); 414 415 extern int XMLCALL external_entity_parser_create_alloc_fail_handler( 416 XML_Parser parser, const XML_Char *context, const XML_Char *base, 417 const XML_Char *systemId, const XML_Char *publicId); 418 419 struct AccountingTestCase { 420 const char *primaryText; 421 const char *firstExternalText; /* often NULL */ 422 const char *secondExternalText; /* often NULL */ 423 const unsigned long long expectedCountBytesIndirectExtra; 424 }; 425 426 extern int accounting_external_entity_ref_handler(XML_Parser parser, 427 const XML_Char *context, 428 const XML_Char *base, 429 const XML_Char *systemId, 430 const XML_Char *publicId); 431 432 /* NotStandalone handlers */ 433 434 extern int XMLCALL reject_not_standalone_handler(void *userData); 435 436 extern int XMLCALL accept_not_standalone_handler(void *userData); 437 438 /* Attribute List handlers */ 439 440 typedef struct AttTest { 441 const char *definition; 442 const XML_Char *element_name; 443 const XML_Char *attr_name; 444 const XML_Char *attr_type; 445 const XML_Char *default_value; 446 int is_required; 447 } AttTest; 448 449 extern void XMLCALL verify_attlist_decl_handler( 450 void *userData, const XML_Char *element_name, const XML_Char *attr_name, 451 const XML_Char *attr_type, const XML_Char *default_value, int is_required); 452 453 /* Character data handlers */ 454 455 extern void XMLCALL clearing_aborting_character_handler(void *userData, 456 const XML_Char *s, 457 int len); 458 459 extern void XMLCALL parser_stop_character_handler(void *userData, 460 const XML_Char *s, int len); 461 462 extern void XMLCALL cr_cdata_handler(void *userData, const XML_Char *s, 463 int len); 464 465 extern void XMLCALL rsqb_handler(void *userData, const XML_Char *s, int len); 466 467 typedef struct ByteTestData { 468 int start_element_len; 469 int cdata_len; 470 int total_string_len; 471 } ByteTestData; 472 473 extern void XMLCALL byte_character_handler(void *userData, const XML_Char *s, 474 int len); 475 476 extern void XMLCALL ext2_accumulate_characters(void *userData, 477 const XML_Char *s, int len); 478 479 /* Handlers that record their `len` arg and a single identifying character */ 480 481 struct handler_record_entry { 482 const char *name; 483 int arg; 484 }; 485 struct handler_record_list { 486 int count; 487 struct handler_record_entry entries[50]; // arbitrary big-enough max count 488 }; 489 490 extern void XMLCALL record_default_handler(void *userData, const XML_Char *s, 491 int len); 492 493 extern void XMLCALL record_cdata_handler(void *userData, const XML_Char *s, 494 int len); 495 496 extern void XMLCALL record_cdata_nodefault_handler(void *userData, 497 const XML_Char *s, int len); 498 499 extern void XMLCALL record_skip_handler(void *userData, 500 const XML_Char *entityName, 501 int is_parameter_entity); 502 503 extern void XMLCALL record_element_start_handler(void *userData, 504 const XML_Char *name, 505 const XML_Char **atts); 506 507 extern void XMLCALL record_element_end_handler(void *userData, 508 const XML_Char *name); 509 510 extern const struct handler_record_entry * 511 _handler_record_get(const struct handler_record_list *storage, int index, 512 const char *file, int line); 513 514 # define handler_record_get(storage, index) \ 515 _handler_record_get((storage), (index), __FILE__, __LINE__) 516 517 # define assert_record_handler_called(storage, index, expected_name, \ 518 expected_arg) \ 519 do { \ 520 const struct handler_record_entry *e \ 521 = 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 #endif /* XML_HANDLERS_H */ 615 616 #ifdef __cplusplus 617 } 618 #endif 619