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