|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define IN_LIBXML |
|
|
#include "libxml.h" |
|
|
|
|
|
#include <stdlib.h> |
|
|
#include <string.h> |
|
|
|
|
|
#define XML_GLOBALS_NO_REDEFINITION |
|
|
#include <libxml/xmlerror.h> |
|
|
#include <libxml/xmlmemory.h> |
|
|
#include <libxml/xmlIO.h> |
|
|
#include <libxml/HTMLparser.h> |
|
|
#include <libxml/parser.h> |
|
|
#include <libxml/threads.h> |
|
|
#include <libxml/tree.h> |
|
|
#include <libxml/xmlsave.h> |
|
|
#include <libxml/SAX2.h> |
|
|
|
|
|
#include "private/dict.h" |
|
|
#include "private/error.h" |
|
|
#include "private/globals.h" |
|
|
#include "private/threads.h" |
|
|
#include "private/tree.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static xmlMutex xmlThrDefMutex; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int lineNumbersDefaultValue = 1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef LIBXML_THREAD_ENABLED |
|
|
|
|
|
#ifdef HAVE_WIN32_THREADS |
|
|
#if defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL) |
|
|
#define USE_WAIT_DTOR |
|
|
#else |
|
|
#define USE_DLL_MAIN |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(XML_THREAD_LOCAL) && \ |
|
|
!defined(__APPLE__) && \ |
|
|
!defined(USE_WAIT_DTOR) |
|
|
#define USE_TLS |
|
|
#endif |
|
|
|
|
|
#ifdef HAVE_POSIX_THREADS |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static pthread_key_t globalkey; |
|
|
|
|
|
#elif defined HAVE_WIN32_THREADS |
|
|
|
|
|
#ifndef USE_TLS |
|
|
static DWORD globalkey = TLS_OUT_OF_INDEXES; |
|
|
#endif |
|
|
|
|
|
#endif |
|
|
|
|
|
static void |
|
|
xmlFreeGlobalState(void *state); |
|
|
|
|
|
#endif |
|
|
|
|
|
struct _xmlGlobalState { |
|
|
#ifdef USE_TLS |
|
|
int initialized; |
|
|
#endif |
|
|
|
|
|
#ifdef USE_WAIT_DTOR |
|
|
void *threadHandle; |
|
|
void *waitHandle; |
|
|
#endif |
|
|
|
|
|
unsigned localRngState[2]; |
|
|
|
|
|
xmlError lastError; |
|
|
|
|
|
#ifdef LIBXML_THREAD_ALLOC_ENABLED |
|
|
xmlMallocFunc malloc; |
|
|
xmlMallocFunc mallocAtomic; |
|
|
xmlReallocFunc realloc; |
|
|
xmlFreeFunc free; |
|
|
xmlStrdupFunc memStrdup; |
|
|
#endif |
|
|
|
|
|
int doValidityCheckingDefaultValue; |
|
|
int getWarningsDefaultValue; |
|
|
int keepBlanksDefaultValue; |
|
|
int loadExtDtdDefaultValue; |
|
|
int pedanticParserDefaultValue; |
|
|
int substituteEntitiesDefaultValue; |
|
|
|
|
|
#ifdef LIBXML_OUTPUT_ENABLED |
|
|
int indentTreeOutput; |
|
|
const char *treeIndentString; |
|
|
int saveNoEmptyTags; |
|
|
#endif |
|
|
|
|
|
xmlGenericErrorFunc genericError; |
|
|
void *genericErrorContext; |
|
|
xmlStructuredErrorFunc structuredError; |
|
|
void *structuredErrorContext; |
|
|
|
|
|
xmlRegisterNodeFunc registerNodeDefaultValue; |
|
|
xmlDeregisterNodeFunc deregisterNodeDefaultValue; |
|
|
|
|
|
xmlParserInputBufferCreateFilenameFunc parserInputBufferCreateFilenameValue; |
|
|
xmlOutputBufferCreateFilenameFunc outputBufferCreateFilenameValue; |
|
|
}; |
|
|
|
|
|
typedef struct _xmlGlobalState xmlGlobalState; |
|
|
typedef xmlGlobalState *xmlGlobalStatePtr; |
|
|
|
|
|
#ifdef LIBXML_THREAD_ENABLED |
|
|
|
|
|
#ifdef USE_TLS |
|
|
static XML_THREAD_LOCAL xmlGlobalState globalState; |
|
|
#endif |
|
|
|
|
|
#else |
|
|
|
|
|
static xmlGlobalState globalState; |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static char * |
|
|
xmlPosixStrdup(const char *cur) { |
|
|
return((char*) xmlCharStrdup(cur)); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmlFreeFunc xmlFree = free; |
|
|
xmlMallocFunc xmlMalloc = malloc; |
|
|
xmlMallocFunc xmlMallocAtomic = malloc; |
|
|
xmlReallocFunc xmlRealloc = realloc; |
|
|
xmlStrdupFunc xmlMemStrdup = xmlPosixStrdup; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int xmlDoValidityCheckingDefaultValueThrDef = 0; |
|
|
static int xmlGetWarningsDefaultValueThrDef = 1; |
|
|
static int xmlLoadExtDtdDefaultValueThrDef = 0; |
|
|
static int xmlPedanticParserDefaultValueThrDef = 0; |
|
|
static int xmlKeepBlanksDefaultValueThrDef = 1; |
|
|
static int xmlSubstituteEntitiesDefaultValueThrDef = 0; |
|
|
|
|
|
static xmlRegisterNodeFunc xmlRegisterNodeDefaultValueThrDef = NULL; |
|
|
static xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValueThrDef = NULL; |
|
|
|
|
|
static xmlParserInputBufferCreateFilenameFunc |
|
|
xmlParserInputBufferCreateFilenameValueThrDef = NULL; |
|
|
static xmlOutputBufferCreateFilenameFunc |
|
|
xmlOutputBufferCreateFilenameValueThrDef = NULL; |
|
|
|
|
|
static xmlGenericErrorFunc xmlGenericErrorThrDef = xmlGenericErrorDefaultFunc; |
|
|
static xmlStructuredErrorFunc xmlStructuredErrorThrDef = NULL; |
|
|
static void *xmlGenericErrorContextThrDef = NULL; |
|
|
static void *xmlStructuredErrorContextThrDef = NULL; |
|
|
|
|
|
#ifdef LIBXML_OUTPUT_ENABLED |
|
|
static int xmlIndentTreeOutputThrDef = 1; |
|
|
static const char *xmlTreeIndentStringThrDef = " "; |
|
|
static int xmlSaveNoEmptyTagsThrDef = 0; |
|
|
#endif |
|
|
|
|
|
#ifdef LIBXML_SAX1_ENABLED |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const xmlSAXHandlerV1 xmlDefaultSAXHandler = { |
|
|
xmlSAX2InternalSubset, |
|
|
xmlSAX2IsStandalone, |
|
|
xmlSAX2HasInternalSubset, |
|
|
xmlSAX2HasExternalSubset, |
|
|
xmlSAX2ResolveEntity, |
|
|
xmlSAX2GetEntity, |
|
|
xmlSAX2EntityDecl, |
|
|
xmlSAX2NotationDecl, |
|
|
xmlSAX2AttributeDecl, |
|
|
xmlSAX2ElementDecl, |
|
|
xmlSAX2UnparsedEntityDecl, |
|
|
xmlSAX2SetDocumentLocator, |
|
|
xmlSAX2StartDocument, |
|
|
xmlSAX2EndDocument, |
|
|
xmlSAX2StartElement, |
|
|
xmlSAX2EndElement, |
|
|
xmlSAX2Reference, |
|
|
xmlSAX2Characters, |
|
|
xmlSAX2Characters, |
|
|
xmlSAX2ProcessingInstruction, |
|
|
xmlSAX2Comment, |
|
|
xmlParserWarning, |
|
|
xmlParserError, |
|
|
xmlParserError, |
|
|
xmlSAX2GetParameterEntity, |
|
|
xmlSAX2CDataBlock, |
|
|
xmlSAX2ExternalSubset, |
|
|
1, |
|
|
}; |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const xmlSAXLocator xmlDefaultSAXLocator = { |
|
|
xmlSAX2GetPublicId, |
|
|
xmlSAX2GetSystemId, |
|
|
xmlSAX2GetLineNumber, |
|
|
xmlSAX2GetColumnNumber |
|
|
}; |
|
|
|
|
|
#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_SAX1_ENABLED) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const xmlSAXHandlerV1 htmlDefaultSAXHandler = { |
|
|
xmlSAX2InternalSubset, |
|
|
NULL, |
|
|
NULL, |
|
|
NULL, |
|
|
NULL, |
|
|
xmlSAX2GetEntity, |
|
|
NULL, |
|
|
NULL, |
|
|
NULL, |
|
|
NULL, |
|
|
NULL, |
|
|
xmlSAX2SetDocumentLocator, |
|
|
xmlSAX2StartDocument, |
|
|
xmlSAX2EndDocument, |
|
|
xmlSAX2StartElement, |
|
|
xmlSAX2EndElement, |
|
|
NULL, |
|
|
xmlSAX2Characters, |
|
|
xmlSAX2IgnorableWhitespace, |
|
|
xmlSAX2ProcessingInstruction, |
|
|
xmlSAX2Comment, |
|
|
xmlParserWarning, |
|
|
xmlParserError, |
|
|
xmlParserError, |
|
|
NULL, |
|
|
xmlSAX2CDataBlock, |
|
|
NULL, |
|
|
1, |
|
|
}; |
|
|
#endif |
|
|
|
|
|
static void |
|
|
xmlInitGlobalState(xmlGlobalStatePtr gs); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void xmlInitGlobals(void) { |
|
|
xmlInitParser(); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void xmlInitGlobalsInternal(void) { |
|
|
xmlInitMutex(&xmlThrDefMutex); |
|
|
|
|
|
#ifdef HAVE_POSIX_THREADS |
|
|
pthread_key_create(&globalkey, xmlFreeGlobalState); |
|
|
#elif defined(HAVE_WIN32_THREADS) |
|
|
#ifndef USE_TLS |
|
|
if (globalkey == TLS_OUT_OF_INDEXES) |
|
|
globalkey = TlsAlloc(); |
|
|
#endif |
|
|
#else |
|
|
xmlInitGlobalState(&globalState); |
|
|
#endif |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void xmlCleanupGlobals(void) { |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void xmlCleanupGlobalsInternal(void) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_POSIX_THREADS |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmlGlobalState *gs = pthread_getspecific(globalkey); |
|
|
if (gs != NULL) |
|
|
xmlFreeGlobalState(gs); |
|
|
pthread_key_delete(globalkey); |
|
|
#elif defined(HAVE_WIN32_THREADS) |
|
|
#if defined(USE_WAIT_DTOR) && !defined(USE_TLS) |
|
|
if (globalkey != TLS_OUT_OF_INDEXES) { |
|
|
TlsFree(globalkey); |
|
|
globalkey = TLS_OUT_OF_INDEXES; |
|
|
} |
|
|
#endif |
|
|
#else |
|
|
xmlResetError(&globalState.lastError); |
|
|
#endif |
|
|
|
|
|
xmlCleanupMutex(&xmlThrDefMutex); |
|
|
} |
|
|
|
|
|
#ifdef LIBXML_THREAD_ENABLED |
|
|
|
|
|
static void |
|
|
xmlFreeGlobalState(void *state) |
|
|
{ |
|
|
xmlGlobalState *gs = (xmlGlobalState *) state; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmlResetError(&gs->lastError); |
|
|
#ifndef USE_TLS |
|
|
free(state); |
|
|
#endif |
|
|
} |
|
|
|
|
|
#if defined(USE_WAIT_DTOR) |
|
|
static void WINAPI |
|
|
xmlGlobalStateDtor(void *ctxt, unsigned char timedOut ATTRIBUTE_UNUSED) { |
|
|
xmlGlobalStatePtr gs = ctxt; |
|
|
|
|
|
UnregisterWait(gs->waitHandle); |
|
|
CloseHandle(gs->threadHandle); |
|
|
xmlFreeGlobalState(gs); |
|
|
} |
|
|
|
|
|
static int |
|
|
xmlRegisterGlobalStateDtor(xmlGlobalState *gs) { |
|
|
void *processHandle = GetCurrentProcess(); |
|
|
void *threadHandle; |
|
|
void *waitHandle; |
|
|
|
|
|
if (DuplicateHandle(processHandle, GetCurrentThread(), processHandle, |
|
|
&threadHandle, 0, FALSE, DUPLICATE_SAME_ACCESS) == 0) { |
|
|
return(-1); |
|
|
} |
|
|
|
|
|
if (RegisterWaitForSingleObject(&waitHandle, threadHandle, |
|
|
xmlGlobalStateDtor, gs, INFINITE, WT_EXECUTEONLYONCE) == 0) { |
|
|
CloseHandle(threadHandle); |
|
|
return(-1); |
|
|
} |
|
|
|
|
|
gs->threadHandle = threadHandle; |
|
|
gs->waitHandle = waitHandle; |
|
|
return(0); |
|
|
} |
|
|
#endif |
|
|
|
|
|
#ifndef USE_TLS |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static xmlGlobalStatePtr |
|
|
xmlNewGlobalState(int allowFailure) |
|
|
{ |
|
|
xmlGlobalState *gs; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gs = malloc(sizeof(xmlGlobalState)); |
|
|
if (gs == NULL) { |
|
|
if (allowFailure) |
|
|
return(NULL); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmlAbort("libxml2: Failed to allocate globals for thread\n" |
|
|
"libxml2: See xmlCheckThreadLocalStorage\n"); |
|
|
} |
|
|
|
|
|
memset(gs, 0, sizeof(xmlGlobalState)); |
|
|
xmlInitGlobalState(gs); |
|
|
return (gs); |
|
|
} |
|
|
#endif |
|
|
|
|
|
static xmlGlobalStatePtr |
|
|
xmlGetThreadLocalStorage(int allowFailure) { |
|
|
xmlGlobalState *gs; |
|
|
|
|
|
(void) allowFailure; |
|
|
|
|
|
xmlInitParser(); |
|
|
|
|
|
#ifdef USE_TLS |
|
|
gs = &globalState; |
|
|
if (gs->initialized == 0) |
|
|
xmlInitGlobalState(gs); |
|
|
#elif defined(HAVE_POSIX_THREADS) |
|
|
gs = (xmlGlobalState *) pthread_getspecific(globalkey); |
|
|
if (gs == NULL) |
|
|
gs = xmlNewGlobalState(allowFailure); |
|
|
#elif defined(HAVE_WIN32_THREADS) |
|
|
gs = (xmlGlobalState *) TlsGetValue(globalkey); |
|
|
if (gs == NULL) |
|
|
gs = xmlNewGlobalState(allowFailure); |
|
|
#else |
|
|
gs = NULL; |
|
|
#endif |
|
|
|
|
|
return(gs); |
|
|
} |
|
|
|
|
|
#else |
|
|
|
|
|
static xmlGlobalStatePtr |
|
|
xmlGetThreadLocalStorage(int allowFailure ATTRIBUTE_UNUSED) { |
|
|
return(&globalState); |
|
|
} |
|
|
|
|
|
#endif |
|
|
|
|
|
static void |
|
|
xmlInitGlobalState(xmlGlobalStatePtr gs) { |
|
|
gs->localRngState[0] = xmlGlobalRandom(); |
|
|
gs->localRngState[1] = xmlGlobalRandom(); |
|
|
|
|
|
memset(&gs->lastError, 0, sizeof(xmlError)); |
|
|
|
|
|
#ifdef LIBXML_THREAD_ALLOC_ENABLED |
|
|
|
|
|
gs->free = free; |
|
|
gs->malloc = malloc; |
|
|
gs->mallocAtomic = malloc; |
|
|
gs->realloc = realloc; |
|
|
gs->memStrdup = xmlPosixStrdup; |
|
|
#endif |
|
|
|
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
|
|
|
|
|
|
gs->doValidityCheckingDefaultValue = |
|
|
xmlDoValidityCheckingDefaultValueThrDef; |
|
|
gs->getWarningsDefaultValue = xmlGetWarningsDefaultValueThrDef; |
|
|
gs->keepBlanksDefaultValue = xmlKeepBlanksDefaultValueThrDef; |
|
|
gs->loadExtDtdDefaultValue = xmlLoadExtDtdDefaultValueThrDef; |
|
|
gs->pedanticParserDefaultValue = xmlPedanticParserDefaultValueThrDef; |
|
|
gs->substituteEntitiesDefaultValue = |
|
|
xmlSubstituteEntitiesDefaultValueThrDef; |
|
|
#ifdef LIBXML_OUTPUT_ENABLED |
|
|
gs->indentTreeOutput = xmlIndentTreeOutputThrDef; |
|
|
gs->treeIndentString = xmlTreeIndentStringThrDef; |
|
|
gs->saveNoEmptyTags = xmlSaveNoEmptyTagsThrDef; |
|
|
#endif |
|
|
|
|
|
|
|
|
gs->genericError = xmlGenericErrorThrDef; |
|
|
gs->structuredError = xmlStructuredErrorThrDef; |
|
|
gs->genericErrorContext = xmlGenericErrorContextThrDef; |
|
|
gs->structuredErrorContext = xmlStructuredErrorContextThrDef; |
|
|
|
|
|
|
|
|
gs->registerNodeDefaultValue = xmlRegisterNodeDefaultValueThrDef; |
|
|
gs->deregisterNodeDefaultValue = xmlDeregisterNodeDefaultValueThrDef; |
|
|
|
|
|
|
|
|
gs->parserInputBufferCreateFilenameValue = |
|
|
xmlParserInputBufferCreateFilenameValueThrDef; |
|
|
gs->outputBufferCreateFilenameValue = |
|
|
xmlOutputBufferCreateFilenameValueThrDef; |
|
|
|
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
|
|
|
#ifdef USE_TLS |
|
|
gs->initialized = 1; |
|
|
#endif |
|
|
|
|
|
#ifdef HAVE_POSIX_THREADS |
|
|
pthread_setspecific(globalkey, gs); |
|
|
#elif defined HAVE_WIN32_THREADS |
|
|
#ifndef USE_TLS |
|
|
TlsSetValue(globalkey, gs); |
|
|
#endif |
|
|
#ifdef USE_WAIT_DTOR |
|
|
xmlRegisterGlobalStateDtor(gs); |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
|
|
|
const xmlError * |
|
|
__xmlLastError(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->lastError); |
|
|
} |
|
|
|
|
|
int * |
|
|
__xmlDoValidityCheckingDefaultValue(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->doValidityCheckingDefaultValue); |
|
|
} |
|
|
|
|
|
int * |
|
|
__xmlGetWarningsDefaultValue(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->getWarningsDefaultValue); |
|
|
} |
|
|
|
|
|
int * |
|
|
__xmlKeepBlanksDefaultValue(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->keepBlanksDefaultValue); |
|
|
} |
|
|
|
|
|
int * |
|
|
__xmlLineNumbersDefaultValue(void) { |
|
|
return(&lineNumbersDefaultValue); |
|
|
} |
|
|
|
|
|
int * |
|
|
__xmlLoadExtDtdDefaultValue(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->loadExtDtdDefaultValue); |
|
|
} |
|
|
|
|
|
int * |
|
|
__xmlPedanticParserDefaultValue(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->pedanticParserDefaultValue); |
|
|
} |
|
|
|
|
|
int * |
|
|
__xmlSubstituteEntitiesDefaultValue(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->substituteEntitiesDefaultValue); |
|
|
} |
|
|
|
|
|
#ifdef LIBXML_OUTPUT_ENABLED |
|
|
int * |
|
|
__xmlIndentTreeOutput(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->indentTreeOutput); |
|
|
} |
|
|
|
|
|
const char ** |
|
|
__xmlTreeIndentString(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->treeIndentString); |
|
|
} |
|
|
|
|
|
int * |
|
|
__xmlSaveNoEmptyTags(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->saveNoEmptyTags); |
|
|
} |
|
|
#endif |
|
|
|
|
|
xmlGenericErrorFunc * |
|
|
__xmlGenericError(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->genericError); |
|
|
} |
|
|
|
|
|
void ** |
|
|
__xmlGenericErrorContext(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->genericErrorContext); |
|
|
} |
|
|
|
|
|
xmlStructuredErrorFunc * |
|
|
__xmlStructuredError(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->structuredError); |
|
|
} |
|
|
|
|
|
void ** |
|
|
__xmlStructuredErrorContext(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->structuredErrorContext); |
|
|
} |
|
|
|
|
|
xmlRegisterNodeFunc * |
|
|
__xmlRegisterNodeDefaultValue(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->registerNodeDefaultValue); |
|
|
} |
|
|
|
|
|
xmlDeregisterNodeFunc * |
|
|
__xmlDeregisterNodeDefaultValue(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->deregisterNodeDefaultValue); |
|
|
} |
|
|
|
|
|
xmlParserInputBufferCreateFilenameFunc * |
|
|
__xmlParserInputBufferCreateFilenameValue(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->parserInputBufferCreateFilenameValue); |
|
|
} |
|
|
|
|
|
xmlOutputBufferCreateFilenameFunc * |
|
|
__xmlOutputBufferCreateFilenameValue(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->outputBufferCreateFilenameValue); |
|
|
} |
|
|
|
|
|
#ifdef LIBXML_THREAD_ALLOC_ENABLED |
|
|
xmlMallocFunc * |
|
|
__xmlMalloc(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->malloc); |
|
|
} |
|
|
|
|
|
xmlMallocFunc * |
|
|
__xmlMallocAtomic(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->mallocAtomic); |
|
|
} |
|
|
|
|
|
xmlReallocFunc * |
|
|
__xmlRealloc(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->realloc); |
|
|
} |
|
|
|
|
|
xmlFreeFunc * |
|
|
__xmlFree(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->free); |
|
|
} |
|
|
|
|
|
xmlStrdupFunc * |
|
|
__xmlMemStrdup(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->memStrdup); |
|
|
} |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unsigned * |
|
|
xmlGetLocalRngState(void) { |
|
|
return(xmlGetThreadLocalStorage(0)->localRngState); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
xmlCheckThreadLocalStorage(void) { |
|
|
#if defined(LIBXML_THREAD_ENABLED) && !defined(USE_TLS) |
|
|
if (xmlGetThreadLocalStorage(1) == NULL) |
|
|
return(-1); |
|
|
#endif |
|
|
return(0); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmlError * |
|
|
xmlGetLastErrorInternal(void) { |
|
|
return(&xmlGetThreadLocalStorage(0)->lastError); |
|
|
} |
|
|
|
|
|
#ifdef USE_DLL_MAIN |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(LIBXML_STATIC_FOR_DLL) |
|
|
int |
|
|
xmlDllMain(ATTRIBUTE_UNUSED void *hinstDLL, unsigned long fdwReason, |
|
|
ATTRIBUTE_UNUSED void *lpvReserved) |
|
|
#else |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
XMLPUBFUN BOOL WINAPI |
|
|
DllMain (HINSTANCE hinstDLL, |
|
|
DWORD fdwReason, |
|
|
LPVOID lpvReserved); |
|
|
|
|
|
BOOL WINAPI |
|
|
DllMain(ATTRIBUTE_UNUSED HINSTANCE hinstDLL, DWORD fdwReason, |
|
|
ATTRIBUTE_UNUSED LPVOID lpvReserved) |
|
|
#endif |
|
|
{ |
|
|
if ((fdwReason == DLL_THREAD_DETACH) || |
|
|
(fdwReason == DLL_PROCESS_DETACH)) { |
|
|
#ifdef USE_TLS |
|
|
xmlFreeGlobalState(&globalState); |
|
|
#else |
|
|
if (globalkey != TLS_OUT_OF_INDEXES) { |
|
|
xmlGlobalState *globalval; |
|
|
|
|
|
globalval = (xmlGlobalState *) TlsGetValue(globalkey); |
|
|
if (globalval) { |
|
|
xmlFreeGlobalState(globalval); |
|
|
TlsSetValue(globalkey, NULL); |
|
|
} |
|
|
} |
|
|
#endif |
|
|
} |
|
|
|
|
|
#ifndef LIBXML_THREAD_ALLOC_ENABLED |
|
|
if (fdwReason == DLL_PROCESS_DETACH) { |
|
|
if (xmlFree == free) |
|
|
xmlCleanupParser(); |
|
|
if (globalkey != TLS_OUT_OF_INDEXES) { |
|
|
TlsFree(globalkey); |
|
|
globalkey = TLS_OUT_OF_INDEXES; |
|
|
} |
|
|
} |
|
|
#endif |
|
|
|
|
|
return TRUE; |
|
|
} |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
xmlThrDefSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler) { |
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
xmlGenericErrorContextThrDef = ctx; |
|
|
if (handler != NULL) |
|
|
xmlGenericErrorThrDef = handler; |
|
|
else |
|
|
xmlGenericErrorThrDef = xmlGenericErrorDefaultFunc; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
xmlThrDefSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler) { |
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
xmlStructuredErrorContextThrDef = ctx; |
|
|
xmlStructuredErrorThrDef = handler; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int xmlThrDefDoValidityCheckingDefaultValue(int v) { |
|
|
int ret; |
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
ret = xmlDoValidityCheckingDefaultValueThrDef; |
|
|
xmlDoValidityCheckingDefaultValueThrDef = v; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
return ret; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int xmlThrDefGetWarningsDefaultValue(int v) { |
|
|
int ret; |
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
ret = xmlGetWarningsDefaultValueThrDef; |
|
|
xmlGetWarningsDefaultValueThrDef = v; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
return ret; |
|
|
} |
|
|
|
|
|
#ifdef LIBXML_OUTPUT_ENABLED |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int xmlThrDefIndentTreeOutput(int v) { |
|
|
int ret; |
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
ret = xmlIndentTreeOutputThrDef; |
|
|
xmlIndentTreeOutputThrDef = v; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
return ret; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const char * xmlThrDefTreeIndentString(const char * v) { |
|
|
const char * ret; |
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
ret = xmlTreeIndentStringThrDef; |
|
|
xmlTreeIndentStringThrDef = v; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
return ret; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int xmlThrDefSaveNoEmptyTags(int v) { |
|
|
int ret; |
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
ret = xmlSaveNoEmptyTagsThrDef; |
|
|
xmlSaveNoEmptyTagsThrDef = v; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
return ret; |
|
|
} |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int xmlThrDefKeepBlanksDefaultValue(int v) { |
|
|
int ret; |
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
ret = xmlKeepBlanksDefaultValueThrDef; |
|
|
xmlKeepBlanksDefaultValueThrDef = v; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
return ret; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int xmlThrDefLineNumbersDefaultValue(int v ATTRIBUTE_UNUSED) { |
|
|
return 1; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int xmlThrDefLoadExtDtdDefaultValue(int v) { |
|
|
int ret; |
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
ret = xmlLoadExtDtdDefaultValueThrDef; |
|
|
xmlLoadExtDtdDefaultValueThrDef = v; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
return ret; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int xmlThrDefPedanticParserDefaultValue(int v) { |
|
|
int ret; |
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
ret = xmlPedanticParserDefaultValueThrDef; |
|
|
xmlPedanticParserDefaultValueThrDef = v; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
return ret; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int xmlThrDefSubstituteEntitiesDefaultValue(int v) { |
|
|
int ret; |
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
ret = xmlSubstituteEntitiesDefaultValueThrDef; |
|
|
xmlSubstituteEntitiesDefaultValueThrDef = v; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
return ret; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmlRegisterNodeFunc |
|
|
xmlThrDefRegisterNodeDefault(xmlRegisterNodeFunc func) |
|
|
{ |
|
|
xmlRegisterNodeFunc old; |
|
|
|
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
old = xmlRegisterNodeDefaultValueThrDef; |
|
|
|
|
|
xmlRegisterCallbacks = 1; |
|
|
xmlRegisterNodeDefaultValueThrDef = func; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
|
|
|
return(old); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmlDeregisterNodeFunc |
|
|
xmlThrDefDeregisterNodeDefault(xmlDeregisterNodeFunc func) |
|
|
{ |
|
|
xmlDeregisterNodeFunc old; |
|
|
|
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
old = xmlDeregisterNodeDefaultValueThrDef; |
|
|
|
|
|
xmlRegisterCallbacks = 1; |
|
|
xmlDeregisterNodeDefaultValueThrDef = func; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
|
|
|
return(old); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmlParserInputBufferCreateFilenameFunc |
|
|
xmlThrDefParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func) |
|
|
{ |
|
|
xmlParserInputBufferCreateFilenameFunc old; |
|
|
|
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
old = xmlParserInputBufferCreateFilenameValueThrDef; |
|
|
if (old == NULL) { |
|
|
old = __xmlParserInputBufferCreateFilename; |
|
|
} |
|
|
|
|
|
xmlParserInputBufferCreateFilenameValueThrDef = func; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
|
|
|
return(old); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmlOutputBufferCreateFilenameFunc |
|
|
xmlThrDefOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func) |
|
|
{ |
|
|
xmlOutputBufferCreateFilenameFunc old; |
|
|
|
|
|
xmlMutexLock(&xmlThrDefMutex); |
|
|
old = xmlOutputBufferCreateFilenameValueThrDef; |
|
|
#ifdef LIBXML_OUTPUT_ENABLED |
|
|
if (old == NULL) { |
|
|
old = __xmlOutputBufferCreateFilename; |
|
|
} |
|
|
#endif |
|
|
xmlOutputBufferCreateFilenameValueThrDef = func; |
|
|
xmlMutexUnlock(&xmlThrDefMutex); |
|
|
|
|
|
return(old); |
|
|
} |
|
|
|
|
|
|