      * Summary: interface for the XML entities handling
      * Description: this module provides some of the entity API needed
      *              for the parser and applications.
      *
      * Copy: See Copyright for the status of this software.
      *
      * Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A.

      /if not defined(XML_ENTITIES_H__)
      /define XML_ENTITIES_H__

      /include "libxmlrpg/xmlversion"
      /include "libxmlrpg/tree"

      * The different valid entity types.

     d xmlEntityType   s             10i 0 based(######typedef######)           enum
     d  XML_INTERNAL_GENERAL_ENTITY...
     d                 c                   1
     d  XML_EXTERNAL_GENERAL_PARSED_ENTITY...
     d                 c                   2
     d  XML_EXTERNAL_GENERAL_UNPARSED_ENTITY...
     d                 c                   3
     d  XML_INTERNAL_PARAMETER_ENTITY...
     d                 c                   4
     d  XML_EXTERNAL_PARAMETER_ENTITY...
     d                 c                   5
     d  XML_INTERNAL_PREDEFINED_ENTITY...
     d                 c                   6

      * An unit of storage for an entity, contains the string, the value
      * and the linkind data needed for the linking in the hash table.

     d xmlEntity       ds                  based(xmlEntityPtr)
     d                                     align qualified
     d  #private                       *                                        void *
     d  type                               like(xmlElementType)                 XML_ENTITY_DECL
     d  name                           *                                        const xmlChar *
     d  children                           like(xmlNodePtr)                     First child link
     d  last                               like(xmlNodePtr)                     Last child link
     d  parent                             like(xmlDtdPtr)                      -> DTD
     d  next                               like(xmlNodePtr)                     next sibling link
     d  prev                               like(xmlNodePtr)                     prev sibling link
     d  doc                                like(xmlDocPtr)                      containing document
     d  orig                           *                                        xmlChar *
     d  content                        *                                        xmlChar *
     d  length                       10i 0                                      content length
     d  etype                              like(xmlEntityType)                  The entity type
     d  ExternalID                     *                                        const xmlChar *
     d  SystemlID                      *                                        const xmlChar *
     d  nexte                              like(xmlEntityPtr)                   unused
     d  URI                            *                                        const xmlChar *
     d  owner                        10i 0                                      Owns children ?
     d  checked                      10i 0                                      Content checked ?

      * All entities are stored in an hash table.
      * There is 2 separate hash tables for global and parameter entities.

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

      * External functions:

      /if defined(LIBXML_LEGACY_ENABLED)
     d xmlInitializePredefinedEntities...
     d                 pr                  extproc(
     d                                      'xmlInitializePredefinedEntities')
      /endif                                                                    LIBXML_LEGACY_ENABLD

     d xmlNewEntity    pr                  extproc('xmlNewEntity')
     d                                     like(xmlEntityPtr)
     d  doc                                value like(xmlDocPtr)
     d  name                           *   value options(*string)               const xmlChar *
     d  type                         10i 0 value
     d  ExternalID                     *   value options(*string)               const xmlChar *
     d  SystemID                       *   value options(*string)               const xmlChar *
     d  content                        *   value options(*string)               const xmlChar *

     d xmlAddDocEntity...
     d                 pr                  extproc('xmlAddDocEntity')
     d                                     like(xmlEntityPtr)
     d  doc                                value like(xmlDocPtr)
     d  name                           *   value options(*string)               const xmlChar *
     d  type                         10i 0 value
     d  ExternalID                     *   value options(*string)               const xmlChar *
     d  SystemID                       *   value options(*string)               const xmlChar *
     d  content                        *   value options(*string)               const xmlChar *

     d xmlAddDtdEntity...
     d                 pr                  extproc('xmlAddDtdEntity')
     d                                     like(xmlEntityPtr)
     d  doc                                value like(xmlDocPtr)
     d  name                           *   value options(*string)               const xmlChar *
     d  type                         10i 0 value
     d  ExternalID                     *   value options(*string)               const xmlChar *
     d  SystemID                       *   value options(*string)               const xmlChar *
     d  content                        *   value options(*string)               const xmlChar *

     d xmlGetPredefinedEntity...
     d                 pr                  extproc('xmlGetPredefinedEntity')
     d                                     like(xmlEntityPtr)
     d  name                           *   value options(*string)               const xmlChar *

     d xmlGetDocEntity...
     d                 pr                  extproc('xmlGetDocEntity')
     d                                     like(xmlEntityPtr)
     d  doc                                value like(xmlDocPtr)
     d  name                           *   value options(*string)               const xmlChar *

     d xmlGetDtdEntity...
     d                 pr                  extproc('xmlGetDtdEntity')
     d                                     like(xmlEntityPtr)
     d  doc                                value like(xmlDocPtr)
     d  name                           *   value options(*string)               const xmlChar *

     d xmlGetParameterEntity...
     d                 pr                  extproc('xmlGetParameterEntity')
     d                                     like(xmlEntityPtr)
     d  doc                                value like(xmlDocPtr)
     d  name                           *   value options(*string)               const xmlChar *


      /if defined(LIBXML_LEGACY_ENABLED)
     d xmlEncodeEntities...
     d                 pr              *   extproc('xmlEncodeEntities')         xmlChar *
     d  doc                                value like(xmlDocPtr)
     d  input                          *   value options(*string)               const xmlChar *
      /endif                                                                    LIBXML_LEGACY_ENABLD

     d xmlEncodeEntitiesReentrant...
     d                 pr              *   extproc(                             xmlChar *
     d                                      'xmlEncodeEntitiesReentrant')
     d  doc                                value like(xmlDocPtr)
     d  input                          *   value options(*string)               const xmlChar *
XMLPU
     d xmlEncodeSpecialChars...
     d                 pr              *   extproc('xmlSpecialChars')           xmlChar *
     d  doc                                value like(xmlDocPtr)
     d  input                          *   value options(*string)               const xmlChar *
XMLPU
     d xmlCreateEntitiesTable...
     d                 pr                  extproc('xmlCreateEntitiesTable')
     d                                     like(xmlEntitiesTablePtr)

      /if defined(LIBXML_TREE_ENABLED)
     d xmlCopyEntitiesTable...
     d                 pr                  extproc('xmlCopyEntitiesTable')
     d                                     like(xmlEntitiesTablePtr)
     d  table                              value like(xmlEntitiesTablePtr)
      /endif                                                                    LIBXML_TREE_ENABLED

     d xmlFreeEntitiesTable...
     d                 pr                  extproc('xmlFreeEntitiesTable')
     d  table                              value like(xmlEntitiesTablePtr)
XMLPU
      /if defined(LIBXML_OUTPUT_ENABLED)
     d xmlDumpEntitiesTable...
     d                 pr                  extproc('xmlDumpEntitiesTable')
     d  buf                                value like(xmlBufferPtr)
     d  table                              value like(xmlEntitiesTablePtr)
XMLPU
     d xmlDumpEntityDecl...
     d                 pr                  extproc('xmlDumpEntityDecl')
     d  buf                                value like(xmlBufferPtr)
     d  ent                                value like(xmlEntityPtr)
      /endif                                                                    LIBXML_OUTPUT_ENABLD

      /if defined(LIBXML_LEGACY_ENABLED)
     d xmlCleanupPredefinedEntities...
     d                 pr                  extproc(
XMLPUd                                      'xmlCleanupPredefinedEntities')
      /endif                                                                    LIBXML_LEGACY_ENABLD

      /endif                                                                    XML_ENTITIES_H__
