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