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