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