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