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 = 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 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 = 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  * applicaton.
    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 undistinguishable
    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