1*6777b538SAndroid Build Coastguard Worker /*
2*6777b538SAndroid Build Coastguard Worker * globals.c: definition and handling of the set of global variables
3*6777b538SAndroid Build Coastguard Worker * of the library
4*6777b538SAndroid Build Coastguard Worker *
5*6777b538SAndroid Build Coastguard Worker * See Copyright for the status of this software.
6*6777b538SAndroid Build Coastguard Worker *
7*6777b538SAndroid Build Coastguard Worker * Gary Pennington <[email protected]>
8*6777b538SAndroid Build Coastguard Worker * [email protected]
9*6777b538SAndroid Build Coastguard Worker */
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker #define IN_LIBXML
12*6777b538SAndroid Build Coastguard Worker #include "libxml.h"
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker #include <stdio.h>
15*6777b538SAndroid Build Coastguard Worker #include <stdlib.h>
16*6777b538SAndroid Build Coastguard Worker #include <string.h>
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker #define XML_GLOBALS_NO_REDEFINITION
19*6777b538SAndroid Build Coastguard Worker #include <libxml/globals.h>
20*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlerror.h>
21*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlmemory.h>
22*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlIO.h>
23*6777b538SAndroid Build Coastguard Worker #include <libxml/parser.h>
24*6777b538SAndroid Build Coastguard Worker #include <libxml/threads.h>
25*6777b538SAndroid Build Coastguard Worker #include <libxml/tree.h>
26*6777b538SAndroid Build Coastguard Worker #include <libxml/SAX.h>
27*6777b538SAndroid Build Coastguard Worker #include <libxml/SAX2.h>
28*6777b538SAndroid Build Coastguard Worker
29*6777b538SAndroid Build Coastguard Worker #include "private/dict.h"
30*6777b538SAndroid Build Coastguard Worker #include "private/error.h"
31*6777b538SAndroid Build Coastguard Worker #include "private/globals.h"
32*6777b538SAndroid Build Coastguard Worker #include "private/threads.h"
33*6777b538SAndroid Build Coastguard Worker #include "private/tree.h"
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker /*
36*6777b538SAndroid Build Coastguard Worker * Thread-local storage emulation.
37*6777b538SAndroid Build Coastguard Worker *
38*6777b538SAndroid Build Coastguard Worker * This works by replacing a global variable
39*6777b538SAndroid Build Coastguard Worker *
40*6777b538SAndroid Build Coastguard Worker * extern xmlError xmlLastError;
41*6777b538SAndroid Build Coastguard Worker *
42*6777b538SAndroid Build Coastguard Worker * with a macro that calls a function returning a pointer to the global in
43*6777b538SAndroid Build Coastguard Worker * thread-local storage:
44*6777b538SAndroid Build Coastguard Worker *
45*6777b538SAndroid Build Coastguard Worker * xmlError *__xmlLastError(void);
46*6777b538SAndroid Build Coastguard Worker * #define xmlError (*__xmlLastError());
47*6777b538SAndroid Build Coastguard Worker *
48*6777b538SAndroid Build Coastguard Worker * The code can operate in a multitude of ways depending on the environment.
49*6777b538SAndroid Build Coastguard Worker * First we support POSIX and Windows threads. Then we support both thread-local
50*6777b538SAndroid Build Coastguard Worker * storage provided by the compiler and older methods like thread-specific data
51*6777b538SAndroid Build Coastguard Worker * (pthreads) or TlsAlloc (Windows).
52*6777b538SAndroid Build Coastguard Worker *
53*6777b538SAndroid Build Coastguard Worker * To clean up thread-local storage, we use thread-specific data on POSIX.
54*6777b538SAndroid Build Coastguard Worker * On Windows, we either use DllMain when compiling a DLL or a registered wait
55*6777b538SAndroid Build Coastguard Worker * function for static builds.
56*6777b538SAndroid Build Coastguard Worker */
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker /*
59*6777b538SAndroid Build Coastguard Worker * Helpful Macro
60*6777b538SAndroid Build Coastguard Worker */
61*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_THREAD_ENABLED
62*6777b538SAndroid Build Coastguard Worker #define IS_MAIN_THREAD (xmlIsMainThreadInternal())
63*6777b538SAndroid Build Coastguard Worker #else
64*6777b538SAndroid Build Coastguard Worker #define IS_MAIN_THREAD 1
65*6777b538SAndroid Build Coastguard Worker #endif
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Worker #define XML_DECLARE_MEMBER(name, type, attrs) \
68*6777b538SAndroid Build Coastguard Worker type gs_##name;
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard Worker struct _xmlGlobalState {
71*6777b538SAndroid Build Coastguard Worker int initialized;
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker #if defined(HAVE_WIN32_THREADS) && \
74*6777b538SAndroid Build Coastguard Worker defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL)
75*6777b538SAndroid Build Coastguard Worker void *threadHandle;
76*6777b538SAndroid Build Coastguard Worker void *waitHandle;
77*6777b538SAndroid Build Coastguard Worker #endif
78*6777b538SAndroid Build Coastguard Worker
79*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_THREAD_ENABLED
80*6777b538SAndroid Build Coastguard Worker unsigned localRngState[2];
81*6777b538SAndroid Build Coastguard Worker #endif
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker #define XML_OP XML_DECLARE_MEMBER
84*6777b538SAndroid Build Coastguard Worker XML_GLOBALS_ALLOC
85*6777b538SAndroid Build Coastguard Worker XML_GLOBALS_ERROR
86*6777b538SAndroid Build Coastguard Worker XML_GLOBALS_IO
87*6777b538SAndroid Build Coastguard Worker XML_GLOBALS_PARSER
88*6777b538SAndroid Build Coastguard Worker XML_GLOBALS_TREE
89*6777b538SAndroid Build Coastguard Worker #undef XML_OP
90*6777b538SAndroid Build Coastguard Worker };
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker static int parserInitialized;
93*6777b538SAndroid Build Coastguard Worker
94*6777b538SAndroid Build Coastguard Worker /*
95*6777b538SAndroid Build Coastguard Worker * Mutex to protect "ForNewThreads" variables
96*6777b538SAndroid Build Coastguard Worker */
97*6777b538SAndroid Build Coastguard Worker static xmlMutex xmlThrDefMutex;
98*6777b538SAndroid Build Coastguard Worker
99*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_THREAD_ENABLED
100*6777b538SAndroid Build Coastguard Worker
101*6777b538SAndroid Build Coastguard Worker /*
102*6777b538SAndroid Build Coastguard Worker * On Darwin, thread-local storage destructors seem to be run before
103*6777b538SAndroid Build Coastguard Worker * pthread thread-specific data destructors. This causes ASan to
104*6777b538SAndroid Build Coastguard Worker * report a use-after-free.
105*6777b538SAndroid Build Coastguard Worker *
106*6777b538SAndroid Build Coastguard Worker * On Windows, we can't use TLS in static builds. The RegisterWait
107*6777b538SAndroid Build Coastguard Worker * callback would run after TLS was deallocated.
108*6777b538SAndroid Build Coastguard Worker */
109*6777b538SAndroid Build Coastguard Worker #if defined(XML_THREAD_LOCAL) && \
110*6777b538SAndroid Build Coastguard Worker !defined(__APPLE__) && \
111*6777b538SAndroid Build Coastguard Worker (!defined(HAVE_WIN32_THREADS) || \
112*6777b538SAndroid Build Coastguard Worker !defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL))
113*6777b538SAndroid Build Coastguard Worker #define USE_TLS
114*6777b538SAndroid Build Coastguard Worker #endif
115*6777b538SAndroid Build Coastguard Worker
116*6777b538SAndroid Build Coastguard Worker #ifdef USE_TLS
117*6777b538SAndroid Build Coastguard Worker static XML_THREAD_LOCAL xmlGlobalState globalState;
118*6777b538SAndroid Build Coastguard Worker #endif
119*6777b538SAndroid Build Coastguard Worker
120*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_POSIX_THREADS
121*6777b538SAndroid Build Coastguard Worker
122*6777b538SAndroid Build Coastguard Worker /*
123*6777b538SAndroid Build Coastguard Worker * Weak symbol hack, see threads.c
124*6777b538SAndroid Build Coastguard Worker */
125*6777b538SAndroid Build Coastguard Worker #if defined(__GNUC__) && \
126*6777b538SAndroid Build Coastguard Worker defined(__GLIBC__) && \
127*6777b538SAndroid Build Coastguard Worker __GLIBC__ * 100 + __GLIBC_MINOR__ < 234
128*6777b538SAndroid Build Coastguard Worker
129*6777b538SAndroid Build Coastguard Worker #pragma weak pthread_getspecific
130*6777b538SAndroid Build Coastguard Worker #pragma weak pthread_setspecific
131*6777b538SAndroid Build Coastguard Worker #pragma weak pthread_key_create
132*6777b538SAndroid Build Coastguard Worker #pragma weak pthread_key_delete
133*6777b538SAndroid Build Coastguard Worker #pragma weak pthread_equal
134*6777b538SAndroid Build Coastguard Worker #pragma weak pthread_self
135*6777b538SAndroid Build Coastguard Worker
136*6777b538SAndroid Build Coastguard Worker #define XML_PTHREAD_WEAK
137*6777b538SAndroid Build Coastguard Worker
138*6777b538SAndroid Build Coastguard Worker static int libxml_is_threaded = -1;
139*6777b538SAndroid Build Coastguard Worker
140*6777b538SAndroid Build Coastguard Worker #endif
141*6777b538SAndroid Build Coastguard Worker
142*6777b538SAndroid Build Coastguard Worker /*
143*6777b538SAndroid Build Coastguard Worker * On POSIX, we need thread-specific data even with thread-local storage
144*6777b538SAndroid Build Coastguard Worker * to destroy indirect references from global state (xmlLastError) at
145*6777b538SAndroid Build Coastguard Worker * thread exit.
146*6777b538SAndroid Build Coastguard Worker */
147*6777b538SAndroid Build Coastguard Worker static pthread_key_t globalkey;
148*6777b538SAndroid Build Coastguard Worker static pthread_t mainthread;
149*6777b538SAndroid Build Coastguard Worker
150*6777b538SAndroid Build Coastguard Worker #elif defined HAVE_WIN32_THREADS
151*6777b538SAndroid Build Coastguard Worker
152*6777b538SAndroid Build Coastguard Worker #ifndef USE_TLS
153*6777b538SAndroid Build Coastguard Worker static DWORD globalkey = TLS_OUT_OF_INDEXES;
154*6777b538SAndroid Build Coastguard Worker #endif
155*6777b538SAndroid Build Coastguard Worker static DWORD mainthread;
156*6777b538SAndroid Build Coastguard Worker
157*6777b538SAndroid Build Coastguard Worker #endif /* HAVE_WIN32_THREADS */
158*6777b538SAndroid Build Coastguard Worker
159*6777b538SAndroid Build Coastguard Worker static void
160*6777b538SAndroid Build Coastguard Worker xmlFreeGlobalState(void *state);
161*6777b538SAndroid Build Coastguard Worker
162*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_THREAD_ENABLED */
163*6777b538SAndroid Build Coastguard Worker
164*6777b538SAndroid Build Coastguard Worker /************************************************************************
165*6777b538SAndroid Build Coastguard Worker * *
166*6777b538SAndroid Build Coastguard Worker * All the user accessible global variables of the library *
167*6777b538SAndroid Build Coastguard Worker * *
168*6777b538SAndroid Build Coastguard Worker ************************************************************************/
169*6777b538SAndroid Build Coastguard Worker
170*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_THREAD_ENABLED
171*6777b538SAndroid Build Coastguard Worker static unsigned xmlMainThreadRngState[2];
172*6777b538SAndroid Build Coastguard Worker #endif
173*6777b538SAndroid Build Coastguard Worker
174*6777b538SAndroid Build Coastguard Worker /*
175*6777b538SAndroid Build Coastguard Worker * Memory allocation routines
176*6777b538SAndroid Build Coastguard Worker */
177*6777b538SAndroid Build Coastguard Worker
178*6777b538SAndroid Build Coastguard Worker #if defined(DEBUG_MEMORY_LOCATION)
179*6777b538SAndroid Build Coastguard Worker xmlFreeFunc xmlFree = (xmlFreeFunc) xmlMemFree;
180*6777b538SAndroid Build Coastguard Worker xmlMallocFunc xmlMalloc = (xmlMallocFunc) xmlMemMalloc;
181*6777b538SAndroid Build Coastguard Worker xmlMallocFunc xmlMallocAtomic = (xmlMallocFunc) xmlMemMalloc;
182*6777b538SAndroid Build Coastguard Worker xmlReallocFunc xmlRealloc = (xmlReallocFunc) xmlMemRealloc;
183*6777b538SAndroid Build Coastguard Worker xmlStrdupFunc xmlMemStrdup = (xmlStrdupFunc) xmlMemoryStrdup;
184*6777b538SAndroid Build Coastguard Worker #else
185*6777b538SAndroid Build Coastguard Worker /**
186*6777b538SAndroid Build Coastguard Worker * xmlFree:
187*6777b538SAndroid Build Coastguard Worker * @mem: an already allocated block of memory
188*6777b538SAndroid Build Coastguard Worker *
189*6777b538SAndroid Build Coastguard Worker * The variable holding the libxml free() implementation
190*6777b538SAndroid Build Coastguard Worker */
191*6777b538SAndroid Build Coastguard Worker xmlFreeFunc xmlFree = free;
192*6777b538SAndroid Build Coastguard Worker /**
193*6777b538SAndroid Build Coastguard Worker * xmlMalloc:
194*6777b538SAndroid Build Coastguard Worker * @size: the size requested in bytes
195*6777b538SAndroid Build Coastguard Worker *
196*6777b538SAndroid Build Coastguard Worker * The variable holding the libxml malloc() implementation
197*6777b538SAndroid Build Coastguard Worker *
198*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the newly allocated block or NULL in case of error
199*6777b538SAndroid Build Coastguard Worker */
200*6777b538SAndroid Build Coastguard Worker xmlMallocFunc xmlMalloc = malloc;
201*6777b538SAndroid Build Coastguard Worker /**
202*6777b538SAndroid Build Coastguard Worker * xmlMallocAtomic:
203*6777b538SAndroid Build Coastguard Worker * @size: the size requested in bytes
204*6777b538SAndroid Build Coastguard Worker *
205*6777b538SAndroid Build Coastguard Worker * The variable holding the libxml malloc() implementation for atomic
206*6777b538SAndroid Build Coastguard Worker * data (i.e. blocks not containing pointers), useful when using a
207*6777b538SAndroid Build Coastguard Worker * garbage collecting allocator.
208*6777b538SAndroid Build Coastguard Worker *
209*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the newly allocated block or NULL in case of error
210*6777b538SAndroid Build Coastguard Worker */
211*6777b538SAndroid Build Coastguard Worker xmlMallocFunc xmlMallocAtomic = malloc;
212*6777b538SAndroid Build Coastguard Worker /**
213*6777b538SAndroid Build Coastguard Worker * xmlRealloc:
214*6777b538SAndroid Build Coastguard Worker * @mem: an already allocated block of memory
215*6777b538SAndroid Build Coastguard Worker * @size: the new size requested in bytes
216*6777b538SAndroid Build Coastguard Worker *
217*6777b538SAndroid Build Coastguard Worker * The variable holding the libxml realloc() implementation
218*6777b538SAndroid Build Coastguard Worker *
219*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the newly reallocated block or NULL in case of error
220*6777b538SAndroid Build Coastguard Worker */
221*6777b538SAndroid Build Coastguard Worker xmlReallocFunc xmlRealloc = realloc;
222*6777b538SAndroid Build Coastguard Worker /**
223*6777b538SAndroid Build Coastguard Worker * xmlPosixStrdup
224*6777b538SAndroid Build Coastguard Worker * @cur: the input char *
225*6777b538SAndroid Build Coastguard Worker *
226*6777b538SAndroid Build Coastguard Worker * a strdup implementation with a type signature matching POSIX
227*6777b538SAndroid Build Coastguard Worker *
228*6777b538SAndroid Build Coastguard Worker * Returns a new xmlChar * or NULL
229*6777b538SAndroid Build Coastguard Worker */
230*6777b538SAndroid Build Coastguard Worker static char *
xmlPosixStrdup(const char * cur)231*6777b538SAndroid Build Coastguard Worker xmlPosixStrdup(const char *cur) {
232*6777b538SAndroid Build Coastguard Worker return((char*) xmlCharStrdup(cur));
233*6777b538SAndroid Build Coastguard Worker }
234*6777b538SAndroid Build Coastguard Worker /**
235*6777b538SAndroid Build Coastguard Worker * xmlMemStrdup:
236*6777b538SAndroid Build Coastguard Worker * @str: a zero terminated string
237*6777b538SAndroid Build Coastguard Worker *
238*6777b538SAndroid Build Coastguard Worker * The variable holding the libxml strdup() implementation
239*6777b538SAndroid Build Coastguard Worker *
240*6777b538SAndroid Build Coastguard Worker * Returns the copy of the string or NULL in case of error
241*6777b538SAndroid Build Coastguard Worker */
242*6777b538SAndroid Build Coastguard Worker xmlStrdupFunc xmlMemStrdup = xmlPosixStrdup;
243*6777b538SAndroid Build Coastguard Worker #endif /* DEBUG_MEMORY_LOCATION */
244*6777b538SAndroid Build Coastguard Worker
245*6777b538SAndroid Build Coastguard Worker /**
246*6777b538SAndroid Build Coastguard Worker * xmlBufferAllocScheme:
247*6777b538SAndroid Build Coastguard Worker *
248*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use.
249*6777b538SAndroid Build Coastguard Worker *
250*6777b538SAndroid Build Coastguard Worker * Global setting, default allocation policy for buffers, default is
251*6777b538SAndroid Build Coastguard Worker * XML_BUFFER_ALLOC_EXACT
252*6777b538SAndroid Build Coastguard Worker */
253*6777b538SAndroid Build Coastguard Worker xmlBufferAllocationScheme xmlBufferAllocScheme = XML_BUFFER_ALLOC_EXACT;
254*6777b538SAndroid Build Coastguard Worker static xmlBufferAllocationScheme xmlBufferAllocSchemeThrDef = XML_BUFFER_ALLOC_EXACT;
255*6777b538SAndroid Build Coastguard Worker /**
256*6777b538SAndroid Build Coastguard Worker * xmlDefaultBufferSize:
257*6777b538SAndroid Build Coastguard Worker *
258*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use.
259*6777b538SAndroid Build Coastguard Worker *
260*6777b538SAndroid Build Coastguard Worker * Global setting, default buffer size. Default value is BASE_BUFFER_SIZE
261*6777b538SAndroid Build Coastguard Worker */
262*6777b538SAndroid Build Coastguard Worker int xmlDefaultBufferSize = BASE_BUFFER_SIZE;
263*6777b538SAndroid Build Coastguard Worker static int xmlDefaultBufferSizeThrDef = BASE_BUFFER_SIZE;
264*6777b538SAndroid Build Coastguard Worker
265*6777b538SAndroid Build Coastguard Worker /*
266*6777b538SAndroid Build Coastguard Worker * Parser defaults
267*6777b538SAndroid Build Coastguard Worker */
268*6777b538SAndroid Build Coastguard Worker
269*6777b538SAndroid Build Coastguard Worker /**
270*6777b538SAndroid Build Coastguard Worker * oldXMLWDcompatibility:
271*6777b538SAndroid Build Coastguard Worker *
272*6777b538SAndroid Build Coastguard Worker * Global setting, DEPRECATED.
273*6777b538SAndroid Build Coastguard Worker */
274*6777b538SAndroid Build Coastguard Worker const int oldXMLWDcompatibility = 0; /* DEPRECATED */
275*6777b538SAndroid Build Coastguard Worker /**
276*6777b538SAndroid Build Coastguard Worker * xmlParserDebugEntities:
277*6777b538SAndroid Build Coastguard Worker *
278*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use
279*6777b538SAndroid Build Coastguard Worker *
280*6777b538SAndroid Build Coastguard Worker * Global setting, asking the parser to print out debugging information.
281*6777b538SAndroid Build Coastguard Worker * while handling entities.
282*6777b538SAndroid Build Coastguard Worker * Disabled by default
283*6777b538SAndroid Build Coastguard Worker */
284*6777b538SAndroid Build Coastguard Worker const int xmlParserDebugEntities = 0;
285*6777b538SAndroid Build Coastguard Worker /**
286*6777b538SAndroid Build Coastguard Worker * xmlDoValidityCheckingDefaultValue:
287*6777b538SAndroid Build Coastguard Worker *
288*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Use the modern options API with XML_PARSE_DTDVALID.
289*6777b538SAndroid Build Coastguard Worker *
290*6777b538SAndroid Build Coastguard Worker * Global setting, indicate that the parser should work in validating mode.
291*6777b538SAndroid Build Coastguard Worker * Disabled by default.
292*6777b538SAndroid Build Coastguard Worker */
293*6777b538SAndroid Build Coastguard Worker int xmlDoValidityCheckingDefaultValue = 0;
294*6777b538SAndroid Build Coastguard Worker static int xmlDoValidityCheckingDefaultValueThrDef = 0;
295*6777b538SAndroid Build Coastguard Worker /**
296*6777b538SAndroid Build Coastguard Worker * xmlGetWarningsDefaultValue:
297*6777b538SAndroid Build Coastguard Worker *
298*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Use the modern options API with XML_PARSE_NOWARNING.
299*6777b538SAndroid Build Coastguard Worker *
300*6777b538SAndroid Build Coastguard Worker * Global setting, indicate that the DTD validation should provide warnings.
301*6777b538SAndroid Build Coastguard Worker * Activated by default.
302*6777b538SAndroid Build Coastguard Worker */
303*6777b538SAndroid Build Coastguard Worker int xmlGetWarningsDefaultValue = 1;
304*6777b538SAndroid Build Coastguard Worker static int xmlGetWarningsDefaultValueThrDef = 1;
305*6777b538SAndroid Build Coastguard Worker /**
306*6777b538SAndroid Build Coastguard Worker * xmlLoadExtDtdDefaultValue:
307*6777b538SAndroid Build Coastguard Worker *
308*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Use the modern options API with XML_PARSE_DTDLOAD.
309*6777b538SAndroid Build Coastguard Worker *
310*6777b538SAndroid Build Coastguard Worker * Global setting, indicate that the parser should load DTD while not
311*6777b538SAndroid Build Coastguard Worker * validating.
312*6777b538SAndroid Build Coastguard Worker * Disabled by default.
313*6777b538SAndroid Build Coastguard Worker */
314*6777b538SAndroid Build Coastguard Worker int xmlLoadExtDtdDefaultValue = 0;
315*6777b538SAndroid Build Coastguard Worker static int xmlLoadExtDtdDefaultValueThrDef = 0;
316*6777b538SAndroid Build Coastguard Worker /**
317*6777b538SAndroid Build Coastguard Worker * xmlPedanticParserDefaultValue:
318*6777b538SAndroid Build Coastguard Worker *
319*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Use the modern options API with XML_PARSE_PEDANTIC.
320*6777b538SAndroid Build Coastguard Worker *
321*6777b538SAndroid Build Coastguard Worker * Global setting, indicate that the parser be pedantic
322*6777b538SAndroid Build Coastguard Worker * Disabled by default.
323*6777b538SAndroid Build Coastguard Worker */
324*6777b538SAndroid Build Coastguard Worker int xmlPedanticParserDefaultValue = 0;
325*6777b538SAndroid Build Coastguard Worker static int xmlPedanticParserDefaultValueThrDef = 0;
326*6777b538SAndroid Build Coastguard Worker /**
327*6777b538SAndroid Build Coastguard Worker * xmlLineNumbersDefaultValue:
328*6777b538SAndroid Build Coastguard Worker *
329*6777b538SAndroid Build Coastguard Worker * DEPRECATED: The modern options API always enables line numbers.
330*6777b538SAndroid Build Coastguard Worker *
331*6777b538SAndroid Build Coastguard Worker * Global setting, indicate that the parser should store the line number
332*6777b538SAndroid Build Coastguard Worker * in the content field of elements in the DOM tree.
333*6777b538SAndroid Build Coastguard Worker * Disabled by default since this may not be safe for old classes of
334*6777b538SAndroid Build Coastguard Worker * application.
335*6777b538SAndroid Build Coastguard Worker */
336*6777b538SAndroid Build Coastguard Worker int xmlLineNumbersDefaultValue = 0;
337*6777b538SAndroid Build Coastguard Worker static int xmlLineNumbersDefaultValueThrDef = 0;
338*6777b538SAndroid Build Coastguard Worker /**
339*6777b538SAndroid Build Coastguard Worker * xmlKeepBlanksDefaultValue:
340*6777b538SAndroid Build Coastguard Worker *
341*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Use the modern options API with XML_PARSE_NOBLANKS.
342*6777b538SAndroid Build Coastguard Worker *
343*6777b538SAndroid Build Coastguard Worker * Global setting, indicate that the parser should keep all blanks
344*6777b538SAndroid Build Coastguard Worker * nodes found in the content
345*6777b538SAndroid Build Coastguard Worker * Activated by default, this is actually needed to have the parser
346*6777b538SAndroid Build Coastguard Worker * conformant to the XML Recommendation, however the option is kept
347*6777b538SAndroid Build Coastguard Worker * for some applications since this was libxml1 default behaviour.
348*6777b538SAndroid Build Coastguard Worker */
349*6777b538SAndroid Build Coastguard Worker int xmlKeepBlanksDefaultValue = 1;
350*6777b538SAndroid Build Coastguard Worker static int xmlKeepBlanksDefaultValueThrDef = 1;
351*6777b538SAndroid Build Coastguard Worker /**
352*6777b538SAndroid Build Coastguard Worker * xmlSubstituteEntitiesDefaultValue:
353*6777b538SAndroid Build Coastguard Worker *
354*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Use the modern options API with XML_PARSE_NOENT.
355*6777b538SAndroid Build Coastguard Worker *
356*6777b538SAndroid Build Coastguard Worker * Global setting, indicate that the parser should not generate entity
357*6777b538SAndroid Build Coastguard Worker * references but replace them with the actual content of the entity
358*6777b538SAndroid Build Coastguard Worker * Disabled by default, this should be activated when using XPath since
359*6777b538SAndroid Build Coastguard Worker * the XPath data model requires entities replacement and the XPath
360*6777b538SAndroid Build Coastguard Worker * engine does not handle entities references transparently.
361*6777b538SAndroid Build Coastguard Worker */
362*6777b538SAndroid Build Coastguard Worker int xmlSubstituteEntitiesDefaultValue = 0;
363*6777b538SAndroid Build Coastguard Worker static int xmlSubstituteEntitiesDefaultValueThrDef = 0;
364*6777b538SAndroid Build Coastguard Worker
365*6777b538SAndroid Build Coastguard Worker /**
366*6777b538SAndroid Build Coastguard Worker * xmlRegisterNodeDefaultValue:
367*6777b538SAndroid Build Coastguard Worker *
368*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use
369*6777b538SAndroid Build Coastguard Worker */
370*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeFunc xmlRegisterNodeDefaultValue = NULL;
371*6777b538SAndroid Build Coastguard Worker static xmlRegisterNodeFunc xmlRegisterNodeDefaultValueThrDef = NULL;
372*6777b538SAndroid Build Coastguard Worker
373*6777b538SAndroid Build Coastguard Worker /**
374*6777b538SAndroid Build Coastguard Worker * xmlDeregisterNodeDefaultValue:
375*6777b538SAndroid Build Coastguard Worker *
376*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use
377*6777b538SAndroid Build Coastguard Worker */
378*6777b538SAndroid Build Coastguard Worker xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue = NULL;
379*6777b538SAndroid Build Coastguard Worker static xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValueThrDef = NULL;
380*6777b538SAndroid Build Coastguard Worker
381*6777b538SAndroid Build Coastguard Worker /**
382*6777b538SAndroid Build Coastguard Worker * xmlParserInputBufferCreateFilenameValue:
383*6777b538SAndroid Build Coastguard Worker *
384*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use
385*6777b538SAndroid Build Coastguard Worker */
386*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValue = NULL;
387*6777b538SAndroid Build Coastguard Worker static xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValueThrDef = NULL;
388*6777b538SAndroid Build Coastguard Worker
389*6777b538SAndroid Build Coastguard Worker /**
390*6777b538SAndroid Build Coastguard Worker * xmlOutputBufferCreateFilenameValue:
391*6777b538SAndroid Build Coastguard Worker *
392*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use
393*6777b538SAndroid Build Coastguard Worker */
394*6777b538SAndroid Build Coastguard Worker xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValue = NULL;
395*6777b538SAndroid Build Coastguard Worker static xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValueThrDef = NULL;
396*6777b538SAndroid Build Coastguard Worker
397*6777b538SAndroid Build Coastguard Worker /**
398*6777b538SAndroid Build Coastguard Worker * xmlGenericError:
399*6777b538SAndroid Build Coastguard Worker *
400*6777b538SAndroid Build Coastguard Worker * Global setting: function used for generic error callbacks
401*6777b538SAndroid Build Coastguard Worker */
402*6777b538SAndroid Build Coastguard Worker xmlGenericErrorFunc xmlGenericError = xmlGenericErrorDefaultFunc;
403*6777b538SAndroid Build Coastguard Worker static xmlGenericErrorFunc xmlGenericErrorThrDef = xmlGenericErrorDefaultFunc;
404*6777b538SAndroid Build Coastguard Worker /**
405*6777b538SAndroid Build Coastguard Worker * xmlStructuredError:
406*6777b538SAndroid Build Coastguard Worker *
407*6777b538SAndroid Build Coastguard Worker * Global setting: function used for structured error callbacks
408*6777b538SAndroid Build Coastguard Worker */
409*6777b538SAndroid Build Coastguard Worker xmlStructuredErrorFunc xmlStructuredError = NULL;
410*6777b538SAndroid Build Coastguard Worker static xmlStructuredErrorFunc xmlStructuredErrorThrDef = NULL;
411*6777b538SAndroid Build Coastguard Worker /**
412*6777b538SAndroid Build Coastguard Worker * xmlGenericErrorContext:
413*6777b538SAndroid Build Coastguard Worker *
414*6777b538SAndroid Build Coastguard Worker * Global setting passed to generic error callbacks
415*6777b538SAndroid Build Coastguard Worker */
416*6777b538SAndroid Build Coastguard Worker void *xmlGenericErrorContext = NULL;
417*6777b538SAndroid Build Coastguard Worker static void *xmlGenericErrorContextThrDef = NULL;
418*6777b538SAndroid Build Coastguard Worker /**
419*6777b538SAndroid Build Coastguard Worker * xmlStructuredErrorContext:
420*6777b538SAndroid Build Coastguard Worker *
421*6777b538SAndroid Build Coastguard Worker * Global setting passed to structured error callbacks
422*6777b538SAndroid Build Coastguard Worker */
423*6777b538SAndroid Build Coastguard Worker void *xmlStructuredErrorContext = NULL;
424*6777b538SAndroid Build Coastguard Worker static void *xmlStructuredErrorContextThrDef = NULL;
425*6777b538SAndroid Build Coastguard Worker xmlError xmlLastError;
426*6777b538SAndroid Build Coastguard Worker
427*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
428*6777b538SAndroid Build Coastguard Worker /*
429*6777b538SAndroid Build Coastguard Worker * output defaults
430*6777b538SAndroid Build Coastguard Worker */
431*6777b538SAndroid Build Coastguard Worker /**
432*6777b538SAndroid Build Coastguard Worker * xmlIndentTreeOutput:
433*6777b538SAndroid Build Coastguard Worker *
434*6777b538SAndroid Build Coastguard Worker * Global setting, asking the serializer to indent the output tree by default
435*6777b538SAndroid Build Coastguard Worker * Enabled by default
436*6777b538SAndroid Build Coastguard Worker */
437*6777b538SAndroid Build Coastguard Worker int xmlIndentTreeOutput = 1;
438*6777b538SAndroid Build Coastguard Worker static int xmlIndentTreeOutputThrDef = 1;
439*6777b538SAndroid Build Coastguard Worker
440*6777b538SAndroid Build Coastguard Worker /**
441*6777b538SAndroid Build Coastguard Worker * xmlTreeIndentString:
442*6777b538SAndroid Build Coastguard Worker *
443*6777b538SAndroid Build Coastguard Worker * The string used to do one-level indent. By default is equal to " " (two spaces)
444*6777b538SAndroid Build Coastguard Worker */
445*6777b538SAndroid Build Coastguard Worker const char *xmlTreeIndentString = " ";
446*6777b538SAndroid Build Coastguard Worker static const char *xmlTreeIndentStringThrDef = " ";
447*6777b538SAndroid Build Coastguard Worker
448*6777b538SAndroid Build Coastguard Worker /**
449*6777b538SAndroid Build Coastguard Worker * xmlSaveNoEmptyTags:
450*6777b538SAndroid Build Coastguard Worker *
451*6777b538SAndroid Build Coastguard Worker * Global setting, asking the serializer to not output empty tags
452*6777b538SAndroid Build Coastguard Worker * as <empty/> but <empty></empty>. those two forms are indistinguishable
453*6777b538SAndroid Build Coastguard Worker * once parsed.
454*6777b538SAndroid Build Coastguard Worker * Disabled by default
455*6777b538SAndroid Build Coastguard Worker */
456*6777b538SAndroid Build Coastguard Worker int xmlSaveNoEmptyTags = 0;
457*6777b538SAndroid Build Coastguard Worker static int xmlSaveNoEmptyTagsThrDef = 0;
458*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
459*6777b538SAndroid Build Coastguard Worker
460*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
461*6777b538SAndroid Build Coastguard Worker /**
462*6777b538SAndroid Build Coastguard Worker * xmlDefaultSAXHandler:
463*6777b538SAndroid Build Coastguard Worker *
464*6777b538SAndroid Build Coastguard Worker * DEPRECATED: This handler is unused and will be removed from future
465*6777b538SAndroid Build Coastguard Worker * versions.
466*6777b538SAndroid Build Coastguard Worker *
467*6777b538SAndroid Build Coastguard Worker * Default SAX version1 handler for XML, builds the DOM tree
468*6777b538SAndroid Build Coastguard Worker */
469*6777b538SAndroid Build Coastguard Worker const xmlSAXHandlerV1 xmlDefaultSAXHandler = {
470*6777b538SAndroid Build Coastguard Worker xmlSAX2InternalSubset,
471*6777b538SAndroid Build Coastguard Worker xmlSAX2IsStandalone,
472*6777b538SAndroid Build Coastguard Worker xmlSAX2HasInternalSubset,
473*6777b538SAndroid Build Coastguard Worker xmlSAX2HasExternalSubset,
474*6777b538SAndroid Build Coastguard Worker xmlSAX2ResolveEntity,
475*6777b538SAndroid Build Coastguard Worker xmlSAX2GetEntity,
476*6777b538SAndroid Build Coastguard Worker xmlSAX2EntityDecl,
477*6777b538SAndroid Build Coastguard Worker xmlSAX2NotationDecl,
478*6777b538SAndroid Build Coastguard Worker xmlSAX2AttributeDecl,
479*6777b538SAndroid Build Coastguard Worker xmlSAX2ElementDecl,
480*6777b538SAndroid Build Coastguard Worker xmlSAX2UnparsedEntityDecl,
481*6777b538SAndroid Build Coastguard Worker xmlSAX2SetDocumentLocator,
482*6777b538SAndroid Build Coastguard Worker xmlSAX2StartDocument,
483*6777b538SAndroid Build Coastguard Worker xmlSAX2EndDocument,
484*6777b538SAndroid Build Coastguard Worker xmlSAX2StartElement,
485*6777b538SAndroid Build Coastguard Worker xmlSAX2EndElement,
486*6777b538SAndroid Build Coastguard Worker xmlSAX2Reference,
487*6777b538SAndroid Build Coastguard Worker xmlSAX2Characters,
488*6777b538SAndroid Build Coastguard Worker xmlSAX2Characters,
489*6777b538SAndroid Build Coastguard Worker xmlSAX2ProcessingInstruction,
490*6777b538SAndroid Build Coastguard Worker xmlSAX2Comment,
491*6777b538SAndroid Build Coastguard Worker xmlParserWarning,
492*6777b538SAndroid Build Coastguard Worker xmlParserError,
493*6777b538SAndroid Build Coastguard Worker xmlParserError,
494*6777b538SAndroid Build Coastguard Worker xmlSAX2GetParameterEntity,
495*6777b538SAndroid Build Coastguard Worker xmlSAX2CDataBlock,
496*6777b538SAndroid Build Coastguard Worker xmlSAX2ExternalSubset,
497*6777b538SAndroid Build Coastguard Worker 1,
498*6777b538SAndroid Build Coastguard Worker };
499*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_SAX1_ENABLED */
500*6777b538SAndroid Build Coastguard Worker
501*6777b538SAndroid Build Coastguard Worker /**
502*6777b538SAndroid Build Coastguard Worker * xmlDefaultSAXLocator:
503*6777b538SAndroid Build Coastguard Worker *
504*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use
505*6777b538SAndroid Build Coastguard Worker *
506*6777b538SAndroid Build Coastguard Worker * The default SAX Locator
507*6777b538SAndroid Build Coastguard Worker * { getPublicId, getSystemId, getLineNumber, getColumnNumber}
508*6777b538SAndroid Build Coastguard Worker */
509*6777b538SAndroid Build Coastguard Worker const xmlSAXLocator xmlDefaultSAXLocator = {
510*6777b538SAndroid Build Coastguard Worker xmlSAX2GetPublicId,
511*6777b538SAndroid Build Coastguard Worker xmlSAX2GetSystemId,
512*6777b538SAndroid Build Coastguard Worker xmlSAX2GetLineNumber,
513*6777b538SAndroid Build Coastguard Worker xmlSAX2GetColumnNumber
514*6777b538SAndroid Build Coastguard Worker };
515*6777b538SAndroid Build Coastguard Worker
516*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_SAX1_ENABLED)
517*6777b538SAndroid Build Coastguard Worker /**
518*6777b538SAndroid Build Coastguard Worker * htmlDefaultSAXHandler:
519*6777b538SAndroid Build Coastguard Worker *
520*6777b538SAndroid Build Coastguard Worker * DEPRECATED: This handler is unused and will be removed from future
521*6777b538SAndroid Build Coastguard Worker * versions.
522*6777b538SAndroid Build Coastguard Worker *
523*6777b538SAndroid Build Coastguard Worker * Default old SAX v1 handler for HTML, builds the DOM tree
524*6777b538SAndroid Build Coastguard Worker */
525*6777b538SAndroid Build Coastguard Worker const xmlSAXHandlerV1 htmlDefaultSAXHandler = {
526*6777b538SAndroid Build Coastguard Worker xmlSAX2InternalSubset,
527*6777b538SAndroid Build Coastguard Worker NULL,
528*6777b538SAndroid Build Coastguard Worker NULL,
529*6777b538SAndroid Build Coastguard Worker NULL,
530*6777b538SAndroid Build Coastguard Worker NULL,
531*6777b538SAndroid Build Coastguard Worker xmlSAX2GetEntity,
532*6777b538SAndroid Build Coastguard Worker NULL,
533*6777b538SAndroid Build Coastguard Worker NULL,
534*6777b538SAndroid Build Coastguard Worker NULL,
535*6777b538SAndroid Build Coastguard Worker NULL,
536*6777b538SAndroid Build Coastguard Worker NULL,
537*6777b538SAndroid Build Coastguard Worker xmlSAX2SetDocumentLocator,
538*6777b538SAndroid Build Coastguard Worker xmlSAX2StartDocument,
539*6777b538SAndroid Build Coastguard Worker xmlSAX2EndDocument,
540*6777b538SAndroid Build Coastguard Worker xmlSAX2StartElement,
541*6777b538SAndroid Build Coastguard Worker xmlSAX2EndElement,
542*6777b538SAndroid Build Coastguard Worker NULL,
543*6777b538SAndroid Build Coastguard Worker xmlSAX2Characters,
544*6777b538SAndroid Build Coastguard Worker xmlSAX2IgnorableWhitespace,
545*6777b538SAndroid Build Coastguard Worker xmlSAX2ProcessingInstruction,
546*6777b538SAndroid Build Coastguard Worker xmlSAX2Comment,
547*6777b538SAndroid Build Coastguard Worker xmlParserWarning,
548*6777b538SAndroid Build Coastguard Worker xmlParserError,
549*6777b538SAndroid Build Coastguard Worker xmlParserError,
550*6777b538SAndroid Build Coastguard Worker NULL,
551*6777b538SAndroid Build Coastguard Worker xmlSAX2CDataBlock,
552*6777b538SAndroid Build Coastguard Worker NULL,
553*6777b538SAndroid Build Coastguard Worker 1,
554*6777b538SAndroid Build Coastguard Worker };
555*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_HTML_ENABLED */
556*6777b538SAndroid Build Coastguard Worker
557*6777b538SAndroid Build Coastguard Worker /************************************************************************
558*6777b538SAndroid Build Coastguard Worker * *
559*6777b538SAndroid Build Coastguard Worker * Per thread global state handling *
560*6777b538SAndroid Build Coastguard Worker * *
561*6777b538SAndroid Build Coastguard Worker ************************************************************************/
562*6777b538SAndroid Build Coastguard Worker
563*6777b538SAndroid Build Coastguard Worker /**
564*6777b538SAndroid Build Coastguard Worker * xmlInitGlobals:
565*6777b538SAndroid Build Coastguard Worker *
566*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Alias for xmlInitParser.
567*6777b538SAndroid Build Coastguard Worker */
xmlInitGlobals(void)568*6777b538SAndroid Build Coastguard Worker void xmlInitGlobals(void) {
569*6777b538SAndroid Build Coastguard Worker xmlInitParser();
570*6777b538SAndroid Build Coastguard Worker }
571*6777b538SAndroid Build Coastguard Worker
572*6777b538SAndroid Build Coastguard Worker /**
573*6777b538SAndroid Build Coastguard Worker * xmlInitGlobalsInternal:
574*6777b538SAndroid Build Coastguard Worker *
575*6777b538SAndroid Build Coastguard Worker * Additional initialisation for multi-threading
576*6777b538SAndroid Build Coastguard Worker */
xmlInitGlobalsInternal(void)577*6777b538SAndroid Build Coastguard Worker void xmlInitGlobalsInternal(void) {
578*6777b538SAndroid Build Coastguard Worker xmlInitMutex(&xmlThrDefMutex);
579*6777b538SAndroid Build Coastguard Worker
580*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_POSIX_THREADS
581*6777b538SAndroid Build Coastguard Worker #ifdef XML_PTHREAD_WEAK
582*6777b538SAndroid Build Coastguard Worker if (libxml_is_threaded == -1)
583*6777b538SAndroid Build Coastguard Worker libxml_is_threaded =
584*6777b538SAndroid Build Coastguard Worker (pthread_getspecific != NULL) &&
585*6777b538SAndroid Build Coastguard Worker (pthread_setspecific != NULL) &&
586*6777b538SAndroid Build Coastguard Worker (pthread_key_create != NULL) &&
587*6777b538SAndroid Build Coastguard Worker (pthread_key_delete != NULL) &&
588*6777b538SAndroid Build Coastguard Worker /*
589*6777b538SAndroid Build Coastguard Worker * pthread_equal can be inline, resuting in -Waddress warnings.
590*6777b538SAndroid Build Coastguard Worker * Let's assume it's available if all the other functions are.
591*6777b538SAndroid Build Coastguard Worker */
592*6777b538SAndroid Build Coastguard Worker /* (pthread_equal != NULL) && */
593*6777b538SAndroid Build Coastguard Worker (pthread_self != NULL);
594*6777b538SAndroid Build Coastguard Worker if (libxml_is_threaded == 0)
595*6777b538SAndroid Build Coastguard Worker return;
596*6777b538SAndroid Build Coastguard Worker #endif /* XML_PTHREAD_WEAK */
597*6777b538SAndroid Build Coastguard Worker pthread_key_create(&globalkey, xmlFreeGlobalState);
598*6777b538SAndroid Build Coastguard Worker mainthread = pthread_self();
599*6777b538SAndroid Build Coastguard Worker #elif defined(HAVE_WIN32_THREADS)
600*6777b538SAndroid Build Coastguard Worker #ifndef USE_TLS
601*6777b538SAndroid Build Coastguard Worker globalkey = TlsAlloc();
602*6777b538SAndroid Build Coastguard Worker #endif
603*6777b538SAndroid Build Coastguard Worker mainthread = GetCurrentThreadId();
604*6777b538SAndroid Build Coastguard Worker #endif
605*6777b538SAndroid Build Coastguard Worker
606*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_THREAD_ENABLED
607*6777b538SAndroid Build Coastguard Worker xmlMainThreadRngState[0] = xmlGlobalRandom();
608*6777b538SAndroid Build Coastguard Worker xmlMainThreadRngState[1] = xmlGlobalRandom();
609*6777b538SAndroid Build Coastguard Worker #endif
610*6777b538SAndroid Build Coastguard Worker }
611*6777b538SAndroid Build Coastguard Worker
612*6777b538SAndroid Build Coastguard Worker /**
613*6777b538SAndroid Build Coastguard Worker * xmlCleanupGlobals:
614*6777b538SAndroid Build Coastguard Worker *
615*6777b538SAndroid Build Coastguard Worker * DEPRECATED: This function is a no-op. Call xmlCleanupParser
616*6777b538SAndroid Build Coastguard Worker * to free global state but see the warnings there. xmlCleanupParser
617*6777b538SAndroid Build Coastguard Worker * should be only called once at program exit. In most cases, you don't
618*6777b538SAndroid Build Coastguard Worker * have call cleanup functions at all.
619*6777b538SAndroid Build Coastguard Worker */
xmlCleanupGlobals(void)620*6777b538SAndroid Build Coastguard Worker void xmlCleanupGlobals(void) {
621*6777b538SAndroid Build Coastguard Worker }
622*6777b538SAndroid Build Coastguard Worker
623*6777b538SAndroid Build Coastguard Worker /**
624*6777b538SAndroid Build Coastguard Worker * xmlCleanupGlobalsInternal:
625*6777b538SAndroid Build Coastguard Worker *
626*6777b538SAndroid Build Coastguard Worker * Additional cleanup for multi-threading
627*6777b538SAndroid Build Coastguard Worker */
xmlCleanupGlobalsInternal(void)628*6777b538SAndroid Build Coastguard Worker void xmlCleanupGlobalsInternal(void) {
629*6777b538SAndroid Build Coastguard Worker xmlResetError(&xmlLastError);
630*6777b538SAndroid Build Coastguard Worker
631*6777b538SAndroid Build Coastguard Worker xmlCleanupMutex(&xmlThrDefMutex);
632*6777b538SAndroid Build Coastguard Worker
633*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_POSIX_THREADS
634*6777b538SAndroid Build Coastguard Worker #ifdef XML_PTHREAD_WEAK
635*6777b538SAndroid Build Coastguard Worker if (libxml_is_threaded == 0)
636*6777b538SAndroid Build Coastguard Worker return;
637*6777b538SAndroid Build Coastguard Worker #endif /* XML_PTHREAD_WEAK */
638*6777b538SAndroid Build Coastguard Worker pthread_key_delete(globalkey);
639*6777b538SAndroid Build Coastguard Worker #elif defined(HAVE_WIN32_THREADS)
640*6777b538SAndroid Build Coastguard Worker #ifndef USE_TLS
641*6777b538SAndroid Build Coastguard Worker if (globalkey != TLS_OUT_OF_INDEXES) {
642*6777b538SAndroid Build Coastguard Worker TlsFree(globalkey);
643*6777b538SAndroid Build Coastguard Worker globalkey = TLS_OUT_OF_INDEXES;
644*6777b538SAndroid Build Coastguard Worker }
645*6777b538SAndroid Build Coastguard Worker #endif
646*6777b538SAndroid Build Coastguard Worker #endif
647*6777b538SAndroid Build Coastguard Worker
648*6777b538SAndroid Build Coastguard Worker parserInitialized = 0;
649*6777b538SAndroid Build Coastguard Worker }
650*6777b538SAndroid Build Coastguard Worker
651*6777b538SAndroid Build Coastguard Worker /**
652*6777b538SAndroid Build Coastguard Worker * xmlInitializeGlobalState:
653*6777b538SAndroid Build Coastguard Worker * @gs: a pointer to a newly allocated global state
654*6777b538SAndroid Build Coastguard Worker *
655*6777b538SAndroid Build Coastguard Worker * DEPRECATED: No-op.
656*6777b538SAndroid Build Coastguard Worker */
657*6777b538SAndroid Build Coastguard Worker void
xmlInitializeGlobalState(xmlGlobalStatePtr gs ATTRIBUTE_UNUSED)658*6777b538SAndroid Build Coastguard Worker xmlInitializeGlobalState(xmlGlobalStatePtr gs ATTRIBUTE_UNUSED)
659*6777b538SAndroid Build Coastguard Worker {
660*6777b538SAndroid Build Coastguard Worker }
661*6777b538SAndroid Build Coastguard Worker
662*6777b538SAndroid Build Coastguard Worker /**
663*6777b538SAndroid Build Coastguard Worker * xmlGetGlobalState:
664*6777b538SAndroid Build Coastguard Worker *
665*6777b538SAndroid Build Coastguard Worker * DEPRECATED
666*6777b538SAndroid Build Coastguard Worker *
667*6777b538SAndroid Build Coastguard Worker * Returns NULL.
668*6777b538SAndroid Build Coastguard Worker */
669*6777b538SAndroid Build Coastguard Worker xmlGlobalStatePtr
xmlGetGlobalState(void)670*6777b538SAndroid Build Coastguard Worker xmlGetGlobalState(void)
671*6777b538SAndroid Build Coastguard Worker {
672*6777b538SAndroid Build Coastguard Worker return(NULL);
673*6777b538SAndroid Build Coastguard Worker }
674*6777b538SAndroid Build Coastguard Worker
675*6777b538SAndroid Build Coastguard Worker static int
xmlIsMainThreadInternal(void)676*6777b538SAndroid Build Coastguard Worker xmlIsMainThreadInternal(void) {
677*6777b538SAndroid Build Coastguard Worker if (parserInitialized == 0) {
678*6777b538SAndroid Build Coastguard Worker xmlInitParser();
679*6777b538SAndroid Build Coastguard Worker parserInitialized = 1;
680*6777b538SAndroid Build Coastguard Worker }
681*6777b538SAndroid Build Coastguard Worker
682*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_POSIX_THREADS
683*6777b538SAndroid Build Coastguard Worker #ifdef XML_PTHREAD_WEAK
684*6777b538SAndroid Build Coastguard Worker if (libxml_is_threaded == 0)
685*6777b538SAndroid Build Coastguard Worker return (1);
686*6777b538SAndroid Build Coastguard Worker #endif
687*6777b538SAndroid Build Coastguard Worker return (pthread_equal(mainthread, pthread_self()));
688*6777b538SAndroid Build Coastguard Worker #elif defined HAVE_WIN32_THREADS
689*6777b538SAndroid Build Coastguard Worker return (mainthread == GetCurrentThreadId());
690*6777b538SAndroid Build Coastguard Worker #else
691*6777b538SAndroid Build Coastguard Worker return (1);
692*6777b538SAndroid Build Coastguard Worker #endif
693*6777b538SAndroid Build Coastguard Worker }
694*6777b538SAndroid Build Coastguard Worker
695*6777b538SAndroid Build Coastguard Worker /**
696*6777b538SAndroid Build Coastguard Worker * xmlIsMainThread:
697*6777b538SAndroid Build Coastguard Worker *
698*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Internal function, do not use.
699*6777b538SAndroid Build Coastguard Worker *
700*6777b538SAndroid Build Coastguard Worker * Check whether the current thread is the main thread.
701*6777b538SAndroid Build Coastguard Worker *
702*6777b538SAndroid Build Coastguard Worker * Returns 1 if the current thread is the main thread, 0 otherwise
703*6777b538SAndroid Build Coastguard Worker */
704*6777b538SAndroid Build Coastguard Worker int
xmlIsMainThread(void)705*6777b538SAndroid Build Coastguard Worker xmlIsMainThread(void) {
706*6777b538SAndroid Build Coastguard Worker return(xmlIsMainThreadInternal());
707*6777b538SAndroid Build Coastguard Worker }
708*6777b538SAndroid Build Coastguard Worker
709*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_THREAD_ENABLED
710*6777b538SAndroid Build Coastguard Worker
711*6777b538SAndroid Build Coastguard Worker static void
xmlFreeGlobalState(void * state)712*6777b538SAndroid Build Coastguard Worker xmlFreeGlobalState(void *state)
713*6777b538SAndroid Build Coastguard Worker {
714*6777b538SAndroid Build Coastguard Worker xmlGlobalState *gs = (xmlGlobalState *) state;
715*6777b538SAndroid Build Coastguard Worker
716*6777b538SAndroid Build Coastguard Worker /*
717*6777b538SAndroid Build Coastguard Worker * Free any memory allocated in the thread's xmlLastError. If it
718*6777b538SAndroid Build Coastguard Worker * weren't for this indirect allocation, we wouldn't need
719*6777b538SAndroid Build Coastguard Worker * a destructor with thread-local storage at all!
720*6777b538SAndroid Build Coastguard Worker *
721*6777b538SAndroid Build Coastguard Worker * It would be nice if we could make xmlLastError a special error
722*6777b538SAndroid Build Coastguard Worker * type which uses statically allocated, fixed-size buffers.
723*6777b538SAndroid Build Coastguard Worker * But the xmlError struct is fully public and widely used,
724*6777b538SAndroid Build Coastguard Worker * so changes are dangerous.
725*6777b538SAndroid Build Coastguard Worker */
726*6777b538SAndroid Build Coastguard Worker xmlResetError(&(gs->gs_xmlLastError));
727*6777b538SAndroid Build Coastguard Worker #ifndef USE_TLS
728*6777b538SAndroid Build Coastguard Worker free(state);
729*6777b538SAndroid Build Coastguard Worker #endif
730*6777b538SAndroid Build Coastguard Worker }
731*6777b538SAndroid Build Coastguard Worker
732*6777b538SAndroid Build Coastguard Worker #if defined(HAVE_WIN32_THREADS) && \
733*6777b538SAndroid Build Coastguard Worker defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL)
734*6777b538SAndroid Build Coastguard Worker static void WINAPI
xmlGlobalStateDtor(void * ctxt,unsigned char timedOut ATTRIBUTE_UNUSED)735*6777b538SAndroid Build Coastguard Worker xmlGlobalStateDtor(void *ctxt, unsigned char timedOut ATTRIBUTE_UNUSED) {
736*6777b538SAndroid Build Coastguard Worker xmlGlobalStatePtr gs = ctxt;
737*6777b538SAndroid Build Coastguard Worker
738*6777b538SAndroid Build Coastguard Worker UnregisterWait(gs->waitHandle);
739*6777b538SAndroid Build Coastguard Worker CloseHandle(gs->threadHandle);
740*6777b538SAndroid Build Coastguard Worker xmlFreeGlobalState(gs);
741*6777b538SAndroid Build Coastguard Worker }
742*6777b538SAndroid Build Coastguard Worker
743*6777b538SAndroid Build Coastguard Worker static int
xmlRegisterGlobalStateDtor(xmlGlobalState * gs)744*6777b538SAndroid Build Coastguard Worker xmlRegisterGlobalStateDtor(xmlGlobalState *gs) {
745*6777b538SAndroid Build Coastguard Worker void *processHandle = GetCurrentProcess();
746*6777b538SAndroid Build Coastguard Worker void *threadHandle;
747*6777b538SAndroid Build Coastguard Worker void *waitHandle;
748*6777b538SAndroid Build Coastguard Worker
749*6777b538SAndroid Build Coastguard Worker if (DuplicateHandle(processHandle, GetCurrentThread(), processHandle,
750*6777b538SAndroid Build Coastguard Worker &threadHandle, 0, FALSE, DUPLICATE_SAME_ACCESS) == 0) {
751*6777b538SAndroid Build Coastguard Worker return(-1);
752*6777b538SAndroid Build Coastguard Worker }
753*6777b538SAndroid Build Coastguard Worker
754*6777b538SAndroid Build Coastguard Worker if (RegisterWaitForSingleObject(&waitHandle, threadHandle,
755*6777b538SAndroid Build Coastguard Worker xmlGlobalStateDtor, gs, INFINITE, WT_EXECUTEONLYONCE) == 0) {
756*6777b538SAndroid Build Coastguard Worker CloseHandle(threadHandle);
757*6777b538SAndroid Build Coastguard Worker return(-1);
758*6777b538SAndroid Build Coastguard Worker }
759*6777b538SAndroid Build Coastguard Worker
760*6777b538SAndroid Build Coastguard Worker gs->threadHandle = threadHandle;
761*6777b538SAndroid Build Coastguard Worker gs->waitHandle = waitHandle;
762*6777b538SAndroid Build Coastguard Worker return(0);
763*6777b538SAndroid Build Coastguard Worker }
764*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_STATIC */
765*6777b538SAndroid Build Coastguard Worker
766*6777b538SAndroid Build Coastguard Worker static void
xmlInitGlobalState(xmlGlobalStatePtr gs)767*6777b538SAndroid Build Coastguard Worker xmlInitGlobalState(xmlGlobalStatePtr gs) {
768*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
769*6777b538SAndroid Build Coastguard Worker
770*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_THREAD_ENABLED
771*6777b538SAndroid Build Coastguard Worker gs->localRngState[0] = xmlGlobalRandom();
772*6777b538SAndroid Build Coastguard Worker gs->localRngState[1] = xmlGlobalRandom();
773*6777b538SAndroid Build Coastguard Worker #endif
774*6777b538SAndroid Build Coastguard Worker
775*6777b538SAndroid Build Coastguard Worker gs->gs_xmlBufferAllocScheme = xmlBufferAllocSchemeThrDef;
776*6777b538SAndroid Build Coastguard Worker gs->gs_xmlDefaultBufferSize = xmlDefaultBufferSizeThrDef;
777*6777b538SAndroid Build Coastguard Worker gs->gs_xmlDoValidityCheckingDefaultValue =
778*6777b538SAndroid Build Coastguard Worker xmlDoValidityCheckingDefaultValueThrDef;
779*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_THREAD_ALLOC_ENABLED
780*6777b538SAndroid Build Coastguard Worker #ifdef DEBUG_MEMORY_LOCATION
781*6777b538SAndroid Build Coastguard Worker gs->gs_xmlFree = xmlMemFree;
782*6777b538SAndroid Build Coastguard Worker gs->gs_xmlMalloc = xmlMemMalloc;
783*6777b538SAndroid Build Coastguard Worker gs->gs_xmlMallocAtomic = xmlMemMalloc;
784*6777b538SAndroid Build Coastguard Worker gs->gs_xmlRealloc = xmlMemRealloc;
785*6777b538SAndroid Build Coastguard Worker gs->gs_xmlMemStrdup = xmlMemoryStrdup;
786*6777b538SAndroid Build Coastguard Worker #else
787*6777b538SAndroid Build Coastguard Worker gs->gs_xmlFree = free;
788*6777b538SAndroid Build Coastguard Worker gs->gs_xmlMalloc = malloc;
789*6777b538SAndroid Build Coastguard Worker gs->gs_xmlMallocAtomic = malloc;
790*6777b538SAndroid Build Coastguard Worker gs->gs_xmlRealloc = realloc;
791*6777b538SAndroid Build Coastguard Worker gs->gs_xmlMemStrdup = xmlPosixStrdup;
792*6777b538SAndroid Build Coastguard Worker #endif
793*6777b538SAndroid Build Coastguard Worker #endif
794*6777b538SAndroid Build Coastguard Worker gs->gs_xmlGetWarningsDefaultValue = xmlGetWarningsDefaultValueThrDef;
795*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
796*6777b538SAndroid Build Coastguard Worker gs->gs_xmlIndentTreeOutput = xmlIndentTreeOutputThrDef;
797*6777b538SAndroid Build Coastguard Worker gs->gs_xmlTreeIndentString = xmlTreeIndentStringThrDef;
798*6777b538SAndroid Build Coastguard Worker gs->gs_xmlSaveNoEmptyTags = xmlSaveNoEmptyTagsThrDef;
799*6777b538SAndroid Build Coastguard Worker #endif
800*6777b538SAndroid Build Coastguard Worker gs->gs_xmlKeepBlanksDefaultValue = xmlKeepBlanksDefaultValueThrDef;
801*6777b538SAndroid Build Coastguard Worker gs->gs_xmlLineNumbersDefaultValue = xmlLineNumbersDefaultValueThrDef;
802*6777b538SAndroid Build Coastguard Worker gs->gs_xmlLoadExtDtdDefaultValue = xmlLoadExtDtdDefaultValueThrDef;
803*6777b538SAndroid Build Coastguard Worker gs->gs_xmlPedanticParserDefaultValue = xmlPedanticParserDefaultValueThrDef;
804*6777b538SAndroid Build Coastguard Worker gs->gs_xmlSubstituteEntitiesDefaultValue =
805*6777b538SAndroid Build Coastguard Worker xmlSubstituteEntitiesDefaultValueThrDef;
806*6777b538SAndroid Build Coastguard Worker
807*6777b538SAndroid Build Coastguard Worker gs->gs_xmlGenericError = xmlGenericErrorThrDef;
808*6777b538SAndroid Build Coastguard Worker gs->gs_xmlStructuredError = xmlStructuredErrorThrDef;
809*6777b538SAndroid Build Coastguard Worker gs->gs_xmlGenericErrorContext = xmlGenericErrorContextThrDef;
810*6777b538SAndroid Build Coastguard Worker gs->gs_xmlStructuredErrorContext = xmlStructuredErrorContextThrDef;
811*6777b538SAndroid Build Coastguard Worker gs->gs_xmlRegisterNodeDefaultValue = xmlRegisterNodeDefaultValueThrDef;
812*6777b538SAndroid Build Coastguard Worker gs->gs_xmlDeregisterNodeDefaultValue = xmlDeregisterNodeDefaultValueThrDef;
813*6777b538SAndroid Build Coastguard Worker
814*6777b538SAndroid Build Coastguard Worker gs->gs_xmlParserInputBufferCreateFilenameValue =
815*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateFilenameValueThrDef;
816*6777b538SAndroid Build Coastguard Worker gs->gs_xmlOutputBufferCreateFilenameValue =
817*6777b538SAndroid Build Coastguard Worker xmlOutputBufferCreateFilenameValueThrDef;
818*6777b538SAndroid Build Coastguard Worker memset(&gs->gs_xmlLastError, 0, sizeof(xmlError));
819*6777b538SAndroid Build Coastguard Worker
820*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
821*6777b538SAndroid Build Coastguard Worker
822*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_POSIX_THREADS
823*6777b538SAndroid Build Coastguard Worker pthread_setspecific(globalkey, gs);
824*6777b538SAndroid Build Coastguard Worker #elif defined HAVE_WIN32_THREADS
825*6777b538SAndroid Build Coastguard Worker #ifndef USE_TLS
826*6777b538SAndroid Build Coastguard Worker TlsSetValue(globalkey, gs);
827*6777b538SAndroid Build Coastguard Worker #endif
828*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL)
829*6777b538SAndroid Build Coastguard Worker xmlRegisterGlobalStateDtor(gs);
830*6777b538SAndroid Build Coastguard Worker #endif
831*6777b538SAndroid Build Coastguard Worker #endif
832*6777b538SAndroid Build Coastguard Worker
833*6777b538SAndroid Build Coastguard Worker gs->initialized = 1;
834*6777b538SAndroid Build Coastguard Worker }
835*6777b538SAndroid Build Coastguard Worker
836*6777b538SAndroid Build Coastguard Worker #ifndef USE_TLS
837*6777b538SAndroid Build Coastguard Worker /**
838*6777b538SAndroid Build Coastguard Worker * xmlNewGlobalState:
839*6777b538SAndroid Build Coastguard Worker *
840*6777b538SAndroid Build Coastguard Worker * xmlNewGlobalState() allocates a global state. This structure is used to
841*6777b538SAndroid Build Coastguard Worker * hold all data for use by a thread when supporting backwards compatibility
842*6777b538SAndroid Build Coastguard Worker * of libxml2 to pre-thread-safe behaviour.
843*6777b538SAndroid Build Coastguard Worker *
844*6777b538SAndroid Build Coastguard Worker * Returns the newly allocated xmlGlobalStatePtr or NULL in case of error
845*6777b538SAndroid Build Coastguard Worker */
846*6777b538SAndroid Build Coastguard Worker static xmlGlobalStatePtr
xmlNewGlobalState(int allowFailure)847*6777b538SAndroid Build Coastguard Worker xmlNewGlobalState(int allowFailure)
848*6777b538SAndroid Build Coastguard Worker {
849*6777b538SAndroid Build Coastguard Worker xmlGlobalState *gs;
850*6777b538SAndroid Build Coastguard Worker
851*6777b538SAndroid Build Coastguard Worker gs = malloc(sizeof(xmlGlobalState));
852*6777b538SAndroid Build Coastguard Worker if (gs == NULL) {
853*6777b538SAndroid Build Coastguard Worker if (allowFailure)
854*6777b538SAndroid Build Coastguard Worker return(NULL);
855*6777b538SAndroid Build Coastguard Worker
856*6777b538SAndroid Build Coastguard Worker /*
857*6777b538SAndroid Build Coastguard Worker * If an application didn't call xmlCheckThreadLocalStorage to make
858*6777b538SAndroid Build Coastguard Worker * sure that global state could be allocated, it's too late to
859*6777b538SAndroid Build Coastguard Worker * handle the error.
860*6777b538SAndroid Build Coastguard Worker */
861*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "libxml2: Failed to allocate globals for thread\n"
862*6777b538SAndroid Build Coastguard Worker "libxml2: See xmlCheckThreadLocalStorage\n");
863*6777b538SAndroid Build Coastguard Worker abort();
864*6777b538SAndroid Build Coastguard Worker }
865*6777b538SAndroid Build Coastguard Worker
866*6777b538SAndroid Build Coastguard Worker memset(gs, 0, sizeof(xmlGlobalState));
867*6777b538SAndroid Build Coastguard Worker xmlInitGlobalState(gs);
868*6777b538SAndroid Build Coastguard Worker return (gs);
869*6777b538SAndroid Build Coastguard Worker }
870*6777b538SAndroid Build Coastguard Worker #endif
871*6777b538SAndroid Build Coastguard Worker
872*6777b538SAndroid Build Coastguard Worker static xmlGlobalStatePtr
xmlGetThreadLocalStorage(int allowFailure)873*6777b538SAndroid Build Coastguard Worker xmlGetThreadLocalStorage(int allowFailure) {
874*6777b538SAndroid Build Coastguard Worker xmlGlobalState *gs;
875*6777b538SAndroid Build Coastguard Worker
876*6777b538SAndroid Build Coastguard Worker (void) allowFailure;
877*6777b538SAndroid Build Coastguard Worker
878*6777b538SAndroid Build Coastguard Worker #ifdef USE_TLS
879*6777b538SAndroid Build Coastguard Worker gs = &globalState;
880*6777b538SAndroid Build Coastguard Worker if (gs->initialized == 0)
881*6777b538SAndroid Build Coastguard Worker xmlInitGlobalState(gs);
882*6777b538SAndroid Build Coastguard Worker #elif defined(HAVE_POSIX_THREADS)
883*6777b538SAndroid Build Coastguard Worker gs = (xmlGlobalState *) pthread_getspecific(globalkey);
884*6777b538SAndroid Build Coastguard Worker if (gs == NULL)
885*6777b538SAndroid Build Coastguard Worker gs = xmlNewGlobalState(allowFailure);
886*6777b538SAndroid Build Coastguard Worker #elif defined(HAVE_WIN32_THREADS)
887*6777b538SAndroid Build Coastguard Worker gs = (xmlGlobalState *) TlsGetValue(globalkey);
888*6777b538SAndroid Build Coastguard Worker if (gs == NULL)
889*6777b538SAndroid Build Coastguard Worker gs = xmlNewGlobalState(allowFailure);
890*6777b538SAndroid Build Coastguard Worker #else
891*6777b538SAndroid Build Coastguard Worker gs = NULL;
892*6777b538SAndroid Build Coastguard Worker #endif
893*6777b538SAndroid Build Coastguard Worker
894*6777b538SAndroid Build Coastguard Worker return(gs);
895*6777b538SAndroid Build Coastguard Worker }
896*6777b538SAndroid Build Coastguard Worker
897*6777b538SAndroid Build Coastguard Worker /* Define thread-local storage accessors with macro magic */
898*6777b538SAndroid Build Coastguard Worker
899*6777b538SAndroid Build Coastguard Worker #define XML_DEFINE_GLOBAL_WRAPPER(name, type, attrs) \
900*6777b538SAndroid Build Coastguard Worker type *__##name(void) { \
901*6777b538SAndroid Build Coastguard Worker if (IS_MAIN_THREAD) \
902*6777b538SAndroid Build Coastguard Worker return (&name); \
903*6777b538SAndroid Build Coastguard Worker else \
904*6777b538SAndroid Build Coastguard Worker return (&xmlGetThreadLocalStorage(0)->gs_##name); \
905*6777b538SAndroid Build Coastguard Worker }
906*6777b538SAndroid Build Coastguard Worker
907*6777b538SAndroid Build Coastguard Worker #define XML_OP XML_DEFINE_GLOBAL_WRAPPER
908*6777b538SAndroid Build Coastguard Worker XML_GLOBALS_ALLOC
909*6777b538SAndroid Build Coastguard Worker XML_GLOBALS_ERROR
910*6777b538SAndroid Build Coastguard Worker XML_GLOBALS_IO
911*6777b538SAndroid Build Coastguard Worker XML_GLOBALS_PARSER
912*6777b538SAndroid Build Coastguard Worker XML_GLOBALS_TREE
913*6777b538SAndroid Build Coastguard Worker #undef XML_OP
914*6777b538SAndroid Build Coastguard Worker
915*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_THREAD_ENABLED
916*6777b538SAndroid Build Coastguard Worker unsigned *
xmlGetLocalRngState(void)917*6777b538SAndroid Build Coastguard Worker xmlGetLocalRngState(void) {
918*6777b538SAndroid Build Coastguard Worker if (IS_MAIN_THREAD)
919*6777b538SAndroid Build Coastguard Worker return(xmlMainThreadRngState);
920*6777b538SAndroid Build Coastguard Worker else
921*6777b538SAndroid Build Coastguard Worker return(xmlGetThreadLocalStorage(0)->localRngState);
922*6777b538SAndroid Build Coastguard Worker }
923*6777b538SAndroid Build Coastguard Worker #endif
924*6777b538SAndroid Build Coastguard Worker
925*6777b538SAndroid Build Coastguard Worker /* For backward compatibility */
926*6777b538SAndroid Build Coastguard Worker
927*6777b538SAndroid Build Coastguard Worker const char *const *
__xmlParserVersion(void)928*6777b538SAndroid Build Coastguard Worker __xmlParserVersion(void) {
929*6777b538SAndroid Build Coastguard Worker return &xmlParserVersion;
930*6777b538SAndroid Build Coastguard Worker }
931*6777b538SAndroid Build Coastguard Worker
932*6777b538SAndroid Build Coastguard Worker const int *
__oldXMLWDcompatibility(void)933*6777b538SAndroid Build Coastguard Worker __oldXMLWDcompatibility(void) {
934*6777b538SAndroid Build Coastguard Worker return &oldXMLWDcompatibility;
935*6777b538SAndroid Build Coastguard Worker }
936*6777b538SAndroid Build Coastguard Worker
937*6777b538SAndroid Build Coastguard Worker const int *
__xmlParserDebugEntities(void)938*6777b538SAndroid Build Coastguard Worker __xmlParserDebugEntities(void) {
939*6777b538SAndroid Build Coastguard Worker return &xmlParserDebugEntities;
940*6777b538SAndroid Build Coastguard Worker }
941*6777b538SAndroid Build Coastguard Worker
942*6777b538SAndroid Build Coastguard Worker const xmlSAXLocator *
__xmlDefaultSAXLocator(void)943*6777b538SAndroid Build Coastguard Worker __xmlDefaultSAXLocator(void) {
944*6777b538SAndroid Build Coastguard Worker return &xmlDefaultSAXLocator;
945*6777b538SAndroid Build Coastguard Worker }
946*6777b538SAndroid Build Coastguard Worker
947*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
948*6777b538SAndroid Build Coastguard Worker const xmlSAXHandlerV1 *
__xmlDefaultSAXHandler(void)949*6777b538SAndroid Build Coastguard Worker __xmlDefaultSAXHandler(void) {
950*6777b538SAndroid Build Coastguard Worker return &xmlDefaultSAXHandler;
951*6777b538SAndroid Build Coastguard Worker }
952*6777b538SAndroid Build Coastguard Worker
953*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
954*6777b538SAndroid Build Coastguard Worker const xmlSAXHandlerV1 *
__htmlDefaultSAXHandler(void)955*6777b538SAndroid Build Coastguard Worker __htmlDefaultSAXHandler(void) {
956*6777b538SAndroid Build Coastguard Worker return &htmlDefaultSAXHandler;
957*6777b538SAndroid Build Coastguard Worker }
958*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_HTML_ENABLED */
959*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_SAX1_ENABLED */
960*6777b538SAndroid Build Coastguard Worker
961*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_THREAD_ENABLED */
962*6777b538SAndroid Build Coastguard Worker
963*6777b538SAndroid Build Coastguard Worker /**
964*6777b538SAndroid Build Coastguard Worker * xmlCheckThreadLocalStorage:
965*6777b538SAndroid Build Coastguard Worker *
966*6777b538SAndroid Build Coastguard Worker * Check whether thread-local storage could be allocated.
967*6777b538SAndroid Build Coastguard Worker *
968*6777b538SAndroid Build Coastguard Worker * In cross-platform code running in multithreaded environments, this
969*6777b538SAndroid Build Coastguard Worker * function should be called once in each thread before calling other
970*6777b538SAndroid Build Coastguard Worker * library functions to make sure that thread-local storage was
971*6777b538SAndroid Build Coastguard Worker * allocated properly.
972*6777b538SAndroid Build Coastguard Worker *
973*6777b538SAndroid Build Coastguard Worker * Returns 0 on success or -1 if a memory allocation failed. A failed
974*6777b538SAndroid Build Coastguard Worker * allocation signals a typically fatal and irrecoverable out-of-memory
975*6777b538SAndroid Build Coastguard Worker * situation. Don't call any library functions in this case.
976*6777b538SAndroid Build Coastguard Worker *
977*6777b538SAndroid Build Coastguard Worker * This function never fails if the library is compiled with support
978*6777b538SAndroid Build Coastguard Worker * for thread-local storage.
979*6777b538SAndroid Build Coastguard Worker *
980*6777b538SAndroid Build Coastguard Worker * This function never fails for the "main" thread which is the first
981*6777b538SAndroid Build Coastguard Worker * thread calling xmlInitParser.
982*6777b538SAndroid Build Coastguard Worker *
983*6777b538SAndroid Build Coastguard Worker * Available since v2.12.0.
984*6777b538SAndroid Build Coastguard Worker */
985*6777b538SAndroid Build Coastguard Worker int
xmlCheckThreadLocalStorage(void)986*6777b538SAndroid Build Coastguard Worker xmlCheckThreadLocalStorage(void) {
987*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_THREAD_ENABLED) && !defined(USE_TLS)
988*6777b538SAndroid Build Coastguard Worker if ((!xmlIsMainThreadInternal()) && (xmlGetThreadLocalStorage(1) == NULL))
989*6777b538SAndroid Build Coastguard Worker return(-1);
990*6777b538SAndroid Build Coastguard Worker #endif
991*6777b538SAndroid Build Coastguard Worker return(0);
992*6777b538SAndroid Build Coastguard Worker }
993*6777b538SAndroid Build Coastguard Worker
994*6777b538SAndroid Build Coastguard Worker /**
995*6777b538SAndroid Build Coastguard Worker * DllMain:
996*6777b538SAndroid Build Coastguard Worker * @hinstDLL: handle to DLL instance
997*6777b538SAndroid Build Coastguard Worker * @fdwReason: Reason code for entry
998*6777b538SAndroid Build Coastguard Worker * @lpvReserved: generic pointer (depends upon reason code)
999*6777b538SAndroid Build Coastguard Worker *
1000*6777b538SAndroid Build Coastguard Worker * Entry point for Windows library. It is being used to free thread-specific
1001*6777b538SAndroid Build Coastguard Worker * storage.
1002*6777b538SAndroid Build Coastguard Worker *
1003*6777b538SAndroid Build Coastguard Worker * Returns TRUE always
1004*6777b538SAndroid Build Coastguard Worker */
1005*6777b538SAndroid Build Coastguard Worker #if defined(HAVE_WIN32_THREADS) && \
1006*6777b538SAndroid Build Coastguard Worker (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL))
1007*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_STATIC_FOR_DLL)
1008*6777b538SAndroid Build Coastguard Worker int
xmlDllMain(ATTRIBUTE_UNUSED void * hinstDLL,unsigned long fdwReason,ATTRIBUTE_UNUSED void * lpvReserved)1009*6777b538SAndroid Build Coastguard Worker xmlDllMain(ATTRIBUTE_UNUSED void *hinstDLL, unsigned long fdwReason,
1010*6777b538SAndroid Build Coastguard Worker ATTRIBUTE_UNUSED void *lpvReserved)
1011*6777b538SAndroid Build Coastguard Worker #else
1012*6777b538SAndroid Build Coastguard Worker /* declare to avoid "no previous prototype for 'DllMain'" warning */
1013*6777b538SAndroid Build Coastguard Worker /* Note that we do NOT want to include this function declaration in
1014*6777b538SAndroid Build Coastguard Worker a public header because it's meant to be called by Windows itself,
1015*6777b538SAndroid Build Coastguard Worker not a program that uses this library. This also has to be exported. */
1016*6777b538SAndroid Build Coastguard Worker
1017*6777b538SAndroid Build Coastguard Worker XMLPUBFUN BOOL WINAPI
1018*6777b538SAndroid Build Coastguard Worker DllMain (HINSTANCE hinstDLL,
1019*6777b538SAndroid Build Coastguard Worker DWORD fdwReason,
1020*6777b538SAndroid Build Coastguard Worker LPVOID lpvReserved);
1021*6777b538SAndroid Build Coastguard Worker
1022*6777b538SAndroid Build Coastguard Worker BOOL WINAPI
1023*6777b538SAndroid Build Coastguard Worker DllMain(ATTRIBUTE_UNUSED HINSTANCE hinstDLL, DWORD fdwReason,
1024*6777b538SAndroid Build Coastguard Worker ATTRIBUTE_UNUSED LPVOID lpvReserved)
1025*6777b538SAndroid Build Coastguard Worker #endif
1026*6777b538SAndroid Build Coastguard Worker {
1027*6777b538SAndroid Build Coastguard Worker switch (fdwReason) {
1028*6777b538SAndroid Build Coastguard Worker case DLL_THREAD_DETACH:
1029*6777b538SAndroid Build Coastguard Worker #ifdef USE_TLS
1030*6777b538SAndroid Build Coastguard Worker xmlFreeGlobalState(&globalState);
1031*6777b538SAndroid Build Coastguard Worker #else
1032*6777b538SAndroid Build Coastguard Worker if (globalkey != TLS_OUT_OF_INDEXES) {
1033*6777b538SAndroid Build Coastguard Worker xmlGlobalState *globalval;
1034*6777b538SAndroid Build Coastguard Worker
1035*6777b538SAndroid Build Coastguard Worker globalval = (xmlGlobalState *) TlsGetValue(globalkey);
1036*6777b538SAndroid Build Coastguard Worker if (globalval) {
1037*6777b538SAndroid Build Coastguard Worker xmlFreeGlobalState(globalval);
1038*6777b538SAndroid Build Coastguard Worker TlsSetValue(globalkey, NULL);
1039*6777b538SAndroid Build Coastguard Worker }
1040*6777b538SAndroid Build Coastguard Worker }
1041*6777b538SAndroid Build Coastguard Worker #endif
1042*6777b538SAndroid Build Coastguard Worker break;
1043*6777b538SAndroid Build Coastguard Worker }
1044*6777b538SAndroid Build Coastguard Worker return TRUE;
1045*6777b538SAndroid Build Coastguard Worker }
1046*6777b538SAndroid Build Coastguard Worker #endif
1047*6777b538SAndroid Build Coastguard Worker
1048*6777b538SAndroid Build Coastguard Worker void
xmlThrDefSetGenericErrorFunc(void * ctx,xmlGenericErrorFunc handler)1049*6777b538SAndroid Build Coastguard Worker xmlThrDefSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler) {
1050*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1051*6777b538SAndroid Build Coastguard Worker xmlGenericErrorContextThrDef = ctx;
1052*6777b538SAndroid Build Coastguard Worker if (handler != NULL)
1053*6777b538SAndroid Build Coastguard Worker xmlGenericErrorThrDef = handler;
1054*6777b538SAndroid Build Coastguard Worker else
1055*6777b538SAndroid Build Coastguard Worker xmlGenericErrorThrDef = xmlGenericErrorDefaultFunc;
1056*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1057*6777b538SAndroid Build Coastguard Worker }
1058*6777b538SAndroid Build Coastguard Worker
1059*6777b538SAndroid Build Coastguard Worker void
xmlThrDefSetStructuredErrorFunc(void * ctx,xmlStructuredErrorFunc handler)1060*6777b538SAndroid Build Coastguard Worker xmlThrDefSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler) {
1061*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1062*6777b538SAndroid Build Coastguard Worker xmlStructuredErrorContextThrDef = ctx;
1063*6777b538SAndroid Build Coastguard Worker xmlStructuredErrorThrDef = handler;
1064*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1065*6777b538SAndroid Build Coastguard Worker }
1066*6777b538SAndroid Build Coastguard Worker
xmlThrDefBufferAllocScheme(xmlBufferAllocationScheme v)1067*6777b538SAndroid Build Coastguard Worker xmlBufferAllocationScheme xmlThrDefBufferAllocScheme(xmlBufferAllocationScheme v) {
1068*6777b538SAndroid Build Coastguard Worker xmlBufferAllocationScheme ret;
1069*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1070*6777b538SAndroid Build Coastguard Worker ret = xmlBufferAllocSchemeThrDef;
1071*6777b538SAndroid Build Coastguard Worker xmlBufferAllocSchemeThrDef = v;
1072*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1073*6777b538SAndroid Build Coastguard Worker return ret;
1074*6777b538SAndroid Build Coastguard Worker }
1075*6777b538SAndroid Build Coastguard Worker
xmlThrDefDefaultBufferSize(int v)1076*6777b538SAndroid Build Coastguard Worker int xmlThrDefDefaultBufferSize(int v) {
1077*6777b538SAndroid Build Coastguard Worker int ret;
1078*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1079*6777b538SAndroid Build Coastguard Worker ret = xmlDefaultBufferSizeThrDef;
1080*6777b538SAndroid Build Coastguard Worker xmlDefaultBufferSizeThrDef = v;
1081*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1082*6777b538SAndroid Build Coastguard Worker return ret;
1083*6777b538SAndroid Build Coastguard Worker }
1084*6777b538SAndroid Build Coastguard Worker
xmlThrDefDoValidityCheckingDefaultValue(int v)1085*6777b538SAndroid Build Coastguard Worker int xmlThrDefDoValidityCheckingDefaultValue(int v) {
1086*6777b538SAndroid Build Coastguard Worker int ret;
1087*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1088*6777b538SAndroid Build Coastguard Worker ret = xmlDoValidityCheckingDefaultValueThrDef;
1089*6777b538SAndroid Build Coastguard Worker xmlDoValidityCheckingDefaultValueThrDef = v;
1090*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1091*6777b538SAndroid Build Coastguard Worker return ret;
1092*6777b538SAndroid Build Coastguard Worker }
1093*6777b538SAndroid Build Coastguard Worker
xmlThrDefGetWarningsDefaultValue(int v)1094*6777b538SAndroid Build Coastguard Worker int xmlThrDefGetWarningsDefaultValue(int v) {
1095*6777b538SAndroid Build Coastguard Worker int ret;
1096*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1097*6777b538SAndroid Build Coastguard Worker ret = xmlGetWarningsDefaultValueThrDef;
1098*6777b538SAndroid Build Coastguard Worker xmlGetWarningsDefaultValueThrDef = v;
1099*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1100*6777b538SAndroid Build Coastguard Worker return ret;
1101*6777b538SAndroid Build Coastguard Worker }
1102*6777b538SAndroid Build Coastguard Worker
1103*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
xmlThrDefIndentTreeOutput(int v)1104*6777b538SAndroid Build Coastguard Worker int xmlThrDefIndentTreeOutput(int v) {
1105*6777b538SAndroid Build Coastguard Worker int ret;
1106*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1107*6777b538SAndroid Build Coastguard Worker ret = xmlIndentTreeOutputThrDef;
1108*6777b538SAndroid Build Coastguard Worker xmlIndentTreeOutputThrDef = v;
1109*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1110*6777b538SAndroid Build Coastguard Worker return ret;
1111*6777b538SAndroid Build Coastguard Worker }
1112*6777b538SAndroid Build Coastguard Worker
xmlThrDefTreeIndentString(const char * v)1113*6777b538SAndroid Build Coastguard Worker const char * xmlThrDefTreeIndentString(const char * v) {
1114*6777b538SAndroid Build Coastguard Worker const char * ret;
1115*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1116*6777b538SAndroid Build Coastguard Worker ret = xmlTreeIndentStringThrDef;
1117*6777b538SAndroid Build Coastguard Worker xmlTreeIndentStringThrDef = v;
1118*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1119*6777b538SAndroid Build Coastguard Worker return ret;
1120*6777b538SAndroid Build Coastguard Worker }
1121*6777b538SAndroid Build Coastguard Worker
xmlThrDefSaveNoEmptyTags(int v)1122*6777b538SAndroid Build Coastguard Worker int xmlThrDefSaveNoEmptyTags(int v) {
1123*6777b538SAndroid Build Coastguard Worker int ret;
1124*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1125*6777b538SAndroid Build Coastguard Worker ret = xmlSaveNoEmptyTagsThrDef;
1126*6777b538SAndroid Build Coastguard Worker xmlSaveNoEmptyTagsThrDef = v;
1127*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1128*6777b538SAndroid Build Coastguard Worker return ret;
1129*6777b538SAndroid Build Coastguard Worker }
1130*6777b538SAndroid Build Coastguard Worker #endif
1131*6777b538SAndroid Build Coastguard Worker
xmlThrDefKeepBlanksDefaultValue(int v)1132*6777b538SAndroid Build Coastguard Worker int xmlThrDefKeepBlanksDefaultValue(int v) {
1133*6777b538SAndroid Build Coastguard Worker int ret;
1134*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1135*6777b538SAndroid Build Coastguard Worker ret = xmlKeepBlanksDefaultValueThrDef;
1136*6777b538SAndroid Build Coastguard Worker xmlKeepBlanksDefaultValueThrDef = v;
1137*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1138*6777b538SAndroid Build Coastguard Worker return ret;
1139*6777b538SAndroid Build Coastguard Worker }
1140*6777b538SAndroid Build Coastguard Worker
xmlThrDefLineNumbersDefaultValue(int v)1141*6777b538SAndroid Build Coastguard Worker int xmlThrDefLineNumbersDefaultValue(int v) {
1142*6777b538SAndroid Build Coastguard Worker int ret;
1143*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1144*6777b538SAndroid Build Coastguard Worker ret = xmlLineNumbersDefaultValueThrDef;
1145*6777b538SAndroid Build Coastguard Worker xmlLineNumbersDefaultValueThrDef = v;
1146*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1147*6777b538SAndroid Build Coastguard Worker return ret;
1148*6777b538SAndroid Build Coastguard Worker }
1149*6777b538SAndroid Build Coastguard Worker
xmlThrDefLoadExtDtdDefaultValue(int v)1150*6777b538SAndroid Build Coastguard Worker int xmlThrDefLoadExtDtdDefaultValue(int v) {
1151*6777b538SAndroid Build Coastguard Worker int ret;
1152*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1153*6777b538SAndroid Build Coastguard Worker ret = xmlLoadExtDtdDefaultValueThrDef;
1154*6777b538SAndroid Build Coastguard Worker xmlLoadExtDtdDefaultValueThrDef = v;
1155*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1156*6777b538SAndroid Build Coastguard Worker return ret;
1157*6777b538SAndroid Build Coastguard Worker }
1158*6777b538SAndroid Build Coastguard Worker
xmlThrDefParserDebugEntities(int v ATTRIBUTE_UNUSED)1159*6777b538SAndroid Build Coastguard Worker int xmlThrDefParserDebugEntities(int v ATTRIBUTE_UNUSED) {
1160*6777b538SAndroid Build Coastguard Worker return(xmlParserDebugEntities);
1161*6777b538SAndroid Build Coastguard Worker }
1162*6777b538SAndroid Build Coastguard Worker
xmlThrDefPedanticParserDefaultValue(int v)1163*6777b538SAndroid Build Coastguard Worker int xmlThrDefPedanticParserDefaultValue(int v) {
1164*6777b538SAndroid Build Coastguard Worker int ret;
1165*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1166*6777b538SAndroid Build Coastguard Worker ret = xmlPedanticParserDefaultValueThrDef;
1167*6777b538SAndroid Build Coastguard Worker xmlPedanticParserDefaultValueThrDef = v;
1168*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1169*6777b538SAndroid Build Coastguard Worker return ret;
1170*6777b538SAndroid Build Coastguard Worker }
1171*6777b538SAndroid Build Coastguard Worker
xmlThrDefSubstituteEntitiesDefaultValue(int v)1172*6777b538SAndroid Build Coastguard Worker int xmlThrDefSubstituteEntitiesDefaultValue(int v) {
1173*6777b538SAndroid Build Coastguard Worker int ret;
1174*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1175*6777b538SAndroid Build Coastguard Worker ret = xmlSubstituteEntitiesDefaultValueThrDef;
1176*6777b538SAndroid Build Coastguard Worker xmlSubstituteEntitiesDefaultValueThrDef = v;
1177*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1178*6777b538SAndroid Build Coastguard Worker return ret;
1179*6777b538SAndroid Build Coastguard Worker }
1180*6777b538SAndroid Build Coastguard Worker
1181*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeFunc
xmlThrDefRegisterNodeDefault(xmlRegisterNodeFunc func)1182*6777b538SAndroid Build Coastguard Worker xmlThrDefRegisterNodeDefault(xmlRegisterNodeFunc func)
1183*6777b538SAndroid Build Coastguard Worker {
1184*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeFunc old;
1185*6777b538SAndroid Build Coastguard Worker
1186*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1187*6777b538SAndroid Build Coastguard Worker old = xmlRegisterNodeDefaultValueThrDef;
1188*6777b538SAndroid Build Coastguard Worker
1189*6777b538SAndroid Build Coastguard Worker __xmlRegisterCallbacks = 1;
1190*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValueThrDef = func;
1191*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1192*6777b538SAndroid Build Coastguard Worker
1193*6777b538SAndroid Build Coastguard Worker return(old);
1194*6777b538SAndroid Build Coastguard Worker }
1195*6777b538SAndroid Build Coastguard Worker
1196*6777b538SAndroid Build Coastguard Worker xmlDeregisterNodeFunc
xmlThrDefDeregisterNodeDefault(xmlDeregisterNodeFunc func)1197*6777b538SAndroid Build Coastguard Worker xmlThrDefDeregisterNodeDefault(xmlDeregisterNodeFunc func)
1198*6777b538SAndroid Build Coastguard Worker {
1199*6777b538SAndroid Build Coastguard Worker xmlDeregisterNodeFunc old;
1200*6777b538SAndroid Build Coastguard Worker
1201*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1202*6777b538SAndroid Build Coastguard Worker old = xmlDeregisterNodeDefaultValueThrDef;
1203*6777b538SAndroid Build Coastguard Worker
1204*6777b538SAndroid Build Coastguard Worker __xmlRegisterCallbacks = 1;
1205*6777b538SAndroid Build Coastguard Worker xmlDeregisterNodeDefaultValueThrDef = func;
1206*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1207*6777b538SAndroid Build Coastguard Worker
1208*6777b538SAndroid Build Coastguard Worker return(old);
1209*6777b538SAndroid Build Coastguard Worker }
1210*6777b538SAndroid Build Coastguard Worker
1211*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateFilenameFunc
xmlThrDefParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func)1212*6777b538SAndroid Build Coastguard Worker xmlThrDefParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func)
1213*6777b538SAndroid Build Coastguard Worker {
1214*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateFilenameFunc old;
1215*6777b538SAndroid Build Coastguard Worker
1216*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1217*6777b538SAndroid Build Coastguard Worker old = xmlParserInputBufferCreateFilenameValueThrDef;
1218*6777b538SAndroid Build Coastguard Worker if (old == NULL) {
1219*6777b538SAndroid Build Coastguard Worker old = __xmlParserInputBufferCreateFilename;
1220*6777b538SAndroid Build Coastguard Worker }
1221*6777b538SAndroid Build Coastguard Worker
1222*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateFilenameValueThrDef = func;
1223*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1224*6777b538SAndroid Build Coastguard Worker
1225*6777b538SAndroid Build Coastguard Worker return(old);
1226*6777b538SAndroid Build Coastguard Worker }
1227*6777b538SAndroid Build Coastguard Worker
1228*6777b538SAndroid Build Coastguard Worker xmlOutputBufferCreateFilenameFunc
xmlThrDefOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func)1229*6777b538SAndroid Build Coastguard Worker xmlThrDefOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func)
1230*6777b538SAndroid Build Coastguard Worker {
1231*6777b538SAndroid Build Coastguard Worker xmlOutputBufferCreateFilenameFunc old;
1232*6777b538SAndroid Build Coastguard Worker
1233*6777b538SAndroid Build Coastguard Worker xmlMutexLock(&xmlThrDefMutex);
1234*6777b538SAndroid Build Coastguard Worker old = xmlOutputBufferCreateFilenameValueThrDef;
1235*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
1236*6777b538SAndroid Build Coastguard Worker if (old == NULL) {
1237*6777b538SAndroid Build Coastguard Worker old = __xmlOutputBufferCreateFilename;
1238*6777b538SAndroid Build Coastguard Worker }
1239*6777b538SAndroid Build Coastguard Worker #endif
1240*6777b538SAndroid Build Coastguard Worker xmlOutputBufferCreateFilenameValueThrDef = func;
1241*6777b538SAndroid Build Coastguard Worker xmlMutexUnlock(&xmlThrDefMutex);
1242*6777b538SAndroid Build Coastguard Worker
1243*6777b538SAndroid Build Coastguard Worker return(old);
1244*6777b538SAndroid Build Coastguard Worker }
1245*6777b538SAndroid Build Coastguard Worker
1246