      * Summary: interface for all global variables of the library
      * Description: all the global variables and thread handling for
      *              those variables is handled by this module.
      *
      * The bottom of this file is automatically generated by build_glob.py
      * based on the description file global.data
      *
      * Copy: See Copyright for the status of this software.
      *
      * Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A.

      /if not defined(XML_GLOBALS_H)
      /define XML_GLOBALS_H

      /include "libxmlrpg/xmlversion"
      /include "libxmlrpg/parser"
      /include "libxmlrpg/xmlerror"
      /include "libxmlrpg/SAX"
      /include "libxmlrpg/SAX2"
      /include "libxmlrpg/xmlmemory"

     d xmlInitGlobals  pr                  extproc('xmlInitGlobals')

     d xmlCleanupGlobals...
     d                 pr                  extproc('xmlCleanupGlobals')

      * xmlParserInputBufferCreateFilenameFunc:
      * @URI: the URI to read from
      * @enc: the requested source encoding
      *
      * Signature for the function doing the lookup for a suitable input method
      * corresponding to an URI.
      *
      * Returns the new xmlParserInputBufferPtr in case of success or NULL if no
      *         method was found.

     d xmlParserInputBufferCreateFilenameFunc...
     d                 s               *   based(######typedef######)
     d                                     procptr

      * xmlOutputBufferCreateFilenameFunc:
      * @URI: the URI to write to
      * @enc: the requested target encoding
      *
      * Signature for the function doing the lookup for a suitable output method
      * corresponding to an URI.
      *
      * Returns the new xmlOutputBufferPtr in case of success or NULL if no
      *         method was found.

     d xmlOutputBufferCreateFilenameFunc...
     d                 s               *   based(######typedef######)
     d                                     procptr

     d xmlParserInputBufferCreateFilenameDefault...
     d                 pr                  extproc('xmlParserInputBufferCreate+
     d                                     FilenameDefault')
     d                                     like(xmlParserInputBuffer...
     d                                     CreateFilenameFunc)
     d func                                value like(xmlParserInputBuffer...
     d                                     CreateFilenameFunc)

     d xmlOutputBufferCreateFilenameDefault...
     d                 pr                  extproc('xmlOutputBufferCreate+
     d                                     FilenameDefault')
     d                                     like(xmlOutputBuffer...
     d                                     CreateFilenameFunc)
     d func                                value like(xmlOutputBuffer...
     d                                     CreateFilenameFunc)

      * xmlRegisterNodeFunc:
      * @node: the current node
      *
      * Signature for the registration callback of a created node

     d xmlRegisterNodeFunc...
     d                 s               *   based(######typedef######)
     d                                     procptr

      * xmlDeregisterNodeFunc:
      * @node: the current node
      *
      * Signature for the deregistration callback of a discarded node

     d xmlDeregisterNodeFunc...
     d                 s               *   based(######typedef######)
     d                                     procptr

     d xmlGlobalStatePtr...
     d                 s               *   based(######typedef######)

     d xmlGlobalState  ds                  based(xmlGlobalStatePtr)
     d                                     align qualified
     d  xmlParserVersion...
     d                                 *                                        const char *
     d  xmlDefaultSAXLocator...
     d                                     likeds(xmlSAXLocator)
     d  xmlDefaultSAXHandler...
     d                                     likeds(xmlSAXHandlerV1)
     d  docbDefaultSAXHandler...
     d                                     likeds(xmlSAXHandlerV1)
     d  htmlDefaultSAXHandler...
     d                                     likeds(xmlSAXHandlerV1)
     d  xmlFree                            like(xmlFreeFunc)
     d  xmlMalloc                          like(xmlMallocFunc)
     d  xmlMemStrdup                       like(xmlStrdupFunc)
     d  xmlRealloc                         like(xmlReallocFunc)
     d  xmlGenericError...
     d                                     like(xmlGenericErrorFunc)
     d  xmlStructuredError...
     d                                     like(xmlStructuredErrorFunc)
     d  xmlGenericErrorContext...
     d                                 *                                        void *
     d  oldXMLWDcompatibility...
     d                               10i 0
     d  xmlBufferAllocScheme...
     d                                     like(xmlBufferAllocationScheme)
     d  xmlDefaultBufferSize...
     d                               10i 0
     d  xmlSubstituteEntitiesDefaultValue...
     d                               10i 0
     d  xmlDoValidityCheckingDefaultValue...
     d                               10i 0
     d  xmlGetWarningsDefaultValue...
     d                               10i 0
     d  xmlKeepBlanksDefaultValue...
     d                               10i 0
     d  xmlLineNumbersDefaultValue...
     d                               10i 0
     d  xmlLoadExtDtdDefaultValue...
     d                               10i 0
     d  xmlParserDebugEntities...
     d                               10i 0
     d  xmlPedanticParserDefaultValue...
     d                               10i 0
     d  xmlSaveNoEmptyTags...
     d                               10i 0
     d  xmlIndentTreeOutput...
     d                               10i 0
     d  xmlTreeIndentString...
     d                                 *                                        const char *
     d  xmlRegisterNodeDefaultValue...
     d                                     like(xmlRegisterNodeFunc)
     d  xmlDeregisterNodeDefaultValue...
     d                                     like(xmlDeregisterNodeFunc)
     d  xmlMallocAtomic...
     d                                     like(xmlMallocFunc)
     d  xmlLastError                       likeds(xmlError)
     d  xmlParserInputBufferCreateFilenameValue...
     d                                     like(xmlParserInputBuffer...
     d                                     CreateFilenameFunc)
     d  xmlOutputBufferCreateFilenameValue...
     d                                     like(xmlOutputBuffer...
     d                                     CreateFilenameFunc)
     d  xmlStructuredErrorContext...
     d                                 *                                        void *

      /include "libxmlrpg/threads"

     d xmlInitializeGlobalState...
     d                 pr                  extproc('xmlInitializeGlobalState')
     d qs                                  value like(xmlGlobalStatePtr)

     d xmlThrDefSetGenericErrorFunc...
     d                 pr                  extproc(
     d                                      'xmlThrDefSetGenericErrorFunc')
     d ctx                             *   value                                void *
     d handler                             value like(xmlGenericErrorFunc)

     d xmlThrDefSetStructuredErrorFunc...
     d                 pr                  extproc(
     d                                      'xmlThrDefSetStructuredErrorFunc')
     d ctx                             *   value                                void *
     d handler                             value like(xmlStructuredErrorFunc)

     d xmlRegisterNodeDefault...
     d                 pr                  extproc('xmlRegisterNodeDefault')
     d                                     like(xmlRegisterNodeFunc)
     d func                                value like(xmlRegisterNodeFunc)

     d xmlThrDefRegisterNodeDefault...
     d                 pr                  extproc(
     d                                      'xmlThrDefRegisterNodeDefault')
     d                                     like(xmlRegisterNodeFunc)
     d func                                value like(xmlRegisterNodeFunc)

     d xmlDeregisterNodeDefault...
     d                 pr                  extproc('xmlDeregisterNodeDefault')
     d                                     like(xmlDeregisterNodeFunc)
     d func                                value like(xmlDeregisterNodeFunc)

     d xmlThrDefDeregisterNodeDefault...
     d                 pr                  extproc(
     d                                      'xmlThrDefDeregisterNodeDefault')
     d                                     like(xmlDeregisterNodeFunc)
     d func                                value like(xmlDeregisterNodeFunc)

     d xmlThrDefOutputBufferCreateFilenameDefault...
     d                 pr                  extproc('xmlThrDefOutputBuffer+
     d                                     CreateFilenameDefault')
     d                                     like(xmlOutputBuffer...
     d                                     CreateFilenameFunc)
     d func                                value like(xmlOutputBuffer...
     d                                     CreateFilenameFunc)

     d xmlThrDefParserInputBufferCreateFilenameDefault...
     d                 pr                  extproc('xmlThrDefParserInputBuffer+
     d                                     CreateFilenameDefault')
     d                                     like(xmlParserInputBuffer...
     d                                     CreateFilenameFunc)
     d func                                value like(xmlParserInputBuffer...
     d                                     CreateFilenameFunc)

      /if defined(LIBXML_DOCB_ENABLED)
     d get_docbDefaultSAXHandler...
     d                 pr                  extproc(
     d                                       '__get_docbDefaultSAXHandler')
     d                                     likeds(xmlSAXHandlerV1)

     d set_docbDefaultSAXHandler...
     d                 pr                  extproc(
     d                                       '__set_docbDefaultSAXHandler')
     d  value                              value likeds(xmlSAXHandlerV1)
      /endif

      /if defined(LIBXML_HTML_ENABLED)
     d get_htmlDefaultSAXHandler...
     d                 pr                  extproc(
     d                                       '__get_htmlDefaultSAXHandler')
     d                                     likeds(xmlSAXHandlerV1)

     d set_htmlDefaultSAXHandler...
     d                 pr                  extproc(
     d                                       '__set_htmlDefaultSAXHandler')
     d  value                              value likeds(xmlSAXHandlerV1)
      /endif

     d get_xmlLastError...
     d                 pr                  extproc('__get_xmlLastError')
     d                                     likeds(xmlError)

     d set_xmlLastError...
     d                 pr                  extproc('__set_xmlLastError')
     d  value                              value likeds(xmlError)

     d get_oldXMLWDcompatibility...
     d                 pr            10i 0 extproc(
     d                                       '__get_oldXMLWDcompatibility')

     d set_oldXMLWDcompatibility...
     d                 pr                  extproc(
     d                                       '__set_oldXMLWDcompatibility')
     d  value                        10i 0 value

     d get_xmlBufferAllocScheme...
     d                 pr                  extproc('__get_xmlBufferAllocScheme')
     d                                     like(xmlBufferAllocationScheme)

     d set_xmlBufferAllocScheme...
     d                 pr                  extproc('__set_xmlBufferAllocScheme')
     d  value                              value like(xmlBufferAllocationScheme)

     d xmlThrDefBufferAllocScheme...
     d                 pr                  extproc('xmlThrDefBufferAllocScheme')
     d                                     like(xmlBufferAllocationScheme)
     d  v                                  value like(xmlBufferAllocationScheme)

     d get_xmlDefaultBufferSize...
     d                 pr            10i 0 extproc('__get_xmlDefaultBufferSize')

     d set_xmlDefaultBufferSize...
     d                 pr                  extproc('__set_xmlDefaultBufferSize')
     d  value                        10i 0 value

     d xmlThrDefDefaultBufferSize...
     d                 pr            10i 0 extproc('xmlThrDefDefaultBufferSize')
     d  v                            10i 0 value

     d get_xmlDefaultSAXHandler...
     d                 pr                  extproc('__get_xmlDefaultSAXHandler')
     d                                     likeds(xmlSAXHandlerV1)

     d set_xmlDefaultSAXHandler...
     d                 pr                  extproc('__set_xmlDefaultSAXHandler')
     d  value                              value likeds(xmlSAXHandlerV1)

     d get_xmlDefaultSAXLocator...
     d                 pr                  extproc('__get_xmlDefaultSAXLocator')
     d                                     likeds(xmlSAXLocator)

     d set_xmlDefaultSAXLocator...
     d                 pr                  extproc('__set_xmlDefaultSAXLocator')
     d  value                              value likeds(xmlSAXLocator)

     d get_xmlDoValidityCheckingDefaultValue...
     d                 pr            10i 0 extproc('__get_xmlDoValidity+
     d                                       CheckingDefaultValue')

     d set_xmlDoValidityCheckingDefaultValue...
     d                 pr                  extproc('__set_xmlDoValidity+
     d                                       CheckingDefaultValue')
     d  value                        10i 0 value
    
     d xmlThrDefDoValidityCheckingDefaultValue...
     d                 pr            10i 0 extproc('xmlThrDefDoValidity+
     d                                       CheckingDefaultValue')
     d  v                            10i 0 value

     d get_xmlGenericError...
     d                 pr                  extproc('__get_xmlGenericError')
     d                                     like(xmlGenericErrorFunc)

     d set_xmlGenericError...
     d                 pr                  extproc('__set_xmlGenericError')
     d  func                               value like(xmlGenericErrorFunc)

     d get_xmlStructuredError...
     d                 pr                  extproc('__get_xmlStructuredError')
     d                                     like(xmlStructuredErrorFunc)

     d set_xmlStructuredError...
     d                 pr                  extproc('__set_xmlStructuredError')
     d  func                               value like(xmlStructuredErrorFunc)

     d xmlStructuredError...
     d                 pr                  extproc('__call_xmlStructuredError')
     d  userData                       *   value options(*string)               void *
     d  error                              value like(xmlErrorPtr) 

     d get_xmlGenericErrorContext...
     d                 pr                  extproc(
     d                                       '__get_xmlGenericErrorContext')
     d                                 *                                        void *

     d set_xmlGenericErrorContext...
     d                 pr                  extproc(
     d                                       '__set_xmlGenericErrorContext')
     d  value                          *   value options(*string)               void *

     d get_xmlStructuredErrorContext...
     d                 pr                  extproc(
     d                                       '__get_xmlStructuredErrorContext')
     d                                 *                                        void *

     d set_xmlStructuredErrorContext...
     d                 pr                  extproc(
     d                                       '__set_xmlStructuredErrorContext')
     d  value                          *   value options(*string)               void *

     d get_xmlGetWarningsDefaultValue...
     d                 pr            10i 0 extproc(
     d                                       '__get_xmlGetWarningsDefaultValue')

     d set_xmlGetWarningsDefaultValue...
     d                 pr                  extproc(
     d                                       '__set_xmlGetWarningsDefaultValue')
     d  value                        10i 0 value

     d xmlThrDefGetWarningsDefaultValue...
     d                 pr            10i 0 extproc(
     d                                       'xmlThrDefGetWarningsDefaultValue')
     d  v                            10i 0 value

     d get_xmlIndentTreeOutput...
     d                 pr            10i 0 extproc('__get_xmlIndentTreeOutput')

     d set_xmlIndentTreeOutput...
     d                 pr                   extproc('__set_xmlIndentTreeOutput')
     d  value                        10i 0 value

     d xmlThrDefIndentTreeOutput...
     d                 pr            10i 0 extproc('xmlThrDefIndentTreeOutput')
     d  v                            10i 0 value

     d get_xmlTreeIndentString...
     d                 pr              *   extproc('__get_xmlTreeIndentString') const char *

     d set_xmlTreeIndentString...
     d                 pr                  extproc('__set_xmlTreeIndentString')
     d  value                          *   value options(*string)               const char *
 
     d xmlThrDefTreeIndentString...
     d                 pr              *   extproc('xmlThrDefTreeIndentString') const char *
     d  v                              *   value options(*string)               const char *

     d get_xmlKeepBlanksDefaultValue...
     d                 pr            10i 0 extproc(
     d                                       '__get_xmlKeepBlanksDefaultValue') 

     d set_xmlKeepBlanksDefaultValue...
     d                 pr                  extproc(
     d                                       '__set_xmlKeepBlanksDefaultValue') 
     d  value                        10i 0 value

     d xmlThrDefKeepBlanksDefaultValue...
     d                 pr            10i 0 extproc(
     d                                       'xmlThrDefKeepBlanksDefaultValue')
     d  v                            10i 0 value

     d get_xmlLineNumbersDefaultValue...
     d                 pr            10i 0 extproc(
     d                                       '__get_xmlLineNumbersDefaultValue')

     d set_xmlLineNumbersDefaultValue...
     d                 pr                  extproc(
     d                                       '__set_xmlLineNumbersDefaultValue')
     d  value                        10i 0 value

     d xmlThrDefLineNumbersDefaultValue...
     d                 pr            10i 0 extproc(
     d                                       'xmlThrDefLineNumbersDefaultValue')
     d  v                            10i 0 value

     d get_xmlLoadExtDtdDefaultValue...
     d                 pr            10i 0 extproc(
     d                                       '__get_xmlLoadExtDtdDefaultValue')

     d set_xmlLoadExtDtdDefaultValue...
     d                 pr                  extproc(
     d                                       '__set_xmlLoadExtDtdDefaultValue')
     d  value                        10i 0 value

     d xmlThrDefLoadExtDtdDefaultValue...
     d                 pr            10i 0 extproc(
     d                                       'xmlThrDefLoadExtDtdDefaultValue')
     d  v                            10i 0 value

     d get_xmlParserDebugEntities...
     d                 pr            10i 0 extproc(
     d                                       '__get_xmlParserDebugEntities')

     d set_xmlParserDebugEntities...
     d                 pr                  extproc(
     d                                       '__set_xmlParserDebugEntities')
     d  value                        10i 0 value

     d xmlThrDefParserDebugEntities...
     d                 pr            10i 0 extproc(
     d                                       'xmlThrDefParserDebugEntities')
     d  v                            10i 0 value

     d get_xmlParserVersion...
     d                 pr              *   extproc('__get_xmlParserVersion')    const char *

     d set_xmlParserVersion...
     d                 pr                  extproc('__set_xmlParserVersion')
     d  value                          *   value options(*string)               const char *

     d get_xmlPedanticParserDefaultValue...
     d                 pr            10i 0 extproc('__get_xmlPedantic+
     d                                       ParserDefaultValue')

     d set_xmlPedanticParserDefaultValue...
     d                 pr                  extproc('__set_xmlPedantic+
     d                                       ParserDefaultValue')
     d  value                        10i 0 value

     d xmlThrDefPedanticParserDefaultValue...
     d                 pr            10i 0 extproc('xmlThrDefPedantic+
     d                                       ParserDefaultValue')
     d  v                            10i 0 value

     d get_xmlSaveNoEmptyTags...
     d                 pr            10i 0 extproc('__get_xmlSaveNoEmptyTags')

     d set_xmlSaveNoEmptyTags...
     d                 pr                  extproc('__set_xmlSaveNoEmptyTags')
     d  value                        10i 0 value

     d xmlThrDefSaveNoEmptyTags...
     d                 pr            10i 0 extproc('xmlThrDefSaveNoEmptyTags')
     d  v                            10i 0 value

     d get_xmlSubstituteEntitiesDefaultValue...
     d                 pr            10i 0 extproc('__get_xmlSubstitute+
     d                                       EntitiesDefaultValue')

     d set_xmlSubstituteEntitiesDefaultValue...
     d                 pr                  extproc('__set_xmlSubstitute+
     d                                       EntitiesDefaultValue')
     d  value                        10i 0 value

     d xmlThrDefSubstituteEntitiesDefaultValue...
     d                 pr            10i 0 extproc('xmlThrDefSubstitute+
     d                                       EntitiesDefaultValue')
     d  v                            10i 0 value

     d get_xmlRegisterNodeDefaultValue...
     d                 pr                  extproc('__get_xmlRegisterNode+
     d                                       DefaultValue')
     d                                     like(xmlRegisterNodeFunc)

     d set_xmlRegisterNodeDefaultValue...
     d                 pr                  extproc('__set_xmlRegisterNode+
     d                                       DefaultValue')
     d  value                              value like(xmlRegisterNodeFunc)

     d xmlRegisterNodeDefaultValue...
     d                 pr                  extproc('__call_xmlRegisterNode+
     d                                       DefaultValue')
     d  node                               value like(xmlNodePtr)

     d get_xmlDeregisterNodeDefaultValue...
     d                 pr                  extproc('__get_xmlDeregisterNode+
     d                                       DefaultValue')
     d                                     like(xmlDeregisterNodeFunc)

     d set_xmlDeregisterNodeDefaultValue...
     d                 pr                  extproc('__set_xmlDeregisterNode+
     d                                       DefaultValue')
     d  value                              value like(xmlDeregisterNodeFunc)

     d xmlDeregisterNodeDefaultValue...
     d                 pr                  extproc('__call_xmlDeregisterNode+
     d                                       DefaultValue')
     d  node                               value like(xmlNodePtr)

     d get_xmlParserInputBufferCreateFilenameValue...
     d                 pr                  extproc('__get_xmlParserInputBuffer+
     d                                       CreateFilenameValue')
     d                                     like(xmlParserInputBuffer...
     d                                       CreateFilenameFunc)

     d set_xmlParserInputBufferCreateFilenameValue...
     d                 pr                  extproc('__set_xmlParserInputBuffer+
     d                                       CreateFilenameValue')
     d  value                              value like(xmlParserInputBuffer...
     d                                       CreateFilenameFunc)

     d xmlParserInputBufferCreateFilenameValue...
     d                 pr                  extproc('__call_xmlParserInputBuffer+
     d                                       CreateFilenameValue')
     d                                     like(xmlParserInputBufferPtr)
     d  URI                            *   value options(*string)               const char *
     d  enc                                value like(xmlCharEncoding)

     d get_xmlOutputBufferCreateFilenameValue...
     d                 pr                  extproc('__get_xmlOutputBuffer+
     d                                       CreateFilenameValue')
     d                                     like(
     d                                       xmlOutputBufferCreateFilenameFunc)

     d set_xmlOutputBufferCreateFilenameValue...
     d                 pr                  extproc('__set_xmlOutputBuffer+
     d                                       CreateFilenameValue')
     d  value                              value like(
     d                                       xmlOutputBufferCreateFilenameFunc)

     d xmlOutputBufferCreateFilenameValue...
     d                 pr                  extproc('__call_xmlOutputBuffer+
     d                                       CreateFilenameValue')
     d                                     like(xmlOutputBufferPtr)
     d  URI                            *   value options(*string)               const char *
     d  encoder                            value like(xmlCharEncodingHandlerPtr)
     d  compression                  10i 0 value

      /endif                                                                    XML_GLOBALS_H
