1 /* 2 * globals.c: definition and handling of the set of global variables 3 * of the library 4 * 5 * The bottom of this file is automatically generated by build_glob.py 6 * based on the description file global.data 7 * 8 * See Copyright for the status of this software. 9 * 10 * Gary Pennington <Gary.Pennington@uk.sun.com> 11 * daniel@veillard.com 12 */ 13 14 #define IN_LIBXML 15 #include "libxml.h" 16 17 #ifdef HAVE_STDLIB_H 18 #include <stdlib.h> 19 #endif 20 #include <string.h> 21 22 #include <libxml/globals.h> 23 #include <libxml/xmlmemory.h> 24 #include <libxml/threads.h> 25 26 /* #define DEBUG_GLOBALS */ 27 28 /* 29 * Helpful Macro 30 */ 31 #ifdef LIBXML_THREAD_ENABLED 32 #define IS_MAIN_THREAD (xmlIsMainThread()) 33 #else 34 #define IS_MAIN_THREAD 1 35 #endif 36 37 /* 38 * Mutex to protect "ForNewThreads" variables 39 */ 40 static xmlMutexPtr xmlThrDefMutex = NULL; 41 42 /** 43 * xmlInitGlobals: 44 * 45 * Additional initialisation for multi-threading 46 */ 47 void xmlInitGlobals(void) 48 { 49 if (xmlThrDefMutex == NULL) 50 xmlThrDefMutex = xmlNewMutex(); 51 } 52 53 /** 54 * xmlCleanupGlobals: 55 * 56 * Additional cleanup for multi-threading 57 */ 58 void xmlCleanupGlobals(void) 59 { 60 if (xmlThrDefMutex != NULL) { 61 xmlFreeMutex(xmlThrDefMutex); 62 xmlThrDefMutex = NULL; 63 } 64 __xmlGlobalInitMutexDestroy(); 65 } 66 67 /************************************************************************ 68 * * 69 * All the user accessible global variables of the library * 70 * * 71 ************************************************************************/ 72 73 /* 74 * Memory allocation routines 75 */ 76 #undef xmlFree 77 #undef xmlMalloc 78 #undef xmlMallocAtomic 79 #undef xmlMemStrdup 80 #undef xmlRealloc 81 82 #if defined(DEBUG_MEMORY_LOCATION) || defined(DEBUG_MEMORY) 83 xmlFreeFunc xmlFree = (xmlFreeFunc) xmlMemFree; 84 xmlMallocFunc xmlMalloc = (xmlMallocFunc) xmlMemMalloc; 85 xmlMallocFunc xmlMallocAtomic = (xmlMallocFunc) xmlMemMalloc; 86 xmlReallocFunc xmlRealloc = (xmlReallocFunc) xmlMemRealloc; 87 xmlStrdupFunc xmlMemStrdup = (xmlStrdupFunc) xmlMemoryStrdup; 88 #else 89 /** 90 * xmlFree: 91 * @mem: an already allocated block of memory 92 * 93 * The variable holding the libxml free() implementation 94 */ 95 xmlFreeFunc xmlFree = free; 96 /** 97 * xmlMalloc: 98 * @size: the size requested in bytes 99 * 100 * The variable holding the libxml malloc() implementation 101 * 102 * Returns a pointer to the newly allocated block or NULL in case of error 103 */ 104 xmlMallocFunc xmlMalloc = malloc; 105 /** 106 * xmlMallocAtomic: 107 * @size: the size requested in bytes 108 * 109 * The variable holding the libxml malloc() implementation for atomic 110 * data (i.e. blocks not containing pointers), useful when using a 111 * garbage collecting allocator. 112 * 113 * Returns a pointer to the newly allocated block or NULL in case of error 114 */ 115 xmlMallocFunc xmlMallocAtomic = malloc; 116 /** 117 * xmlRealloc: 118 * @mem: an already allocated block of memory 119 * @size: the new size requested in bytes 120 * 121 * The variable holding the libxml realloc() implementation 122 * 123 * Returns a pointer to the newly reallocated block or NULL in case of error 124 */ 125 xmlReallocFunc xmlRealloc = realloc; 126 /** 127 * xmlPosixStrdup 128 * @cur: the input char * 129 * 130 * a strdup implementation with a type signature matching POSIX 131 * 132 * Returns a new xmlChar * or NULL 133 */ 134 static char * 135 xmlPosixStrdup(const char *cur) { 136 return((char*) xmlCharStrdup(cur)); 137 } 138 /** 139 * xmlMemStrdup: 140 * @str: a zero terminated string 141 * 142 * The variable holding the libxml strdup() implementation 143 * 144 * Returns the copy of the string or NULL in case of error 145 */ 146 xmlStrdupFunc xmlMemStrdup = xmlPosixStrdup; 147 #endif /* DEBUG_MEMORY_LOCATION || DEBUG_MEMORY */ 148 149 #include <libxml/threads.h> 150 #include <libxml/globals.h> 151 #include <libxml/SAX.h> 152 153 #undef docbDefaultSAXHandler 154 #undef htmlDefaultSAXHandler 155 #undef oldXMLWDcompatibility 156 #undef xmlBufferAllocScheme 157 #undef xmlDefaultBufferSize 158 #undef xmlDefaultSAXHandler 159 #undef xmlDefaultSAXLocator 160 #undef xmlDoValidityCheckingDefaultValue 161 #undef xmlGenericError 162 #undef xmlStructuredError 163 #undef xmlGenericErrorContext 164 #undef xmlStructuredErrorContext 165 #undef xmlGetWarningsDefaultValue 166 #undef xmlIndentTreeOutput 167 #undef xmlTreeIndentString 168 #undef xmlKeepBlanksDefaultValue 169 #undef xmlLineNumbersDefaultValue 170 #undef xmlLoadExtDtdDefaultValue 171 #undef xmlParserDebugEntities 172 #undef xmlParserVersion 173 #undef xmlPedanticParserDefaultValue 174 #undef xmlSaveNoEmptyTags 175 #undef xmlSubstituteEntitiesDefaultValue 176 #undef xmlRegisterNodeDefaultValue 177 #undef xmlDeregisterNodeDefaultValue 178 #undef xmlLastError 179 180 #undef xmlParserInputBufferCreateFilenameValue 181 #undef xmlOutputBufferCreateFilenameValue 182 /** 183 * xmlParserVersion: 184 * 185 * Constant string describing the internal version of the library 186 */ 187 const char *xmlParserVersion = LIBXML_VERSION_STRING LIBXML_VERSION_EXTRA; 188 189 /** 190 * xmlBufferAllocScheme: 191 * 192 * Global setting, default allocation policy for buffers, default is 193 * XML_BUFFER_ALLOC_EXACT 194 */ 195 xmlBufferAllocationScheme xmlBufferAllocScheme = XML_BUFFER_ALLOC_EXACT; 196 static xmlBufferAllocationScheme xmlBufferAllocSchemeThrDef = XML_BUFFER_ALLOC_EXACT; 197 /** 198 * xmlDefaultBufferSize: 199 * 200 * Global setting, default buffer size. Default value is BASE_BUFFER_SIZE 201 */ 202 int xmlDefaultBufferSize = BASE_BUFFER_SIZE; 203 static int xmlDefaultBufferSizeThrDef = BASE_BUFFER_SIZE; 204 205 /* 206 * Parser defaults 207 */ 208 209 /** 210 * oldXMLWDcompatibility: 211 * 212 * Global setting, DEPRECATED. 213 */ 214 int oldXMLWDcompatibility = 0; /* DEPRECATED */ 215 /** 216 * xmlParserDebugEntities: 217 * 218 * Global setting, asking the parser to print out debugging informations. 219 * while handling entities. 220 * Disabled by default 221 */ 222 int xmlParserDebugEntities = 0; 223 static int xmlParserDebugEntitiesThrDef = 0; 224 /** 225 * xmlDoValidityCheckingDefaultValue: 226 * 227 * Global setting, indicate that the parser should work in validating mode. 228 * Disabled by default. 229 */ 230 int xmlDoValidityCheckingDefaultValue = 0; 231 static int xmlDoValidityCheckingDefaultValueThrDef = 0; 232 /** 233 * xmlGetWarningsDefaultValue: 234 * 235 * Global setting, indicate that the parser should provide warnings. 236 * Activated by default. 237 */ 238 int xmlGetWarningsDefaultValue = 1; 239 static int xmlGetWarningsDefaultValueThrDef = 1; 240 /** 241 * xmlLoadExtDtdDefaultValue: 242 * 243 * Global setting, indicate that the parser should load DTD while not 244 * validating. 245 * Disabled by default. 246 */ 247 int xmlLoadExtDtdDefaultValue = 0; 248 static int xmlLoadExtDtdDefaultValueThrDef = 0; 249 /** 250 * xmlPedanticParserDefaultValue: 251 * 252 * Global setting, indicate that the parser be pedantic 253 * Disabled by default. 254 */ 255 int xmlPedanticParserDefaultValue = 0; 256 static int xmlPedanticParserDefaultValueThrDef = 0; 257 /** 258 * xmlLineNumbersDefaultValue: 259 * 260 * Global setting, indicate that the parser should store the line number 261 * in the content field of elements in the DOM tree. 262 * Disabled by default since this may not be safe for old classes of 263 * application. 264 */ 265 int xmlLineNumbersDefaultValue = 0; 266 static int xmlLineNumbersDefaultValueThrDef = 0; 267 /** 268 * xmlKeepBlanksDefaultValue: 269 * 270 * Global setting, indicate that the parser should keep all blanks 271 * nodes found in the content 272 * Activated by default, this is actually needed to have the parser 273 * conformant to the XML Recommendation, however the option is kept 274 * for some applications since this was libxml1 default behaviour. 275 */ 276 int xmlKeepBlanksDefaultValue = 1; 277 static int xmlKeepBlanksDefaultValueThrDef = 1; 278 /** 279 * xmlSubstituteEntitiesDefaultValue: 280 * 281 * Global setting, indicate that the parser should not generate entity 282 * references but replace them with the actual content of the entity 283 * Disabled by default, this should be activated when using XPath since 284 * the XPath data model requires entities replacement and the XPath 285 * engine does not handle entities references transparently. 286 */ 287 int xmlSubstituteEntitiesDefaultValue = 0; 288 static int xmlSubstituteEntitiesDefaultValueThrDef = 0; 289 290 xmlRegisterNodeFunc xmlRegisterNodeDefaultValue = NULL; 291 static xmlRegisterNodeFunc xmlRegisterNodeDefaultValueThrDef = NULL; 292 xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue = NULL; 293 static xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValueThrDef = NULL; 294 295 xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValue = NULL; 296 static xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValueThrDef = NULL; 297 298 xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValue = NULL; 299 static xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValueThrDef = NULL; 300 301 /* 302 * Error handling 303 */ 304 305 /* xmlGenericErrorFunc xmlGenericError = xmlGenericErrorDefaultFunc; */ 306 /* Must initialize xmlGenericError in xmlInitParser */ 307 void XMLCDECL xmlGenericErrorDefaultFunc (void *ctx ATTRIBUTE_UNUSED, 308 const char *msg, 309 ...); 310 /** 311 * xmlGenericError: 312 * 313 * Global setting: function used for generic error callbacks 314 */ 315 xmlGenericErrorFunc xmlGenericError = xmlGenericErrorDefaultFunc; 316 static xmlGenericErrorFunc xmlGenericErrorThrDef = xmlGenericErrorDefaultFunc; 317 /** 318 * xmlStructuredError: 319 * 320 * Global setting: function used for structured error callbacks 321 */ 322 xmlStructuredErrorFunc xmlStructuredError = NULL; 323 static xmlStructuredErrorFunc xmlStructuredErrorThrDef = NULL; 324 /** 325 * xmlGenericErrorContext: 326 * 327 * Global setting passed to generic error callbacks 328 */ 329 void *xmlGenericErrorContext = NULL; 330 static void *xmlGenericErrorContextThrDef = NULL; 331 /** 332 * xmlStructuredErrorContext: 333 * 334 * Global setting passed to structured error callbacks 335 */ 336 void *xmlStructuredErrorContext = NULL; 337 static void *xmlStructuredErrorContextThrDef = NULL; 338 xmlError xmlLastError; 339 340 /* 341 * output defaults 342 */ 343 /** 344 * xmlIndentTreeOutput: 345 * 346 * Global setting, asking the serializer to indent the output tree by default 347 * Enabled by default 348 */ 349 int xmlIndentTreeOutput = 1; 350 static int xmlIndentTreeOutputThrDef = 1; 351 352 /** 353 * xmlTreeIndentString: 354 * 355 * The string used to do one-level indent. By default is equal to " " (two spaces) 356 */ 357 const char *xmlTreeIndentString = " "; 358 static const char *xmlTreeIndentStringThrDef = " "; 359 360 /** 361 * xmlSaveNoEmptyTags: 362 * 363 * Global setting, asking the serializer to not output empty tags 364 * as <empty/> but <empty></empty>. those two forms are indistinguishable 365 * once parsed. 366 * Disabled by default 367 */ 368 int xmlSaveNoEmptyTags = 0; 369 static int xmlSaveNoEmptyTagsThrDef = 0; 370 371 #ifdef LIBXML_SAX1_ENABLED 372 /** 373 * xmlDefaultSAXHandler: 374 * 375 * Default SAX version1 handler for XML, builds the DOM tree 376 */ 377 xmlSAXHandlerV1 xmlDefaultSAXHandler = { 378 xmlSAX2InternalSubset, 379 xmlSAX2IsStandalone, 380 xmlSAX2HasInternalSubset, 381 xmlSAX2HasExternalSubset, 382 xmlSAX2ResolveEntity, 383 xmlSAX2GetEntity, 384 xmlSAX2EntityDecl, 385 xmlSAX2NotationDecl, 386 xmlSAX2AttributeDecl, 387 xmlSAX2ElementDecl, 388 xmlSAX2UnparsedEntityDecl, 389 xmlSAX2SetDocumentLocator, 390 xmlSAX2StartDocument, 391 xmlSAX2EndDocument, 392 xmlSAX2StartElement, 393 xmlSAX2EndElement, 394 xmlSAX2Reference, 395 xmlSAX2Characters, 396 xmlSAX2Characters, 397 xmlSAX2ProcessingInstruction, 398 xmlSAX2Comment, 399 xmlParserWarning, 400 xmlParserError, 401 xmlParserError, 402 xmlSAX2GetParameterEntity, 403 xmlSAX2CDataBlock, 404 xmlSAX2ExternalSubset, 405 0, 406 }; 407 #endif /* LIBXML_SAX1_ENABLED */ 408 409 /** 410 * xmlDefaultSAXLocator: 411 * 412 * The default SAX Locator 413 * { getPublicId, getSystemId, getLineNumber, getColumnNumber} 414 */ 415 xmlSAXLocator xmlDefaultSAXLocator = { 416 xmlSAX2GetPublicId, 417 xmlSAX2GetSystemId, 418 xmlSAX2GetLineNumber, 419 xmlSAX2GetColumnNumber 420 }; 421 422 #ifdef LIBXML_HTML_ENABLED 423 /** 424 * htmlDefaultSAXHandler: 425 * 426 * Default old SAX v1 handler for HTML, builds the DOM tree 427 */ 428 xmlSAXHandlerV1 htmlDefaultSAXHandler = { 429 xmlSAX2InternalSubset, 430 NULL, 431 NULL, 432 NULL, 433 NULL, 434 xmlSAX2GetEntity, 435 NULL, 436 NULL, 437 NULL, 438 NULL, 439 NULL, 440 xmlSAX2SetDocumentLocator, 441 xmlSAX2StartDocument, 442 xmlSAX2EndDocument, 443 xmlSAX2StartElement, 444 xmlSAX2EndElement, 445 NULL, 446 xmlSAX2Characters, 447 xmlSAX2IgnorableWhitespace, 448 xmlSAX2ProcessingInstruction, 449 xmlSAX2Comment, 450 xmlParserWarning, 451 xmlParserError, 452 xmlParserError, 453 xmlSAX2GetParameterEntity, 454 xmlSAX2CDataBlock, 455 NULL, 456 0, 457 }; 458 #endif /* LIBXML_HTML_ENABLED */ 459 460 #ifdef LIBXML_DOCB_ENABLED 461 /** 462 * docbDefaultSAXHandler: 463 * 464 * Default old SAX v1 handler for SGML DocBook, builds the DOM tree 465 */ 466 xmlSAXHandlerV1 docbDefaultSAXHandler = { 467 xmlSAX2InternalSubset, 468 xmlSAX2IsStandalone, 469 xmlSAX2HasInternalSubset, 470 xmlSAX2HasExternalSubset, 471 xmlSAX2ResolveEntity, 472 xmlSAX2GetEntity, 473 xmlSAX2EntityDecl, 474 NULL, 475 NULL, 476 NULL, 477 NULL, 478 xmlSAX2SetDocumentLocator, 479 xmlSAX2StartDocument, 480 xmlSAX2EndDocument, 481 xmlSAX2StartElement, 482 xmlSAX2EndElement, 483 xmlSAX2Reference, 484 xmlSAX2Characters, 485 xmlSAX2IgnorableWhitespace, 486 NULL, 487 xmlSAX2Comment, 488 xmlParserWarning, 489 xmlParserError, 490 xmlParserError, 491 xmlSAX2GetParameterEntity, 492 NULL, 493 NULL, 494 0, 495 }; 496 #endif /* LIBXML_DOCB_ENABLED */ 497 498 /** 499 * xmlInitializeGlobalState: 500 * @gs: a pointer to a newly allocated global state 501 * 502 * xmlInitializeGlobalState() initialize a global state with all the 503 * default values of the library. 504 */ 505 void 506 xmlInitializeGlobalState(xmlGlobalStatePtr gs) 507 { 508 #ifdef DEBUG_GLOBALS 509 fprintf(stderr, "Initializing globals at %lu for thread %d\n", 510 (unsigned long) gs, xmlGetThreadId()); 511 #endif 512 513 /* 514 * Perform initialization as required by libxml 515 */ 516 if (xmlThrDefMutex == NULL) 517 xmlInitGlobals(); 518 519 xmlMutexLock(xmlThrDefMutex); 520 521 #if defined(LIBXML_DOCB_ENABLED) && defined(LIBXML_LEGACY_ENABLED) && defined(LIBXML_SAX1_ENABLED) 522 initdocbDefaultSAXHandler(&gs->docbDefaultSAXHandler); 523 #endif 524 #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_LEGACY_ENABLED) && defined(LIBXML_SAX1_ENABLED) 525 inithtmlDefaultSAXHandler(&gs->htmlDefaultSAXHandler); 526 #endif 527 528 gs->oldXMLWDcompatibility = 0; 529 gs->xmlBufferAllocScheme = xmlBufferAllocSchemeThrDef; 530 gs->xmlDefaultBufferSize = xmlDefaultBufferSizeThrDef; 531 #if defined(LIBXML_SAX1_ENABLED) && defined(LIBXML_LEGACY_ENABLED) 532 initxmlDefaultSAXHandler(&gs->xmlDefaultSAXHandler, 1); 533 #endif /* LIBXML_SAX1_ENABLED */ 534 gs->xmlDefaultSAXLocator.getPublicId = xmlSAX2GetPublicId; 535 gs->xmlDefaultSAXLocator.getSystemId = xmlSAX2GetSystemId; 536 gs->xmlDefaultSAXLocator.getLineNumber = xmlSAX2GetLineNumber; 537 gs->xmlDefaultSAXLocator.getColumnNumber = xmlSAX2GetColumnNumber; 538 gs->xmlDoValidityCheckingDefaultValue = 539 xmlDoValidityCheckingDefaultValueThrDef; 540 #if defined(DEBUG_MEMORY_LOCATION) | defined(DEBUG_MEMORY) 541 gs->xmlFree = (xmlFreeFunc) xmlMemFree; 542 gs->xmlMalloc = (xmlMallocFunc) xmlMemMalloc; 543 gs->xmlMallocAtomic = (xmlMallocFunc) xmlMemMalloc; 544 gs->xmlRealloc = (xmlReallocFunc) xmlMemRealloc; 545 gs->xmlMemStrdup = (xmlStrdupFunc) xmlMemoryStrdup; 546 #else 547 gs->xmlFree = (xmlFreeFunc) free; 548 gs->xmlMalloc = (xmlMallocFunc) malloc; 549 gs->xmlMallocAtomic = (xmlMallocFunc) malloc; 550 gs->xmlRealloc = (xmlReallocFunc) realloc; 551 gs->xmlMemStrdup = (xmlStrdupFunc) xmlStrdup; 552 #endif 553 gs->xmlGetWarningsDefaultValue = xmlGetWarningsDefaultValueThrDef; 554 gs->xmlIndentTreeOutput = xmlIndentTreeOutputThrDef; 555 gs->xmlTreeIndentString = xmlTreeIndentStringThrDef; 556 gs->xmlKeepBlanksDefaultValue = xmlKeepBlanksDefaultValueThrDef; 557 gs->xmlLineNumbersDefaultValue = xmlLineNumbersDefaultValueThrDef; 558 gs->xmlLoadExtDtdDefaultValue = xmlLoadExtDtdDefaultValueThrDef; 559 gs->xmlParserDebugEntities = xmlParserDebugEntitiesThrDef; 560 gs->xmlParserVersion = LIBXML_VERSION_STRING; 561 gs->xmlPedanticParserDefaultValue = xmlPedanticParserDefaultValueThrDef; 562 gs->xmlSaveNoEmptyTags = xmlSaveNoEmptyTagsThrDef; 563 gs->xmlSubstituteEntitiesDefaultValue = 564 xmlSubstituteEntitiesDefaultValueThrDef; 565 566 gs->xmlGenericError = xmlGenericErrorThrDef; 567 gs->xmlStructuredError = xmlStructuredErrorThrDef; 568 gs->xmlGenericErrorContext = xmlGenericErrorContextThrDef; 569 gs->xmlStructuredErrorContext = xmlStructuredErrorContextThrDef; 570 gs->xmlRegisterNodeDefaultValue = xmlRegisterNodeDefaultValueThrDef; 571 gs->xmlDeregisterNodeDefaultValue = xmlDeregisterNodeDefaultValueThrDef; 572 573 gs->xmlParserInputBufferCreateFilenameValue = xmlParserInputBufferCreateFilenameValueThrDef; 574 gs->xmlOutputBufferCreateFilenameValue = xmlOutputBufferCreateFilenameValueThrDef; 575 memset(&gs->xmlLastError, 0, sizeof(xmlError)); 576 577 xmlMutexUnlock(xmlThrDefMutex); 578 } 579 580 /** 581 * DOC_DISABLE : we ignore missing doc for the xmlThrDef functions, 582 * those are really internal work 583 */ 584 void 585 xmlThrDefSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler) { 586 xmlMutexLock(xmlThrDefMutex); 587 xmlGenericErrorContextThrDef = ctx; 588 if (handler != NULL) 589 xmlGenericErrorThrDef = handler; 590 else 591 xmlGenericErrorThrDef = xmlGenericErrorDefaultFunc; 592 xmlMutexUnlock(xmlThrDefMutex); 593 } 594 595 void 596 xmlThrDefSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler) { 597 xmlMutexLock(xmlThrDefMutex); 598 xmlStructuredErrorContextThrDef = ctx; 599 xmlStructuredErrorThrDef = handler; 600 xmlMutexUnlock(xmlThrDefMutex); 601 } 602 603 /** 604 * xmlRegisterNodeDefault: 605 * @func: function pointer to the new RegisterNodeFunc 606 * 607 * Registers a callback for node creation 608 * 609 * Returns the old value of the registration function 610 */ 611 xmlRegisterNodeFunc 612 xmlRegisterNodeDefault(xmlRegisterNodeFunc func) 613 { 614 xmlRegisterNodeFunc old = xmlRegisterNodeDefaultValue; 615 616 __xmlRegisterCallbacks = 1; 617 xmlRegisterNodeDefaultValue = func; 618 return(old); 619 } 620 621 xmlRegisterNodeFunc 622 xmlThrDefRegisterNodeDefault(xmlRegisterNodeFunc func) 623 { 624 xmlRegisterNodeFunc old; 625 626 xmlMutexLock(xmlThrDefMutex); 627 old = xmlRegisterNodeDefaultValueThrDef; 628 629 __xmlRegisterCallbacks = 1; 630 xmlRegisterNodeDefaultValueThrDef = func; 631 xmlMutexUnlock(xmlThrDefMutex); 632 633 return(old); 634 } 635 636 /** 637 * xmlDeregisterNodeDefault: 638 * @func: function pointer to the new DeregisterNodeFunc 639 * 640 * Registers a callback for node destruction 641 * 642 * Returns the previous value of the deregistration function 643 */ 644 xmlDeregisterNodeFunc 645 xmlDeregisterNodeDefault(xmlDeregisterNodeFunc func) 646 { 647 xmlDeregisterNodeFunc old = xmlDeregisterNodeDefaultValue; 648 649 __xmlRegisterCallbacks = 1; 650 xmlDeregisterNodeDefaultValue = func; 651 return(old); 652 } 653 654 xmlDeregisterNodeFunc 655 xmlThrDefDeregisterNodeDefault(xmlDeregisterNodeFunc func) 656 { 657 xmlDeregisterNodeFunc old; 658 659 xmlMutexLock(xmlThrDefMutex); 660 old = xmlDeregisterNodeDefaultValueThrDef; 661 662 __xmlRegisterCallbacks = 1; 663 xmlDeregisterNodeDefaultValueThrDef = func; 664 xmlMutexUnlock(xmlThrDefMutex); 665 666 return(old); 667 } 668 669 xmlParserInputBufferCreateFilenameFunc 670 xmlThrDefParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func) 671 { 672 xmlParserInputBufferCreateFilenameFunc old; 673 674 xmlMutexLock(xmlThrDefMutex); 675 old = xmlParserInputBufferCreateFilenameValueThrDef; 676 if (old == NULL) { 677 old = __xmlParserInputBufferCreateFilename; 678 } 679 680 xmlParserInputBufferCreateFilenameValueThrDef = func; 681 xmlMutexUnlock(xmlThrDefMutex); 682 683 return(old); 684 } 685 686 xmlOutputBufferCreateFilenameFunc 687 xmlThrDefOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func) 688 { 689 xmlOutputBufferCreateFilenameFunc old; 690 691 xmlMutexLock(xmlThrDefMutex); 692 old = xmlOutputBufferCreateFilenameValueThrDef; 693 #ifdef LIBXML_OUTPUT_ENABLED 694 if (old == NULL) { 695 old = __xmlOutputBufferCreateFilename; 696 } 697 #endif 698 xmlOutputBufferCreateFilenameValueThrDef = func; 699 xmlMutexUnlock(xmlThrDefMutex); 700 701 return(old); 702 } 703 704 #ifdef LIBXML_DOCB_ENABLED 705 #undef docbDefaultSAXHandler 706 xmlSAXHandlerV1 * 707 __docbDefaultSAXHandler(void) { 708 if (IS_MAIN_THREAD) 709 return (&docbDefaultSAXHandler); 710 else 711 return (&xmlGetGlobalState()->docbDefaultSAXHandler); 712 } 713 #endif 714 715 #ifdef LIBXML_HTML_ENABLED 716 #undef htmlDefaultSAXHandler 717 xmlSAXHandlerV1 * 718 __htmlDefaultSAXHandler(void) { 719 if (IS_MAIN_THREAD) 720 return (&htmlDefaultSAXHandler); 721 else 722 return (&xmlGetGlobalState()->htmlDefaultSAXHandler); 723 } 724 #endif 725 726 #undef xmlLastError 727 xmlError * 728 __xmlLastError(void) { 729 if (IS_MAIN_THREAD) 730 return (&xmlLastError); 731 else 732 return (&xmlGetGlobalState()->xmlLastError); 733 } 734 735 /* 736 * The following memory routines were apparently lost at some point, 737 * and were re-inserted at this point on June 10, 2004. Hope it's 738 * the right place for them :-) 739 */ 740 #if defined(LIBXML_THREAD_ALLOC_ENABLED) && defined(LIBXML_THREAD_ENABLED) 741 #undef xmlMalloc 742 xmlMallocFunc * 743 __xmlMalloc(void){ 744 if (IS_MAIN_THREAD) 745 return (&xmlMalloc); 746 else 747 return (&xmlGetGlobalState()->xmlMalloc); 748 } 749 750 #undef xmlMallocAtomic 751 xmlMallocFunc * 752 __xmlMallocAtomic(void){ 753 if (IS_MAIN_THREAD) 754 return (&xmlMallocAtomic); 755 else 756 return (&xmlGetGlobalState()->xmlMallocAtomic); 757 } 758 759 #undef xmlRealloc 760 xmlReallocFunc * 761 __xmlRealloc(void){ 762 if (IS_MAIN_THREAD) 763 return (&xmlRealloc); 764 else 765 return (&xmlGetGlobalState()->xmlRealloc); 766 } 767 768 #undef xmlFree 769 xmlFreeFunc * 770 __xmlFree(void){ 771 if (IS_MAIN_THREAD) 772 return (&xmlFree); 773 else 774 return (&xmlGetGlobalState()->xmlFree); 775 } 776 777 xmlStrdupFunc * 778 __xmlMemStrdup(void){ 779 if (IS_MAIN_THREAD) 780 return (&xmlMemStrdup); 781 else 782 return (&xmlGetGlobalState()->xmlMemStrdup); 783 } 784 785 #endif 786 787 /* 788 * Everything starting from the line below is 789 * Automatically generated by build_glob.py. 790 * Do not modify the previous line. 791 */ 792 793 794 #undef oldXMLWDcompatibility 795 int * 796 __oldXMLWDcompatibility(void) { 797 if (IS_MAIN_THREAD) 798 return (&oldXMLWDcompatibility); 799 else 800 return (&xmlGetGlobalState()->oldXMLWDcompatibility); 801 } 802 803 #undef xmlBufferAllocScheme 804 xmlBufferAllocationScheme * 805 __xmlBufferAllocScheme(void) { 806 if (IS_MAIN_THREAD) 807 return (&xmlBufferAllocScheme); 808 else 809 return (&xmlGetGlobalState()->xmlBufferAllocScheme); 810 } 811 xmlBufferAllocationScheme xmlThrDefBufferAllocScheme(xmlBufferAllocationScheme v) { 812 xmlBufferAllocationScheme ret; 813 xmlMutexLock(xmlThrDefMutex); 814 ret = xmlBufferAllocSchemeThrDef; 815 xmlBufferAllocSchemeThrDef = v; 816 xmlMutexUnlock(xmlThrDefMutex); 817 return ret; 818 } 819 820 #undef xmlDefaultBufferSize 821 int * 822 __xmlDefaultBufferSize(void) { 823 if (IS_MAIN_THREAD) 824 return (&xmlDefaultBufferSize); 825 else 826 return (&xmlGetGlobalState()->xmlDefaultBufferSize); 827 } 828 int xmlThrDefDefaultBufferSize(int v) { 829 int ret; 830 xmlMutexLock(xmlThrDefMutex); 831 ret = xmlDefaultBufferSizeThrDef; 832 xmlDefaultBufferSizeThrDef = v; 833 xmlMutexUnlock(xmlThrDefMutex); 834 return ret; 835 } 836 837 #ifdef LIBXML_SAX1_ENABLED 838 #undef xmlDefaultSAXHandler 839 xmlSAXHandlerV1 * 840 __xmlDefaultSAXHandler(void) { 841 if (IS_MAIN_THREAD) 842 return (&xmlDefaultSAXHandler); 843 else 844 return (&xmlGetGlobalState()->xmlDefaultSAXHandler); 845 } 846 #endif /* LIBXML_SAX1_ENABLED */ 847 848 #undef xmlDefaultSAXLocator 849 xmlSAXLocator * 850 __xmlDefaultSAXLocator(void) { 851 if (IS_MAIN_THREAD) 852 return (&xmlDefaultSAXLocator); 853 else 854 return (&xmlGetGlobalState()->xmlDefaultSAXLocator); 855 } 856 857 #undef xmlDoValidityCheckingDefaultValue 858 int * 859 __xmlDoValidityCheckingDefaultValue(void) { 860 if (IS_MAIN_THREAD) 861 return (&xmlDoValidityCheckingDefaultValue); 862 else 863 return (&xmlGetGlobalState()->xmlDoValidityCheckingDefaultValue); 864 } 865 int xmlThrDefDoValidityCheckingDefaultValue(int v) { 866 int ret; 867 xmlMutexLock(xmlThrDefMutex); 868 ret = xmlDoValidityCheckingDefaultValueThrDef; 869 xmlDoValidityCheckingDefaultValueThrDef = v; 870 xmlMutexUnlock(xmlThrDefMutex); 871 return ret; 872 } 873 874 #undef xmlGenericError 875 xmlGenericErrorFunc * 876 __xmlGenericError(void) { 877 if (IS_MAIN_THREAD) 878 return (&xmlGenericError); 879 else 880 return (&xmlGetGlobalState()->xmlGenericError); 881 } 882 883 #undef xmlStructuredError 884 xmlStructuredErrorFunc * 885 __xmlStructuredError(void) { 886 if (IS_MAIN_THREAD) 887 return (&xmlStructuredError); 888 else 889 return (&xmlGetGlobalState()->xmlStructuredError); 890 } 891 892 #undef xmlGenericErrorContext 893 void * * 894 __xmlGenericErrorContext(void) { 895 if (IS_MAIN_THREAD) 896 return (&xmlGenericErrorContext); 897 else 898 return (&xmlGetGlobalState()->xmlGenericErrorContext); 899 } 900 901 #undef xmlStructuredErrorContext 902 void * * 903 __xmlStructuredErrorContext(void) { 904 if (IS_MAIN_THREAD) 905 return (&xmlStructuredErrorContext); 906 else 907 return (&xmlGetGlobalState()->xmlStructuredErrorContext); 908 } 909 910 #undef xmlGetWarningsDefaultValue 911 int * 912 __xmlGetWarningsDefaultValue(void) { 913 if (IS_MAIN_THREAD) 914 return (&xmlGetWarningsDefaultValue); 915 else 916 return (&xmlGetGlobalState()->xmlGetWarningsDefaultValue); 917 } 918 int xmlThrDefGetWarningsDefaultValue(int v) { 919 int ret; 920 xmlMutexLock(xmlThrDefMutex); 921 ret = xmlGetWarningsDefaultValueThrDef; 922 xmlGetWarningsDefaultValueThrDef = v; 923 xmlMutexUnlock(xmlThrDefMutex); 924 return ret; 925 } 926 927 #undef xmlIndentTreeOutput 928 int * 929 __xmlIndentTreeOutput(void) { 930 if (IS_MAIN_THREAD) 931 return (&xmlIndentTreeOutput); 932 else 933 return (&xmlGetGlobalState()->xmlIndentTreeOutput); 934 } 935 int xmlThrDefIndentTreeOutput(int v) { 936 int ret; 937 xmlMutexLock(xmlThrDefMutex); 938 ret = xmlIndentTreeOutputThrDef; 939 xmlIndentTreeOutputThrDef = v; 940 xmlMutexUnlock(xmlThrDefMutex); 941 return ret; 942 } 943 944 #undef xmlTreeIndentString 945 const char * * 946 __xmlTreeIndentString(void) { 947 if (IS_MAIN_THREAD) 948 return (&xmlTreeIndentString); 949 else 950 return (&xmlGetGlobalState()->xmlTreeIndentString); 951 } 952 const char * xmlThrDefTreeIndentString(const char * v) { 953 const char * ret; 954 xmlMutexLock(xmlThrDefMutex); 955 ret = xmlTreeIndentStringThrDef; 956 xmlTreeIndentStringThrDef = v; 957 xmlMutexUnlock(xmlThrDefMutex); 958 return ret; 959 } 960 961 #undef xmlKeepBlanksDefaultValue 962 int * 963 __xmlKeepBlanksDefaultValue(void) { 964 if (IS_MAIN_THREAD) 965 return (&xmlKeepBlanksDefaultValue); 966 else 967 return (&xmlGetGlobalState()->xmlKeepBlanksDefaultValue); 968 } 969 int xmlThrDefKeepBlanksDefaultValue(int v) { 970 int ret; 971 xmlMutexLock(xmlThrDefMutex); 972 ret = xmlKeepBlanksDefaultValueThrDef; 973 xmlKeepBlanksDefaultValueThrDef = v; 974 xmlMutexUnlock(xmlThrDefMutex); 975 return ret; 976 } 977 978 #undef xmlLineNumbersDefaultValue 979 int * 980 __xmlLineNumbersDefaultValue(void) { 981 if (IS_MAIN_THREAD) 982 return (&xmlLineNumbersDefaultValue); 983 else 984 return (&xmlGetGlobalState()->xmlLineNumbersDefaultValue); 985 } 986 int xmlThrDefLineNumbersDefaultValue(int v) { 987 int ret; 988 xmlMutexLock(xmlThrDefMutex); 989 ret = xmlLineNumbersDefaultValueThrDef; 990 xmlLineNumbersDefaultValueThrDef = v; 991 xmlMutexUnlock(xmlThrDefMutex); 992 return ret; 993 } 994 995 #undef xmlLoadExtDtdDefaultValue 996 int * 997 __xmlLoadExtDtdDefaultValue(void) { 998 if (IS_MAIN_THREAD) 999 return (&xmlLoadExtDtdDefaultValue); 1000 else 1001 return (&xmlGetGlobalState()->xmlLoadExtDtdDefaultValue); 1002 } 1003 int xmlThrDefLoadExtDtdDefaultValue(int v) { 1004 int ret; 1005 xmlMutexLock(xmlThrDefMutex); 1006 ret = xmlLoadExtDtdDefaultValueThrDef; 1007 xmlLoadExtDtdDefaultValueThrDef = v; 1008 xmlMutexUnlock(xmlThrDefMutex); 1009 return ret; 1010 } 1011 1012 #undef xmlParserDebugEntities 1013 int * 1014 __xmlParserDebugEntities(void) { 1015 if (IS_MAIN_THREAD) 1016 return (&xmlParserDebugEntities); 1017 else 1018 return (&xmlGetGlobalState()->xmlParserDebugEntities); 1019 } 1020 int xmlThrDefParserDebugEntities(int v) { 1021 int ret; 1022 xmlMutexLock(xmlThrDefMutex); 1023 ret = xmlParserDebugEntitiesThrDef; 1024 xmlParserDebugEntitiesThrDef = v; 1025 xmlMutexUnlock(xmlThrDefMutex); 1026 return ret; 1027 } 1028 1029 #undef xmlParserVersion 1030 const char * * 1031 __xmlParserVersion(void) { 1032 if (IS_MAIN_THREAD) 1033 return (&xmlParserVersion); 1034 else 1035 return (&xmlGetGlobalState()->xmlParserVersion); 1036 } 1037 1038 #undef xmlPedanticParserDefaultValue 1039 int * 1040 __xmlPedanticParserDefaultValue(void) { 1041 if (IS_MAIN_THREAD) 1042 return (&xmlPedanticParserDefaultValue); 1043 else 1044 return (&xmlGetGlobalState()->xmlPedanticParserDefaultValue); 1045 } 1046 int xmlThrDefPedanticParserDefaultValue(int v) { 1047 int ret; 1048 xmlMutexLock(xmlThrDefMutex); 1049 ret = xmlPedanticParserDefaultValueThrDef; 1050 xmlPedanticParserDefaultValueThrDef = v; 1051 xmlMutexUnlock(xmlThrDefMutex); 1052 return ret; 1053 } 1054 1055 #undef xmlSaveNoEmptyTags 1056 int * 1057 __xmlSaveNoEmptyTags(void) { 1058 if (IS_MAIN_THREAD) 1059 return (&xmlSaveNoEmptyTags); 1060 else 1061 return (&xmlGetGlobalState()->xmlSaveNoEmptyTags); 1062 } 1063 int xmlThrDefSaveNoEmptyTags(int v) { 1064 int ret; 1065 xmlMutexLock(xmlThrDefMutex); 1066 ret = xmlSaveNoEmptyTagsThrDef; 1067 xmlSaveNoEmptyTagsThrDef = v; 1068 xmlMutexUnlock(xmlThrDefMutex); 1069 return ret; 1070 } 1071 1072 #undef xmlSubstituteEntitiesDefaultValue 1073 int * 1074 __xmlSubstituteEntitiesDefaultValue(void) { 1075 if (IS_MAIN_THREAD) 1076 return (&xmlSubstituteEntitiesDefaultValue); 1077 else 1078 return (&xmlGetGlobalState()->xmlSubstituteEntitiesDefaultValue); 1079 } 1080 int xmlThrDefSubstituteEntitiesDefaultValue(int v) { 1081 int ret; 1082 xmlMutexLock(xmlThrDefMutex); 1083 ret = xmlSubstituteEntitiesDefaultValueThrDef; 1084 xmlSubstituteEntitiesDefaultValueThrDef = v; 1085 xmlMutexUnlock(xmlThrDefMutex); 1086 return ret; 1087 } 1088 1089 #undef xmlRegisterNodeDefaultValue 1090 xmlRegisterNodeFunc * 1091 __xmlRegisterNodeDefaultValue(void) { 1092 if (IS_MAIN_THREAD) 1093 return (&xmlRegisterNodeDefaultValue); 1094 else 1095 return (&xmlGetGlobalState()->xmlRegisterNodeDefaultValue); 1096 } 1097 1098 #undef xmlDeregisterNodeDefaultValue 1099 xmlDeregisterNodeFunc * 1100 __xmlDeregisterNodeDefaultValue(void) { 1101 if (IS_MAIN_THREAD) 1102 return (&xmlDeregisterNodeDefaultValue); 1103 else 1104 return (&xmlGetGlobalState()->xmlDeregisterNodeDefaultValue); 1105 } 1106 1107 #undef xmlParserInputBufferCreateFilenameValue 1108 xmlParserInputBufferCreateFilenameFunc * 1109 __xmlParserInputBufferCreateFilenameValue(void) { 1110 if (IS_MAIN_THREAD) 1111 return (&xmlParserInputBufferCreateFilenameValue); 1112 else 1113 return (&xmlGetGlobalState()->xmlParserInputBufferCreateFilenameValue); 1114 } 1115 1116 #undef xmlOutputBufferCreateFilenameValue 1117 xmlOutputBufferCreateFilenameFunc * 1118 __xmlOutputBufferCreateFilenameValue(void) { 1119 if (IS_MAIN_THREAD) 1120 return (&xmlOutputBufferCreateFilenameValue); 1121 else 1122 return (&xmlGetGlobalState()->xmlOutputBufferCreateFilenameValue); 1123 } 1124 1125 #define bottom_globals 1126 #include "elfgcchack.h" 1127