11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   See the file COPYING for copying permission.
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <stddef.h>
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string.h>                     /* memset(), memcpy() */
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <assert.h>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <limits.h>                     /* UINT_MAX */
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <time.h>                       /* time() */
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_BUILDING_EXPAT 1
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef COMPILED_FROM_DSP
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "winconfig.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(MACOS_CLASSIC)
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "macconfig.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(__amigaos__)
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "amigaconfig.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(__WATCOMC__)
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "watcomconfig.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(HAVE_EXPAT_CONFIG_H)
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <expat_config.h>
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* ndef COMPILED_FROM_DSP */
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ascii.h"
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "expat.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_UNICODE
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlConvert XmlUtf16Convert
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlEncode XmlUtf16Encode
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Using pointer subtraction to convert to integer type. */
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1))
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef unsigned short ICHAR;
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlConvert XmlUtf8Convert
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlEncode XmlUtf8Encode
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MUST_CONVERT(enc, s) (!(enc)->isUtf8)
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef char ICHAR;
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef XML_NS
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlInitEncodingNS XmlInitEncoding
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef XmlGetInternalEncodingNS
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlGetInternalEncodingNS XmlGetInternalEncoding
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlParseXmlDeclNS XmlParseXmlDecl
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_UNICODE
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_UNICODE_WCHAR_T
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_T(x) (const wchar_t)x
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_L(x) L ## x
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_T(x) (const unsigned short)x
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_L(x) x
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_T(x) x
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_L(x) x
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Round up n to be a multiple of sz, where sz is a power of 2. */
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1))
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Handle the case where memmove() doesn't exist. */
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef HAVE_MEMMOVE
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef HAVE_BCOPY
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define memmove(d,s,l) bcopy((s),(d),(l))
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#error memmove does not exist on this platform, nor is a substitute available
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* HAVE_BCOPY */
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* HAVE_MEMMOVE */
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "internal.h"
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "xmltok.h"
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "xmlrole.h"
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef const XML_Char *KEY;
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct {
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KEY name;
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} NAMED;
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct {
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NAMED **v;
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned char power;
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t size;
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t used;
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Memory_Handling_Suite *mem;
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} HASH_TABLE;
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Basic character hash algorithm, taken from Python's string hash:
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   h = h * 1000003 ^ character, the constant being a prime number.
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_UNICODE
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CHAR_HASH(h, c) \
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (((h) * 0xF4243) ^ (unsigned short)(c))
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CHAR_HASH(h, c) \
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (((h) * 0xF4243) ^ (unsigned char)(c))
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* For probing (after a collision) we need a step size relative prime
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   to the hash table size, which is a power of 2. We use double-hashing,
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   since we can calculate a second hash value cheaply by taking those bits
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   of the first hash value that were discarded (masked out) when the table
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   index was calculated: index = hash & mask, where mask = table->size - 1.
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   We limit the maximum step size to table->size / 4 (mask >> 2) and make
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   it odd, since odd numbers are always relative prime to a power of 2.
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define SECOND_HASH(hash, mask, power) \
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2))
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define PROBE_STEP(hash, mask, power) \
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1))
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct {
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NAMED **p;
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NAMED **end;
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} HASH_TABLE_ITER;
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_TAG_BUF_SIZE 32  /* must be a multiple of sizeof(XML_Char) */
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_DATA_BUF_SIZE 1024
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_ATTS_SIZE 16
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_ATTS_VERSION 0xFFFFFFFF
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_BLOCK_SIZE 1024
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_BUFFER_SIZE 1024
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define EXPAND_SPARE 24
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct binding {
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct prefix *prefix;
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct binding *nextTagBinding;
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct binding *prevPrefixBinding;
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const struct attribute_id *attId;
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char *uri;
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int uriLen;
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int uriAlloc;
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} BINDING;
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct prefix {
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *name;
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BINDING *binding;
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} PREFIX;
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct {
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *str;
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *localPart;
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *prefix;
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int strLen;
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int uriLen;
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int prefixLen;
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} TAG_NAME;
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* TAG represents an open element.
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   The name of the element is stored in both the document and API
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   encodings.  The memory buffer 'buf' is a separately-allocated
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   memory area which stores the name.  During the XML_Parse()/
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   XMLParseBuffer() when the element is open, the memory for the 'raw'
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   version of the name (in the document encoding) is shared with the
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   document buffer.  If the element is open across calls to
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   contain the 'raw' name as well.
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   A parser re-uses these structures, maintaining a list of allocated
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   TAG objects in a free list.
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct tag {
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct tag *parent;           /* parent of this element */
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *rawName;          /* tagName in the original encoding */
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int rawNameLength;
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TAG_NAME name;                /* tagName in the API encoding */
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  char *buf;                    /* buffer for name components */
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  char *bufEnd;                 /* end of the buffer */
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BINDING *bindings;
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} TAG;
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct {
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *name;
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *textPtr;
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int textLen;                  /* length in XML_Chars */
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int processed;                /* # of processed bytes - when suspended */
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *systemId;
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *base;
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *publicId;
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *notation;
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool open;
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool is_param;
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool is_internal; /* true if declared in internal subset outside PE */
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} ENTITY;
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct {
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Content_Type         type;
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Content_Quant        quant;
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *              name;
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int                           firstchild;
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int                           lastchild;
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int                           childcnt;
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int                           nextsib;
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} CONTENT_SCAFFOLD;
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_SCAFFOLD_ELEMENTS 32
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct block {
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct block *next;
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int size;
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char s[1];
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} BLOCK;
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct {
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BLOCK *blocks;
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BLOCK *freeBlocks;
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *end;
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char *ptr;
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char *start;
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Memory_Handling_Suite *mem;
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} STRING_POOL;
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* The XML_Char before the name is used to determine whether
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   an attribute has been specified. */
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct attribute_id {
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char *name;
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PREFIX *prefix;
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool maybeTokenized;
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool xmlns;
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} ATTRIBUTE_ID;
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct {
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ATTRIBUTE_ID *id;
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool isCdata;
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *value;
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} DEFAULT_ATTRIBUTE;
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct {
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned long version;
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned long hash;
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *uriName;
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} NS_ATT;
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct {
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *name;
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PREFIX *prefix;
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ATTRIBUTE_ID *idAtt;
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int nDefaultAtts;
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int allocDefaultAtts;
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DEFAULT_ATTRIBUTE *defaultAtts;
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} ELEMENT_TYPE;
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct {
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HASH_TABLE generalEntities;
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HASH_TABLE elementTypes;
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HASH_TABLE attributeIds;
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HASH_TABLE prefixes;
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  STRING_POOL pool;
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  STRING_POOL entityValuePool;
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* false once a parameter entity reference has been skipped */
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool keepProcessing;
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* true once an internal or external PE reference has been encountered;
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     this includes the reference to an external subset */
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool hasParamEntityRefs;
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool standalone;
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* indicates if external PE has been read */
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool paramEntityRead;
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HASH_TABLE paramEntities;
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PREFIX defaultPrefix;
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* === scaffolding for building content model === */
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool in_eldecl;
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CONTENT_SCAFFOLD *scaffold;
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned contentStringLen;
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned scaffSize;
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned scaffCount;
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int scaffLevel;
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int *scaffIndex;
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} DTD;
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct open_internal_entity {
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *internalEventPtr;
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *internalEventEndPtr;
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct open_internal_entity *next;
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ENTITY *entity;
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int startTagLevel;
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool betweenDecl; /* WFC: PE Between Declarations */
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} OPEN_INTERNAL_ENTITY;
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef enum XML_Error PTRCALL Processor(XML_Parser parser,
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         const char *start,
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         const char *end,
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         const char **endPtr);
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor prologProcessor;
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor prologInitProcessor;
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor contentProcessor;
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor cdataSectionProcessor;
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor ignoreSectionProcessor;
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor externalParEntProcessor;
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor externalParEntInitProcessor;
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor entityValueProcessor;
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor entityValueInitProcessor;
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor epilogProcessor;
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor errorProcessor;
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor externalEntityInitProcessor;
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor externalEntityInitProcessor2;
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor externalEntityInitProcessor3;
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor externalEntityContentProcessor;
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor internalEntityProcessor;
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihandleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName);
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciprocessXmlDecl(XML_Parser parser, int isGeneralTextEntity,
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char *s, const char *next);
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciinitializeEncoding(XML_Parser parser);
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoProlog(XML_Parser parser, const ENCODING *enc, const char *s,
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         const char *end, int tok, const char *next, const char **nextPtr,
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         XML_Bool haveMore);
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciprocessInternalEntity(XML_Parser parser, ENTITY *entity,
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      XML_Bool betweenDecl);
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const char *start, const char *end, const char **endPtr,
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          XML_Bool haveMore);
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr,
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char *end, const char **nextPtr, XML_Bool haveMore);
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr,
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char *end, const char **nextPtr, XML_Bool haveMore);
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistoreAtts(XML_Parser parser, const ENCODING *, const char *s,
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          TAG_NAME *tagNamePtr, BINDING **bindingsPtr);
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciaddBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           const XML_Char *uri, BINDING **bindingsPtr);
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidefineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata,
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser);
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistoreAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata,
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const char *, const char *, STRING_POOL *);
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciappendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata,
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     const char *, const char *, STRING_POOL *);
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic ATTRIBUTE_ID *
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccigetAttributeId(XML_Parser parser, const ENCODING *enc, const char *start,
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char *end);
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccisetElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *);
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistoreEntityValue(XML_Parser parser, const ENCODING *enc, const char *start,
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 const char *end);
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccireportProcessingInstruction(XML_Parser parser, const ENCODING *enc,
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            const char *start, const char *end);
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccireportComment(XML_Parser parser, const ENCODING *enc, const char *start,
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              const char *end);
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccireportDefault(XML_Parser parser, const ENCODING *enc, const char *start,
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              const char *end);
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char * getContext(XML_Parser parser);
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccisetContext(XML_Parser parser, const XML_Char *context);
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL normalizePublicId(XML_Char *s);
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic DTD * dtdCreate(const XML_Memory_Handling_Suite *ms);
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* do not call if parentParser != NULL */
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms);
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms);
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidtdCopy(XML_Parser oldParser,
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms);
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccicopyEntityTable(XML_Parser oldParser,
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                HASH_TABLE *, STRING_POOL *, const HASH_TABLE *);
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic NAMED *
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccilookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize);
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms);
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL hashTableClear(HASH_TABLE *);
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL hashTableDestroy(HASH_TABLE *);
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *);
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *);
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms);
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL poolClear(STRING_POOL *);
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL poolDestroy(STRING_POOL *);
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Char *
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolAppend(STRING_POOL *pool, const ENCODING *enc,
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           const char *ptr, const char *end);
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Char *
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolStoreString(STRING_POOL *pool, const ENCODING *enc,
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char *ptr, const char *end);
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool FASTCALL poolGrow(STRING_POOL *pool);
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char * FASTCALL
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolCopyString(STRING_POOL *pool, const XML_Char *s);
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char *
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n);
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char * FASTCALL
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolAppendString(STRING_POOL *pool, const XML_Char *s);
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int FASTCALL nextScaffoldPart(XML_Parser parser);
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Content * build_model(XML_Parser parser);
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic ELEMENT_TYPE *
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccigetElementType(XML_Parser parser, const ENCODING *enc,
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char *ptr, const char *end);
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic unsigned long generate_hash_secret_salt(void);
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool startParsing(XML_Parser parser);
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Parser
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciparserCreate(const XML_Char *encodingName,
4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             const XML_Memory_Handling_Suite *memsuite,
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             const XML_Char *nameSep,
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             DTD *dtd);
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciparserInit(XML_Parser parser, const XML_Char *encodingName);
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolStart(pool) ((pool)->start)
4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolEnd(pool) ((pool)->ptr)
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolLength(pool) ((pool)->ptr - (pool)->start)
4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolChop(pool) ((void)--(pool->ptr))
4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolLastChar(pool) (((pool)->ptr)[-1])
4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolDiscard(pool) ((pool)->ptr = (pool)->start)
4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolFinish(pool) ((pool)->start = (pool)->ptr)
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolAppendChar(pool, c) \
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (((pool)->ptr == (pool)->end && !poolGrow(pool)) \
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   ? 0 \
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   : ((*((pool)->ptr)++ = c), 1))
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct XML_ParserStruct {
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* The first member must be userData so that the XML_GetUserData
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     macro works. */
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void *m_userData;
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void *m_handlerArg;
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  char *m_buffer;
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Memory_Handling_Suite m_mem;
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* first character to be parsed */
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *m_bufferPtr;
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* past last character to be parsed */
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  char *m_bufferEnd;
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* allocated end of buffer */
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *m_bufferLim;
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Index m_parseEndByteIndex;
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *m_parseEndPtr;
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char *m_dataBuf;
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char *m_dataBufEnd;
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_StartElementHandler m_startElementHandler;
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_EndElementHandler m_endElementHandler;
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_CharacterDataHandler m_characterDataHandler;
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_ProcessingInstructionHandler m_processingInstructionHandler;
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_CommentHandler m_commentHandler;
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_StartCdataSectionHandler m_startCdataSectionHandler;
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_EndCdataSectionHandler m_endCdataSectionHandler;
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_DefaultHandler m_defaultHandler;
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler;
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler;
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler;
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_NotationDeclHandler m_notationDeclHandler;
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler;
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler;
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_NotStandaloneHandler m_notStandaloneHandler;
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_ExternalEntityRefHandler m_externalEntityRefHandler;
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Parser m_externalEntityRefHandlerArg;
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_SkippedEntityHandler m_skippedEntityHandler;
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_UnknownEncodingHandler m_unknownEncodingHandler;
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_ElementDeclHandler m_elementDeclHandler;
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_AttlistDeclHandler m_attlistDeclHandler;
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_EntityDeclHandler m_entityDeclHandler;
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_XmlDeclHandler m_xmlDeclHandler;
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ENCODING *m_encoding;
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  INIT_ENCODING m_initEncoding;
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ENCODING *m_internalEncoding;
5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *m_protocolEncodingName;
5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool m_ns;
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool m_ns_triplets;
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void *m_unknownEncodingMem;
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void *m_unknownEncodingData;
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void *m_unknownEncodingHandlerData;
5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void (XMLCALL *m_unknownEncodingRelease)(void *);
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PROLOG_STATE m_prologState;
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Processor *m_processor;
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Error m_errorCode;
5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *m_eventPtr;
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *m_eventEndPtr;
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *m_positionPtr;
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OPEN_INTERNAL_ENTITY *m_openInternalEntities;
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OPEN_INTERNAL_ENTITY *m_freeInternalEntities;
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool m_defaultExpandInternalEntities;
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int m_tagLevel;
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ENTITY *m_declEntity;
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *m_doctypeName;
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *m_doctypeSysid;
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *m_doctypePubid;
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *m_declAttributeType;
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *m_declNotationName;
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *m_declNotationPublicId;
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ELEMENT_TYPE *m_declElementType;
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ATTRIBUTE_ID *m_declAttributeId;
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool m_declAttributeIsCdata;
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool m_declAttributeIsId;
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD *m_dtd;
5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *m_curBase;
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TAG *m_tagStack;
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TAG *m_freeTagList;
5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BINDING *m_inheritedBindings;
5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BINDING *m_freeBindingList;
5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int m_attsSize;
5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int m_nSpecifiedAtts;
5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int m_idAttIndex;
5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ATTRIBUTE *m_atts;
5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NS_ATT *m_nsAtts;
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned long m_nsAttsVersion;
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned char m_nsAttsPower;
5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO
5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_AttrInfo *m_attInfo;
5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  POSITION m_position;
5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  STRING_POOL m_tempPool;
5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  STRING_POOL m_temp2Pool;
5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  char *m_groupConnector;
5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned int m_groupSize;
5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char m_namespaceSeparator;
5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Parser m_parentParser;
5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_ParsingStatus m_parsingStatus;
5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool m_isParamEntity;
5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool m_useForeignDTD;
5571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_ParamEntityParsing m_paramEntityParsing;
5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned long m_hash_secret_salt;
5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
5611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MALLOC(s) (parser->m_mem.malloc_fcn((s)))
5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s)))
5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define FREE(p) (parser->m_mem.free_fcn((p)))
5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define userData (parser->m_userData)
5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define handlerArg (parser->m_handlerArg)
5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define startElementHandler (parser->m_startElementHandler)
5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define endElementHandler (parser->m_endElementHandler)
5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define characterDataHandler (parser->m_characterDataHandler)
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define processingInstructionHandler \
5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (parser->m_processingInstructionHandler)
5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define commentHandler (parser->m_commentHandler)
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define startCdataSectionHandler \
5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (parser->m_startCdataSectionHandler)
5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define endCdataSectionHandler (parser->m_endCdataSectionHandler)
5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define defaultHandler (parser->m_defaultHandler)
5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler)
5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler)
5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define unparsedEntityDeclHandler \
5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (parser->m_unparsedEntityDeclHandler)
5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define notationDeclHandler (parser->m_notationDeclHandler)
5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define startNamespaceDeclHandler \
5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (parser->m_startNamespaceDeclHandler)
5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler)
5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define notStandaloneHandler (parser->m_notStandaloneHandler)
5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define externalEntityRefHandler \
5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (parser->m_externalEntityRefHandler)
5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define externalEntityRefHandlerArg \
5901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (parser->m_externalEntityRefHandlerArg)
5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define internalEntityRefHandler \
5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (parser->m_internalEntityRefHandler)
5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define skippedEntityHandler (parser->m_skippedEntityHandler)
5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define unknownEncodingHandler (parser->m_unknownEncodingHandler)
5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define elementDeclHandler (parser->m_elementDeclHandler)
5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define attlistDeclHandler (parser->m_attlistDeclHandler)
5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define entityDeclHandler (parser->m_entityDeclHandler)
5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define xmlDeclHandler (parser->m_xmlDeclHandler)
5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define encoding (parser->m_encoding)
6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define initEncoding (parser->m_initEncoding)
6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define internalEncoding (parser->m_internalEncoding)
6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define unknownEncodingMem (parser->m_unknownEncodingMem)
6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define unknownEncodingData (parser->m_unknownEncodingData)
6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define unknownEncodingHandlerData \
6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (parser->m_unknownEncodingHandlerData)
6061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define unknownEncodingRelease (parser->m_unknownEncodingRelease)
6071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define protocolEncodingName (parser->m_protocolEncodingName)
6081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define ns (parser->m_ns)
6091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define ns_triplets (parser->m_ns_triplets)
6101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define prologState (parser->m_prologState)
6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define processor (parser->m_processor)
6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define errorCode (parser->m_errorCode)
6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define eventPtr (parser->m_eventPtr)
6141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define eventEndPtr (parser->m_eventEndPtr)
6151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define positionPtr (parser->m_positionPtr)
6161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define position (parser->m_position)
6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define openInternalEntities (parser->m_openInternalEntities)
6181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define freeInternalEntities (parser->m_freeInternalEntities)
6191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define defaultExpandInternalEntities \
6201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (parser->m_defaultExpandInternalEntities)
6211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define tagLevel (parser->m_tagLevel)
6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define buffer (parser->m_buffer)
6231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define bufferPtr (parser->m_bufferPtr)
6241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define bufferEnd (parser->m_bufferEnd)
6251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define parseEndByteIndex (parser->m_parseEndByteIndex)
6261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define parseEndPtr (parser->m_parseEndPtr)
6271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define bufferLim (parser->m_bufferLim)
6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define dataBuf (parser->m_dataBuf)
6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define dataBufEnd (parser->m_dataBufEnd)
6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define _dtd (parser->m_dtd)
6311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define curBase (parser->m_curBase)
6321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declEntity (parser->m_declEntity)
6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define doctypeName (parser->m_doctypeName)
6341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define doctypeSysid (parser->m_doctypeSysid)
6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define doctypePubid (parser->m_doctypePubid)
6361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declAttributeType (parser->m_declAttributeType)
6371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declNotationName (parser->m_declNotationName)
6381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declNotationPublicId (parser->m_declNotationPublicId)
6391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declElementType (parser->m_declElementType)
6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declAttributeId (parser->m_declAttributeId)
6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declAttributeIsCdata (parser->m_declAttributeIsCdata)
6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declAttributeIsId (parser->m_declAttributeIsId)
6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define freeTagList (parser->m_freeTagList)
6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define freeBindingList (parser->m_freeBindingList)
6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define inheritedBindings (parser->m_inheritedBindings)
6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define tagStack (parser->m_tagStack)
6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define atts (parser->m_atts)
6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define attsSize (parser->m_attsSize)
6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define nSpecifiedAtts (parser->m_nSpecifiedAtts)
6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define idAttIndex (parser->m_idAttIndex)
6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define nsAtts (parser->m_nsAtts)
6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define nsAttsVersion (parser->m_nsAttsVersion)
6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define nsAttsPower (parser->m_nsAttsPower)
6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define attInfo (parser->m_attInfo)
6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define tempPool (parser->m_tempPool)
6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define temp2Pool (parser->m_temp2Pool)
6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define groupConnector (parser->m_groupConnector)
6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define groupSize (parser->m_groupSize)
6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define namespaceSeparator (parser->m_namespaceSeparator)
6601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define parentParser (parser->m_parentParser)
6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define ps_parsing (parser->m_parsingStatus.parsing)
6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define ps_finalBuffer (parser->m_parsingStatus.finalBuffer)
6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define isParamEntity (parser->m_isParamEntity)
6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define useForeignDTD (parser->m_useForeignDTD)
6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define paramEntityParsing (parser->m_paramEntityParsing)
6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define hash_secret_salt (parser->m_hash_secret_salt)
6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Parser XMLCALL
6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ParserCreate(const XML_Char *encodingName)
6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_ParserCreate_MM(encodingName, NULL, NULL);
6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Parser XMLCALL
6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep)
6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char tmp[2];
6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *tmp = nsSep;
6811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_ParserCreate_MM(encodingName, NULL, tmp);
6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char implicitContext[] = {
6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p,
6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w,
6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g,
6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9,
6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e,
6901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0'
6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
6921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic unsigned long
6941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccigenerate_hash_secret_salt(void)
6951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
6961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned int seed = time(NULL) % UINT_MAX;
6971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  srand(seed);
6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return rand();
6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool  /* only valid for root parser */
7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistartParsing(XML_Parser parser)
7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* hash functions must be initialized before setContext() is called */
7051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (hash_secret_salt == 0)
7061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      hash_secret_salt = generate_hash_secret_salt();
7071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ns) {
7081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* implicit context only set for root parser, since child
7091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         parsers (i.e. external entity parsers) will inherit it
7101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      */
7111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return setContext(parser, implicitContext);
7121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
7131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TRUE;
7141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
7151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Parser XMLCALL
7171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ParserCreate_MM(const XML_Char *encodingName,
7181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const XML_Memory_Handling_Suite *memsuite,
7191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const XML_Char *nameSep)
7201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
7211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return parserCreate(encodingName, memsuite, nameSep, NULL);
7221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
7231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Parser
7251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciparserCreate(const XML_Char *encodingName,
7261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             const XML_Memory_Handling_Suite *memsuite,
7271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             const XML_Char *nameSep,
7281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             DTD *dtd)
7291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Parser parser;
7311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (memsuite) {
7331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_Memory_Handling_Suite *mtemp;
7341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    parser = (XML_Parser)
7351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      memsuite->malloc_fcn(sizeof(struct XML_ParserStruct));
7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (parser != NULL) {
7371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
7381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      mtemp->malloc_fcn = memsuite->malloc_fcn;
7391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      mtemp->realloc_fcn = memsuite->realloc_fcn;
7401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      mtemp->free_fcn = memsuite->free_fcn;
7411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
7441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_Memory_Handling_Suite *mtemp;
7451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct));
7461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (parser != NULL) {
7471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
7481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      mtemp->malloc_fcn = malloc;
7491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      mtemp->realloc_fcn = realloc;
7501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      mtemp->free_fcn = free;
7511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
7521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!parser)
7551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return parser;
7561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  buffer = NULL;
7581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bufferLim = NULL;
7591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  attsSize = INIT_ATTS_SIZE;
7611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE));
7621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (atts == NULL) {
7631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FREE(parser);
7641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
7651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO
7671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  attInfo = (XML_AttrInfo*)MALLOC(attsSize * sizeof(XML_AttrInfo));
7681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (attInfo == NULL) {
7691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FREE(atts);
7701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FREE(parser);
7711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
7721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
7741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char));
7751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (dataBuf == NULL) {
7761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FREE(atts);
7771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO
7781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FREE(attInfo);
7791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
7801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FREE(parser);
7811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
7821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE;
7841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (dtd)
7861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    _dtd = dtd;
7871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
7881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    _dtd = dtdCreate(&parser->m_mem);
7891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (_dtd == NULL) {
7901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      FREE(dataBuf);
7911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      FREE(atts);
7921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO
7931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      FREE(attInfo);
7941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
7951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      FREE(parser);
7961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return NULL;
7971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
7981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  freeBindingList = NULL;
8011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  freeTagList = NULL;
8021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  freeInternalEntities = NULL;
8031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  groupSize = 0;
8051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  groupConnector = NULL;
8061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unknownEncodingHandler = NULL;
8081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unknownEncodingHandlerData = NULL;
8091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  namespaceSeparator = ASCII_EXCL;
8111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ns = XML_FALSE;
8121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ns_triplets = XML_FALSE;
8131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  nsAtts = NULL;
8151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  nsAttsVersion = 0;
8161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  nsAttsPower = 0;
8171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolInit(&tempPool, &(parser->m_mem));
8191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolInit(&temp2Pool, &(parser->m_mem));
8201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  parserInit(parser, encodingName);
8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (encodingName && !protocolEncodingName) {
8231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_ParserFree(parser);
8241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
8251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
8261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (nameSep) {
8281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ns = XML_TRUE;
8291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    internalEncoding = XmlGetInternalEncodingNS();
8301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    namespaceSeparator = *nameSep;
8311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
8321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
8331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    internalEncoding = XmlGetInternalEncoding();
8341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
8351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return parser;
8371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
8381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void
8401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciparserInit(XML_Parser parser, const XML_Char *encodingName)
8411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  processor = prologInitProcessor;
8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XmlPrologStateInit(&prologState);
8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  protocolEncodingName = (encodingName != NULL
8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          ? poolCopyString(&tempPool, encodingName)
8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          : NULL);
8471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  curBase = NULL;
8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XmlInitEncoding(&initEncoding, &encoding, 0);
8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  userData = NULL;
8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  handlerArg = NULL;
8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startElementHandler = NULL;
8521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endElementHandler = NULL;
8531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  characterDataHandler = NULL;
8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  processingInstructionHandler = NULL;
8551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  commentHandler = NULL;
8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startCdataSectionHandler = NULL;
8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endCdataSectionHandler = NULL;
8581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  defaultHandler = NULL;
8591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startDoctypeDeclHandler = NULL;
8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endDoctypeDeclHandler = NULL;
8611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unparsedEntityDeclHandler = NULL;
8621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  notationDeclHandler = NULL;
8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startNamespaceDeclHandler = NULL;
8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endNamespaceDeclHandler = NULL;
8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  notStandaloneHandler = NULL;
8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  externalEntityRefHandler = NULL;
8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  externalEntityRefHandlerArg = parser;
8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  skippedEntityHandler = NULL;
8691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  elementDeclHandler = NULL;
8701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  attlistDeclHandler = NULL;
8711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  entityDeclHandler = NULL;
8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  xmlDeclHandler = NULL;
8731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bufferPtr = buffer;
8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bufferEnd = buffer;
8751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  parseEndByteIndex = 0;
8761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  parseEndPtr = NULL;
8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  declElementType = NULL;
8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  declAttributeId = NULL;
8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  declEntity = NULL;
8801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  doctypeName = NULL;
8811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  doctypeSysid = NULL;
8821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  doctypePubid = NULL;
8831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  declAttributeType = NULL;
8841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  declNotationName = NULL;
8851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  declNotationPublicId = NULL;
8861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  declAttributeIsCdata = XML_FALSE;
8871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  declAttributeIsId = XML_FALSE;
8881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  memset(&position, 0, sizeof(POSITION));
8891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  errorCode = XML_ERROR_NONE;
8901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  eventPtr = NULL;
8911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  eventEndPtr = NULL;
8921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  positionPtr = NULL;
8931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  openInternalEntities = NULL;
8941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  defaultExpandInternalEntities = XML_TRUE;
8951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tagLevel = 0;
8961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tagStack = NULL;
8971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  inheritedBindings = NULL;
8981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  nSpecifiedAtts = 0;
8991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unknownEncodingMem = NULL;
9001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unknownEncodingRelease = NULL;
9011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unknownEncodingData = NULL;
9021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  parentParser = NULL;
9031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ps_parsing = XML_INITIALIZED;
9041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
9051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  isParamEntity = XML_FALSE;
9061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  useForeignDTD = XML_FALSE;
9071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
9081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
9091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hash_secret_salt = 0;
9101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
9111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* moves list of bindings to freeBindingList */
9131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL
9141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccimoveToFreeBindingList(XML_Parser parser, BINDING *bindings)
9151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
9161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (bindings) {
9171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BINDING *b = bindings;
9181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bindings = bindings->nextTagBinding;
9191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    b->nextTagBinding = freeBindingList;
9201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    freeBindingList = b;
9211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
9221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
9231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Bool XMLCALL
9251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ParserReset(XML_Parser parser, const XML_Char *encodingName)
9261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
9271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TAG *tStk;
9281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OPEN_INTERNAL_ENTITY *openEntityList;
9291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (parentParser)
9301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_FALSE;
9311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* move tagStack to freeTagList */
9321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tStk = tagStack;
9331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (tStk) {
9341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TAG *tag = tStk;
9351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tStk = tStk->parent;
9361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tag->parent = freeTagList;
9371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    moveToFreeBindingList(parser, tag->bindings);
9381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tag->bindings = NULL;
9391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    freeTagList = tag;
9401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
9411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* move openInternalEntities to freeInternalEntities */
9421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  openEntityList = openInternalEntities;
9431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (openEntityList) {
9441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_INTERNAL_ENTITY *openEntity = openEntityList;
9451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    openEntityList = openEntity->next;
9461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    openEntity->next = freeInternalEntities;
9471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    freeInternalEntities = openEntity;
9481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
9491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  moveToFreeBindingList(parser, inheritedBindings);
9501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FREE(unknownEncodingMem);
9511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (unknownEncodingRelease)
9521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    unknownEncodingRelease(unknownEncodingData);
9531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolClear(&tempPool);
9541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolClear(&temp2Pool);
9551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  parserInit(parser, encodingName);
9561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dtdReset(_dtd, &parser->m_mem);
9571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TRUE;
9581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
9591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Status XMLCALL
9611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetEncoding(XML_Parser parser, const XML_Char *encodingName)
9621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
9631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* Block after XML_Parse()/XML_ParseBuffer() has been called.
9641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     XXX There's no way for the caller to determine which of the
9651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     XXX possible error cases caused the XML_STATUS_ERROR return.
9661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  */
9671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
9681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_STATUS_ERROR;
9691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (encodingName == NULL)
9701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    protocolEncodingName = NULL;
9711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
9721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    protocolEncodingName = poolCopyString(&tempPool, encodingName);
9731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!protocolEncodingName)
9741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_STATUS_ERROR;
9751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
9761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_STATUS_OK;
9771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
9781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Parser XMLCALL
9801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ExternalEntityParserCreate(XML_Parser oldParser,
9811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               const XML_Char *context,
9821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               const XML_Char *encodingName)
9831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
9841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Parser parser = oldParser;
9851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD *newDtd = NULL;
9861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD *oldDtd = _dtd;
9871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_StartElementHandler oldStartElementHandler = startElementHandler;
9881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_EndElementHandler oldEndElementHandler = endElementHandler;
9891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler;
9901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_ProcessingInstructionHandler oldProcessingInstructionHandler
9911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      = processingInstructionHandler;
9921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_CommentHandler oldCommentHandler = commentHandler;
9931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_StartCdataSectionHandler oldStartCdataSectionHandler
9941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      = startCdataSectionHandler;
9951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_EndCdataSectionHandler oldEndCdataSectionHandler
9961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      = endCdataSectionHandler;
9971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_DefaultHandler oldDefaultHandler = defaultHandler;
9981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler
9991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      = unparsedEntityDeclHandler;
10001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler;
10011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler
10021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      = startNamespaceDeclHandler;
10031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler
10041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      = endNamespaceDeclHandler;
10051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler;
10061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_ExternalEntityRefHandler oldExternalEntityRefHandler
10071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      = externalEntityRefHandler;
10081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler;
10091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_UnknownEncodingHandler oldUnknownEncodingHandler
10101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      = unknownEncodingHandler;
10111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler;
10121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler;
10131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler;
10141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler;
10151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ELEMENT_TYPE * oldDeclElementType = declElementType;
10161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void *oldUserData = userData;
10181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void *oldHandlerArg = handlerArg;
10191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities;
10201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg;
10211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
10221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing;
10231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int oldInEntityValue = prologState.inEntityValue;
10241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
10251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool oldns_triplets = ns_triplets;
10261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* Note that the new parser shares the same hash secret as the old
10271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     parser, so that dtdCopy and copyEntityTable can lookup values
10281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     from hash tables associated with either parser without us having
10291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     to worry which hash secrets each table has.
10301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  */
10311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned long oldhash_secret_salt = hash_secret_salt;
10321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
10341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!context)
10351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    newDtd = oldDtd;
10361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
10371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* Note that the magical uses of the pre-processor to make field
10391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     access look more like C++ require that `parser' be overwritten
10401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     here.  This makes this function more painful to follow than it
10411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     would be otherwise.
10421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  */
10431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ns) {
10441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_Char tmp[2];
10451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *tmp = namespaceSeparator;
10461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd);
10471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
10481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
10491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd);
10501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
10511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!parser)
10531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
10541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startElementHandler = oldStartElementHandler;
10561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endElementHandler = oldEndElementHandler;
10571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  characterDataHandler = oldCharacterDataHandler;
10581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  processingInstructionHandler = oldProcessingInstructionHandler;
10591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  commentHandler = oldCommentHandler;
10601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startCdataSectionHandler = oldStartCdataSectionHandler;
10611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endCdataSectionHandler = oldEndCdataSectionHandler;
10621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  defaultHandler = oldDefaultHandler;
10631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler;
10641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  notationDeclHandler = oldNotationDeclHandler;
10651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startNamespaceDeclHandler = oldStartNamespaceDeclHandler;
10661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endNamespaceDeclHandler = oldEndNamespaceDeclHandler;
10671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  notStandaloneHandler = oldNotStandaloneHandler;
10681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  externalEntityRefHandler = oldExternalEntityRefHandler;
10691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  skippedEntityHandler = oldSkippedEntityHandler;
10701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unknownEncodingHandler = oldUnknownEncodingHandler;
10711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  elementDeclHandler = oldElementDeclHandler;
10721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  attlistDeclHandler = oldAttlistDeclHandler;
10731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  entityDeclHandler = oldEntityDeclHandler;
10741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  xmlDeclHandler = oldXmlDeclHandler;
10751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  declElementType = oldDeclElementType;
10761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  userData = oldUserData;
10771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (oldUserData == oldHandlerArg)
10781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    handlerArg = userData;
10791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
10801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    handlerArg = parser;
10811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (oldExternalEntityRefHandlerArg != oldParser)
10821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg;
10831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  defaultExpandInternalEntities = oldDefaultExpandInternalEntities;
10841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ns_triplets = oldns_triplets;
10851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hash_secret_salt = oldhash_secret_salt;
10861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  parentParser = oldParser;
10871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
10881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  paramEntityParsing = oldParamEntityParsing;
10891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  prologState.inEntityValue = oldInEntityValue;
10901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (context) {
10911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
10921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!dtdCopy(oldParser, _dtd, oldDtd, &parser->m_mem)
10931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      || !setContext(parser, context)) {
10941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      XML_ParserFree(parser);
10951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return NULL;
10961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
10971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    processor = externalEntityInitProcessor;
10981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
10991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
11001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
11011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* The DTD instance referenced by _dtd is shared between the document's
11021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       root parser and external PE parsers, therefore one does not need to
11031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       call setContext. In addition, one also *must* not call setContext,
11041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       because this would overwrite existing prefix->binding pointers in
11051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       _dtd with ones that get destroyed with the external PE parser.
11061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       This would leave those prefixes with dangling pointers.
11071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    */
11081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    isParamEntity = XML_TRUE;
11091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XmlPrologStateInitExternalEntity(&prologState);
11101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    processor = externalParEntInitProcessor;
11111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
11121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
11131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return parser;
11141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
11151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
11161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL
11171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidestroyBindings(BINDING *bindings, XML_Parser parser)
11181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
11191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
11201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BINDING *b = bindings;
11211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!b)
11221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
11231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bindings = b->nextTagBinding;
11241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FREE(b->uri);
11251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FREE(b);
11261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
11271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
11281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
11291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
11301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ParserFree(XML_Parser parser)
11311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
11321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TAG *tagList;
11331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OPEN_INTERNAL_ENTITY *entityList;
11341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (parser == NULL)
11351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
11361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* free tagStack and freeTagList */
11371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tagList = tagStack;
11381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
11391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TAG *p;
11401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (tagList == NULL) {
11411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (freeTagList == NULL)
11421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
11431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      tagList = freeTagList;
11441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      freeTagList = NULL;
11451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
11461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    p = tagList;
11471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tagList = tagList->parent;
11481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FREE(p->buf);
11491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    destroyBindings(p->bindings, parser);
11501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FREE(p);
11511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
11521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* free openInternalEntities and freeInternalEntities */
11531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  entityList = openInternalEntities;
11541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
11551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_INTERNAL_ENTITY *openEntity;
11561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (entityList == NULL) {
11571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (freeInternalEntities == NULL)
11581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
11591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      entityList = freeInternalEntities;
11601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      freeInternalEntities = NULL;
11611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
11621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    openEntity = entityList;
11631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    entityList = entityList->next;
11641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FREE(openEntity);
11651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
11661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
11671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  destroyBindings(freeBindingList, parser);
11681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  destroyBindings(inheritedBindings, parser);
11691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolDestroy(&tempPool);
11701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolDestroy(&temp2Pool);
11711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
11721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* external parameter entity parsers share the DTD structure
11731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     parser->m_dtd with the root parser, so we must not destroy it
11741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  */
11751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!isParamEntity && _dtd)
11761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
11771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (_dtd)
11781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
11791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem);
11801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FREE((void *)atts);
11811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO
11821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FREE((void *)attInfo);
11831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
11841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FREE(groupConnector);
11851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FREE(buffer);
11861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FREE(dataBuf);
11871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FREE(nsAtts);
11881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FREE(unknownEncodingMem);
11891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (unknownEncodingRelease)
11901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    unknownEncodingRelease(unknownEncodingData);
11911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FREE(parser);
11921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
11931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
11941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
11951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_UseParserAsHandlerArg(XML_Parser parser)
11961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
11971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  handlerArg = parser;
11981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
11991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Error XMLCALL
12011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD)
12021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
12031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
12041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* block after XML_Parse()/XML_ParseBuffer() has been called */
12051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
12061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING;
12071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  useForeignDTD = useDTD;
12081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_ERROR_NONE;
12091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
12101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_ERROR_FEATURE_REQUIRES_XML_DTD;
12111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
12121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
12151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetReturnNSTriplet(XML_Parser parser, int do_nst)
12161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
12171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* block after XML_Parse()/XML_ParseBuffer() has been called */
12181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
12191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
12201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ns_triplets = do_nst ? XML_TRUE : XML_FALSE;
12211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
12241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetUserData(XML_Parser parser, void *p)
12251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
12261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (handlerArg == userData)
12271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    handlerArg = userData = p;
12281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
12291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    userData = p;
12301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Status XMLCALL
12331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetBase(XML_Parser parser, const XML_Char *p)
12341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
12351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (p) {
12361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    p = poolCopyString(&_dtd->pool, p);
12371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!p)
12381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_STATUS_ERROR;
12391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    curBase = p;
12401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
12411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
12421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    curBase = NULL;
12431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_STATUS_OK;
12441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst XML_Char * XMLCALL
12471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetBase(XML_Parser parser)
12481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
12491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return curBase;
12501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint XMLCALL
12531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetSpecifiedAttributeCount(XML_Parser parser)
12541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
12551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return nSpecifiedAtts;
12561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint XMLCALL
12591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetIdAttributeIndex(XML_Parser parser)
12601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
12611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return idAttIndex;
12621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO
12651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst XML_AttrInfo * XMLCALL
12661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetAttributeInfo(XML_Parser parser)
12671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
12681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return attInfo;
12691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
12711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
12731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetElementHandler(XML_Parser parser,
12741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      XML_StartElementHandler start,
12751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      XML_EndElementHandler end)
12761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
12771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startElementHandler = start;
12781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endElementHandler = end;
12791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
12821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetStartElementHandler(XML_Parser parser,
12831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           XML_StartElementHandler start) {
12841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startElementHandler = start;
12851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
12881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetEndElementHandler(XML_Parser parser,
12891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         XML_EndElementHandler end) {
12901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endElementHandler = end;
12911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
12941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetCharacterDataHandler(XML_Parser parser,
12951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            XML_CharacterDataHandler handler)
12961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
12971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  characterDataHandler = handler;
12981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
13011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetProcessingInstructionHandler(XML_Parser parser,
13021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    XML_ProcessingInstructionHandler handler)
13031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
13041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  processingInstructionHandler = handler;
13051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
13081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetCommentHandler(XML_Parser parser,
13091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      XML_CommentHandler handler)
13101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
13111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  commentHandler = handler;
13121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
13151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetCdataSectionHandler(XML_Parser parser,
13161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           XML_StartCdataSectionHandler start,
13171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           XML_EndCdataSectionHandler end)
13181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
13191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startCdataSectionHandler = start;
13201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endCdataSectionHandler = end;
13211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
13241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetStartCdataSectionHandler(XML_Parser parser,
13251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                XML_StartCdataSectionHandler start) {
13261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startCdataSectionHandler = start;
13271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
13301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetEndCdataSectionHandler(XML_Parser parser,
13311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              XML_EndCdataSectionHandler end) {
13321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endCdataSectionHandler = end;
13331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
13361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetDefaultHandler(XML_Parser parser,
13371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      XML_DefaultHandler handler)
13381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
13391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  defaultHandler = handler;
13401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  defaultExpandInternalEntities = XML_FALSE;
13411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
13441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetDefaultHandlerExpand(XML_Parser parser,
13451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            XML_DefaultHandler handler)
13461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
13471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  defaultHandler = handler;
13481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  defaultExpandInternalEntities = XML_TRUE;
13491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
13521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetDoctypeDeclHandler(XML_Parser parser,
13531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          XML_StartDoctypeDeclHandler start,
13541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          XML_EndDoctypeDeclHandler end)
13551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
13561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startDoctypeDeclHandler = start;
13571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endDoctypeDeclHandler = end;
13581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
13611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetStartDoctypeDeclHandler(XML_Parser parser,
13621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               XML_StartDoctypeDeclHandler start) {
13631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startDoctypeDeclHandler = start;
13641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
13671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetEndDoctypeDeclHandler(XML_Parser parser,
13681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             XML_EndDoctypeDeclHandler end) {
13691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endDoctypeDeclHandler = end;
13701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
13731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetUnparsedEntityDeclHandler(XML_Parser parser,
13741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 XML_UnparsedEntityDeclHandler handler)
13751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
13761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unparsedEntityDeclHandler = handler;
13771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
13801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetNotationDeclHandler(XML_Parser parser,
13811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           XML_NotationDeclHandler handler)
13821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
13831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  notationDeclHandler = handler;
13841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
13871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetNamespaceDeclHandler(XML_Parser parser,
13881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            XML_StartNamespaceDeclHandler start,
13891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            XML_EndNamespaceDeclHandler end)
13901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
13911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startNamespaceDeclHandler = start;
13921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endNamespaceDeclHandler = end;
13931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
13961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetStartNamespaceDeclHandler(XML_Parser parser,
13971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 XML_StartNamespaceDeclHandler start) {
13981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  startNamespaceDeclHandler = start;
13991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
14021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetEndNamespaceDeclHandler(XML_Parser parser,
14031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               XML_EndNamespaceDeclHandler end) {
14041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  endNamespaceDeclHandler = end;
14051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
14081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetNotStandaloneHandler(XML_Parser parser,
14091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            XML_NotStandaloneHandler handler)
14101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
14111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  notStandaloneHandler = handler;
14121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
14151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetExternalEntityRefHandler(XML_Parser parser,
14161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                XML_ExternalEntityRefHandler handler)
14171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
14181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  externalEntityRefHandler = handler;
14191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
14221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg)
14231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
14241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (arg)
14251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    externalEntityRefHandlerArg = (XML_Parser)arg;
14261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
14271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    externalEntityRefHandlerArg = parser;
14281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
14311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetSkippedEntityHandler(XML_Parser parser,
14321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            XML_SkippedEntityHandler handler)
14331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
14341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  skippedEntityHandler = handler;
14351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
14381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetUnknownEncodingHandler(XML_Parser parser,
14391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              XML_UnknownEncodingHandler handler,
14401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              void *data)
14411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
14421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unknownEncodingHandler = handler;
14431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unknownEncodingHandlerData = data;
14441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
14471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetElementDeclHandler(XML_Parser parser,
14481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          XML_ElementDeclHandler eldecl)
14491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
14501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  elementDeclHandler = eldecl;
14511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
14541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetAttlistDeclHandler(XML_Parser parser,
14551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          XML_AttlistDeclHandler attdecl)
14561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
14571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  attlistDeclHandler = attdecl;
14581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
14611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetEntityDeclHandler(XML_Parser parser,
14621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         XML_EntityDeclHandler handler)
14631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
14641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  entityDeclHandler = handler;
14651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
14681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetXmlDeclHandler(XML_Parser parser,
14691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      XML_XmlDeclHandler handler) {
14701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  xmlDeclHandler = handler;
14711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint XMLCALL
14741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetParamEntityParsing(XML_Parser parser,
14751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          enum XML_ParamEntityParsing peParsing)
14761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
14771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* block after XML_Parse()/XML_ParseBuffer() has been called */
14781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
14791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 0;
14801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
14811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  paramEntityParsing = peParsing;
14821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return 1;
14831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
14841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return peParsing == XML_PARAM_ENTITY_PARSING_NEVER;
14851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
14861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint XMLCALL
14891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetHashSalt(XML_Parser parser,
14901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                unsigned long hash_salt)
14911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
14921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* block after XML_Parse()/XML_ParseBuffer() has been called */
14931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
14941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 0;
14951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hash_secret_salt = hash_salt;
14961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return 1;
14971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Status XMLCALL
15001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
15011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
15021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (ps_parsing) {
15031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_SUSPENDED:
15041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    errorCode = XML_ERROR_SUSPENDED;
15051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_STATUS_ERROR;
15061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_FINISHED:
15071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    errorCode = XML_ERROR_FINISHED;
15081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_STATUS_ERROR;
15091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_INITIALIZED:
15101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (parentParser == NULL && !startParsing(parser)) {
15111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      errorCode = XML_ERROR_NO_MEMORY;
15121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_STATUS_ERROR;
15131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
15141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
15151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ps_parsing = XML_PARSING;
15161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
15171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
15181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (len == 0) {
15191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ps_finalBuffer = (XML_Bool)isFinal;
15201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!isFinal)
15211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_STATUS_OK;
15221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    positionPtr = bufferPtr;
15231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    parseEndPtr = bufferEnd;
15241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
15251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* If data are left over from last buffer, and we now know that these
15261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       data are the final chunk of input, then we have to check them again
15271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       to detect errors based on that fact.
15281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    */
15291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr);
15301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
15311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (errorCode == XML_ERROR_NONE) {
15321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (ps_parsing) {
15331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_SUSPENDED:
15341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
15351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        positionPtr = bufferPtr;
15361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_STATUS_SUSPENDED;
15371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_INITIALIZED:
15381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_PARSING:
15391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ps_parsing = XML_FINISHED;
15401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* fall through */
15411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
15421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_STATUS_OK;
15431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
15441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
15451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventEndPtr = eventPtr;
15461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    processor = errorProcessor;
15471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_STATUS_ERROR;
15481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
15491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef XML_CONTEXT_BYTES
15501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else if (bufferPtr == bufferEnd) {
15511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char *end;
15521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int nLeftOver;
15531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    enum XML_Error result;
15541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    parseEndByteIndex += len;
15551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    positionPtr = s;
15561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ps_finalBuffer = (XML_Bool)isFinal;
15571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
15581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    errorCode = processor(parser, s, parseEndPtr = s + len, &end);
15591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
15601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (errorCode != XML_ERROR_NONE) {
15611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      eventEndPtr = eventPtr;
15621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      processor = errorProcessor;
15631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_STATUS_ERROR;
15641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
15651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else {
15661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (ps_parsing) {
15671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_SUSPENDED:
15681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result = XML_STATUS_SUSPENDED;
15691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
15701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_INITIALIZED:
15711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_PARSING:
15721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (isFinal) {
15731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ps_parsing = XML_FINISHED;
15741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_STATUS_OK;
15751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
15761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* fall through */
15771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
15781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result = XML_STATUS_OK;
15791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
15801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
15811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
15821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XmlUpdatePosition(encoding, positionPtr, end, &position);
15831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    nLeftOver = s + len - end;
15841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (nLeftOver) {
15851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (buffer == NULL || nLeftOver > bufferLim - buffer) {
15861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* FIXME avoid integer overflow */
15871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        char *temp;
15881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        temp = (buffer == NULL
15891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ? (char *)MALLOC(len * 2)
15901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                : (char *)REALLOC(buffer, len * 2));
15911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (temp == NULL) {
15921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          errorCode = XML_ERROR_NO_MEMORY;
15931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          eventPtr = eventEndPtr = NULL;
15941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          processor = errorProcessor;
15951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_STATUS_ERROR;
15961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
15971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        buffer = temp;
15981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        bufferLim = buffer + len * 2;
15991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
16001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      memcpy(buffer, end, nLeftOver);
16011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
16021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bufferPtr = buffer;
16031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bufferEnd = buffer + nLeftOver;
16041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    positionPtr = bufferPtr;
16051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    parseEndPtr = bufferEnd;
16061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventPtr = bufferPtr;
16071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventEndPtr = bufferPtr;
16081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return result;
16091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
16101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  /* not defined XML_CONTEXT_BYTES */
16111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
16121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    void *buff = XML_GetBuffer(parser, len);
16131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (buff == NULL)
16141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_STATUS_ERROR;
16151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else {
16161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      memcpy(buff, s, len);
16171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ParseBuffer(parser, len, isFinal);
16181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
16191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
16201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
16211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Status XMLCALL
16231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ParseBuffer(XML_Parser parser, int len, int isFinal)
16241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
16251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *start;
16261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Status result = XML_STATUS_OK;
16271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (ps_parsing) {
16291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_SUSPENDED:
16301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    errorCode = XML_ERROR_SUSPENDED;
16311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_STATUS_ERROR;
16321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_FINISHED:
16331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    errorCode = XML_ERROR_FINISHED;
16341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_STATUS_ERROR;
16351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_INITIALIZED:
16361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (parentParser == NULL && !startParsing(parser)) {
16371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      errorCode = XML_ERROR_NO_MEMORY;
16381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_STATUS_ERROR;
16391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
16401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
16411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ps_parsing = XML_PARSING;
16421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
16431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  start = bufferPtr;
16451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  positionPtr = start;
16461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bufferEnd += len;
16471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  parseEndPtr = bufferEnd;
16481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  parseEndByteIndex += len;
16491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ps_finalBuffer = (XML_Bool)isFinal;
16501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  errorCode = processor(parser, start, parseEndPtr, &bufferPtr);
16521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (errorCode != XML_ERROR_NONE) {
16541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventEndPtr = eventPtr;
16551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    processor = errorProcessor;
16561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_STATUS_ERROR;
16571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
16581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
16591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (ps_parsing) {
16601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_SUSPENDED:
16611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = XML_STATUS_SUSPENDED;
16621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
16631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_INITIALIZED:
16641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_PARSING:
16651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (isFinal) {
16661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ps_parsing = XML_FINISHED;
16671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return result;
16681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
16691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default: ;  /* should not happen */
16701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
16711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
16721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
16741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  positionPtr = bufferPtr;
16751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return result;
16761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
16771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid * XMLCALL
16791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetBuffer(XML_Parser parser, int len)
16801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
16811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (ps_parsing) {
16821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_SUSPENDED:
16831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    errorCode = XML_ERROR_SUSPENDED;
16841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
16851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_FINISHED:
16861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    errorCode = XML_ERROR_FINISHED;
16871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
16881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default: ;
16891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
16901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (len > bufferLim - bufferEnd) {
16921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* FIXME avoid integer overflow */
16931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int neededSize = len + (int)(bufferEnd - bufferPtr);
16941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_CONTEXT_BYTES
16951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int keep = (int)(bufferPtr - buffer);
16961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (keep > XML_CONTEXT_BYTES)
16981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      keep = XML_CONTEXT_BYTES;
16991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    neededSize += keep;
17001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  /* defined XML_CONTEXT_BYTES */
17011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (neededSize  <= bufferLim - buffer) {
17021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_CONTEXT_BYTES
17031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (keep < bufferPtr - buffer) {
17041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int offset = (int)(bufferPtr - buffer) - keep;
17051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep);
17061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        bufferEnd -= offset;
17071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        bufferPtr -= offset;
17081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
17091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
17101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      memmove(buffer, bufferPtr, bufferEnd - bufferPtr);
17111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bufferEnd = buffer + (bufferEnd - bufferPtr);
17121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bufferPtr = buffer;
17131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  /* not defined XML_CONTEXT_BYTES */
17141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
17151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else {
17161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      char *newBuf;
17171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int bufferSize = (int)(bufferLim - bufferPtr);
17181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (bufferSize == 0)
17191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        bufferSize = INIT_BUFFER_SIZE;
17201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      do {
17211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        bufferSize *= 2;
17221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      } while (bufferSize < neededSize);
17231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      newBuf = (char *)MALLOC(bufferSize);
17241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (newBuf == 0) {
17251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        errorCode = XML_ERROR_NO_MEMORY;
17261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return NULL;
17271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
17281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bufferLim = newBuf + bufferSize;
17291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_CONTEXT_BYTES
17301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (bufferPtr) {
17311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int keep = (int)(bufferPtr - buffer);
17321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (keep > XML_CONTEXT_BYTES)
17331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          keep = XML_CONTEXT_BYTES;
17341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep);
17351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        FREE(buffer);
17361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        buffer = newBuf;
17371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        bufferEnd = buffer + (bufferEnd - bufferPtr) + keep;
17381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        bufferPtr = buffer + keep;
17391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
17401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else {
17411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        bufferEnd = newBuf + (bufferEnd - bufferPtr);
17421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        bufferPtr = buffer = newBuf;
17431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
17441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
17451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (bufferPtr) {
17461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr);
17471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        FREE(buffer);
17481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
17491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bufferEnd = newBuf + (bufferEnd - bufferPtr);
17501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bufferPtr = buffer = newBuf;
17511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  /* not defined XML_CONTEXT_BYTES */
17521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
17531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventPtr = eventEndPtr = NULL;
17541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    positionPtr = NULL;
17551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
17561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return bufferEnd;
17571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
17581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
17591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Status XMLCALL
17601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_StopParser(XML_Parser parser, XML_Bool resumable)
17611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
17621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (ps_parsing) {
17631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_SUSPENDED:
17641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (resumable) {
17651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      errorCode = XML_ERROR_SUSPENDED;
17661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_STATUS_ERROR;
17671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
17681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ps_parsing = XML_FINISHED;
17691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
17701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_FINISHED:
17711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    errorCode = XML_ERROR_FINISHED;
17721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_STATUS_ERROR;
17731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
17741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (resumable) {
17751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
17761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (isParamEntity) {
17771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        errorCode = XML_ERROR_SUSPEND_PE;
17781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_STATUS_ERROR;
17791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
17801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
17811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ps_parsing = XML_SUSPENDED;
17821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
17831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else
17841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ps_parsing = XML_FINISHED;
17851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
17861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_STATUS_OK;
17871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
17881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
17891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Status XMLCALL
17901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ResumeParser(XML_Parser parser)
17911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
17921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Status result = XML_STATUS_OK;
17931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
17941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ps_parsing != XML_SUSPENDED) {
17951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    errorCode = XML_ERROR_NOT_SUSPENDED;
17961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_STATUS_ERROR;
17971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
17981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ps_parsing = XML_PARSING;
17991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
18001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr);
18011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
18021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (errorCode != XML_ERROR_NONE) {
18031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventEndPtr = eventPtr;
18041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    processor = errorProcessor;
18051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_STATUS_ERROR;
18061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
18071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
18081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (ps_parsing) {
18091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_SUSPENDED:
18101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = XML_STATUS_SUSPENDED;
18111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
18121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_INITIALIZED:
18131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_PARSING:
18141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ps_finalBuffer) {
18151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ps_parsing = XML_FINISHED;
18161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return result;
18171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
18181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default: ;
18191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
18201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
18211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
18221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
18231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  positionPtr = bufferPtr;
18241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return result;
18251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
18261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
18271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
18281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status)
18291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
18301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  assert(status != NULL);
18311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *status = parser->m_parsingStatus;
18321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
18331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
18341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Error XMLCALL
18351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetErrorCode(XML_Parser parser)
18361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
18371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return errorCode;
18381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
18391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
18401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Index XMLCALL
18411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetCurrentByteIndex(XML_Parser parser)
18421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
18431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (eventPtr)
18441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return parseEndByteIndex - (parseEndPtr - eventPtr);
18451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return -1;
18461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
18471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
18481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint XMLCALL
18491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetCurrentByteCount(XML_Parser parser)
18501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
18511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (eventEndPtr && eventPtr)
18521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return (int)(eventEndPtr - eventPtr);
18531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return 0;
18541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
18551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
18561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char * XMLCALL
18571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetInputContext(XML_Parser parser, int *offset, int *size)
18581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
18591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_CONTEXT_BYTES
18601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (eventPtr && buffer) {
18611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *offset = (int)(eventPtr - buffer);
18621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *size   = (int)(bufferEnd - buffer);
18631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return buffer;
18641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
18651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* defined XML_CONTEXT_BYTES */
18661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return (char *) 0;
18671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
18681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
18691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Size XMLCALL
18701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetCurrentLineNumber(XML_Parser parser)
18711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
18721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (eventPtr && eventPtr >= positionPtr) {
18731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
18741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    positionPtr = eventPtr;
18751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
18761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return position.lineNumber + 1;
18771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
18781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
18791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Size XMLCALL
18801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetCurrentColumnNumber(XML_Parser parser)
18811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
18821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (eventPtr && eventPtr >= positionPtr) {
18831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
18841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    positionPtr = eventPtr;
18851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
18861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return position.columnNumber;
18871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
18881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
18891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
18901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_FreeContentModel(XML_Parser parser, XML_Content *model)
18911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
18921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FREE(model);
18931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
18941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
18951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid * XMLCALL
18961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_MemMalloc(XML_Parser parser, size_t size)
18971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
18981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return MALLOC(size);
18991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
19001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
19011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid * XMLCALL
19021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_MemRealloc(XML_Parser parser, void *ptr, size_t size)
19031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
19041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return REALLOC(ptr, size);
19051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
19061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
19071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
19081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_MemFree(XML_Parser parser, void *ptr)
19091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
19101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FREE(ptr);
19111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
19121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
19131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL
19141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_DefaultCurrent(XML_Parser parser)
19151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
19161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (defaultHandler) {
19171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (openInternalEntities)
19181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      reportDefault(parser,
19191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    internalEncoding,
19201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    openInternalEntities->internalEventPtr,
19211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    openInternalEntities->internalEventEndPtr);
19221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else
19231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      reportDefault(parser, encoding, eventPtr, eventEndPtr);
19241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
19251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
19261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
19271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst XML_LChar * XMLCALL
19281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ErrorString(enum XML_Error code)
19291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
19301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_LChar* const message[] = {
19311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    0,
19321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("out of memory"),
19331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("syntax error"),
19341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("no element found"),
19351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("not well-formed (invalid token)"),
19361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("unclosed token"),
19371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("partial character"),
19381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("mismatched tag"),
19391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("duplicate attribute"),
19401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("junk after document element"),
19411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("illegal parameter entity reference"),
19421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("undefined entity"),
19431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("recursive entity reference"),
19441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("asynchronous entity"),
19451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("reference to invalid character number"),
19461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("reference to binary entity"),
19471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("reference to external entity in attribute"),
19481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("XML or text declaration not at start of entity"),
19491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("unknown encoding"),
19501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("encoding specified in XML declaration is incorrect"),
19511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("unclosed CDATA section"),
19521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("error in processing external entity reference"),
19531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("document is not standalone"),
19541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("unexpected parser state - please send a bug report"),
19551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("entity declared in parameter entity"),
19561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("requested feature requires XML_DTD support in Expat"),
19571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("cannot change setting once parsing has begun"),
19581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("unbound prefix"),
19591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("must not undeclare prefix"),
19601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("incomplete markup in parameter entity"),
19611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("XML declaration not well-formed"),
19621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("text declaration not well-formed"),
19631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("illegal character(s) in public id"),
19641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("parser suspended"),
19651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("parser not suspended"),
19661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("parsing aborted"),
19671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("parsing finished"),
19681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("cannot suspend in external parameter entity"),
19691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("reserved prefix (xml) must not be undeclared or bound to another namespace name"),
19701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("reserved prefix (xmlns) must not be declared or undeclared"),
19711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_L("prefix must not be bound to one of the reserved namespace names")
19721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
19731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (code > 0 && code < sizeof(message)/sizeof(message[0]))
19741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return message[code];
19751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return NULL;
19761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
19771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
19781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst XML_LChar * XMLCALL
19791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ExpatVersion(void) {
19801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
19811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* V1 is used to string-ize the version number. However, it would
19821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     string-ize the actual version macro *names* unless we get them
19831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     substituted before being passed to V1. CPP is defined to expand
19841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     a macro, then rescan for more expansions. Thus, we use V2 to expand
19851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     the version macros, then CPP will expand the resulting V1() macro
19861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     with the correct numerals. */
19871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* ### I'm assuming cpp is portable in this respect... */
19881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
19891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c)
19901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define V2(a,b,c) XML_L("expat_")V1(a,b,c)
19911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
19921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION);
19931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
19941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef V1
19951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef V2
19961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
19971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
19981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Expat_Version XMLCALL
19991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ExpatVersionInfo(void)
20001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
20011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Expat_Version version;
20021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
20031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  version.major = XML_MAJOR_VERSION;
20041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  version.minor = XML_MINOR_VERSION;
20051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  version.micro = XML_MICRO_VERSION;
20061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
20071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return version;
20081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
20091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
20101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst XML_Feature * XMLCALL
20111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetFeatureList(void)
20121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
20131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Feature features[] = {
20141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {XML_FEATURE_SIZEOF_XML_CHAR,  XML_L("sizeof(XML_Char)"),
20151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     sizeof(XML_Char)},
20161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"),
20171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     sizeof(XML_LChar)},
20181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_UNICODE
20191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {XML_FEATURE_UNICODE,          XML_L("XML_UNICODE"), 0},
20201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
20211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_UNICODE_WCHAR_T
20221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {XML_FEATURE_UNICODE_WCHAR_T,  XML_L("XML_UNICODE_WCHAR_T"), 0},
20231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
20241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
20251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {XML_FEATURE_DTD,              XML_L("XML_DTD"), 0},
20261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
20271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_CONTEXT_BYTES
20281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {XML_FEATURE_CONTEXT_BYTES,    XML_L("XML_CONTEXT_BYTES"),
20291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     XML_CONTEXT_BYTES},
20301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
20311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_MIN_SIZE
20321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {XML_FEATURE_MIN_SIZE,         XML_L("XML_MIN_SIZE"), 0},
20331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
20341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS
20351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {XML_FEATURE_NS,               XML_L("XML_NS"), 0},
20361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
20371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_LARGE_SIZE
20381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {XML_FEATURE_LARGE_SIZE,       XML_L("XML_LARGE_SIZE"), 0},
20391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
20401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO
20411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {XML_FEATURE_ATTR_INFO,        XML_L("XML_ATTR_INFO"), 0},
20421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
20431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {XML_FEATURE_END,              NULL, 0}
20441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
20451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
20461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return features;
20471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
20481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
20491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Initially tag->rawName always points into the parse buffer;
20501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   for those TAG instances opened while the current parse buffer was
20511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   processed, and not yet closed, we need to store tag->rawName in a more
20521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   permanent location, since the parse buffer is about to be discarded.
20531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/
20541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool
20551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistoreRawNames(XML_Parser parser)
20561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
20571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TAG *tag = tagStack;
20581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (tag) {
20591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int bufSize;
20601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1);
20611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    char *rawNameBuf = tag->buf + nameLen;
20621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* Stop if already stored.  Since tagStack is a stack, we can stop
20631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       at the first entry that has already been copied; everything
20641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       below it in the stack is already been accounted for in a
20651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       previous call to this function.
20661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    */
20671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (tag->rawName == rawNameBuf)
20681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
20691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* For re-use purposes we need to ensure that the
20701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       size of tag->buf is a multiple of sizeof(XML_Char).
20711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    */
20721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char));
20731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (bufSize > tag->bufEnd - tag->buf) {
20741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      char *temp = (char *)REALLOC(tag->buf, bufSize);
20751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (temp == NULL)
20761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_FALSE;
20771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* if tag->name.str points to tag->buf (only when namespace
20781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         processing is off) then we have to update it
20791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      */
20801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (tag->name.str == (XML_Char *)tag->buf)
20811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tag->name.str = (XML_Char *)temp;
20821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* if tag->name.localPart is set (when namespace processing is on)
20831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         then update it as well, since it will always point into tag->buf
20841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      */
20851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (tag->name.localPart)
20861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tag->name.localPart = (XML_Char *)temp + (tag->name.localPart -
20871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  (XML_Char *)tag->buf);
20881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      tag->buf = temp;
20891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      tag->bufEnd = temp + bufSize;
20901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      rawNameBuf = temp + nameLen;
20911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
20921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    memcpy(rawNameBuf, tag->rawName, tag->rawNameLength);
20931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tag->rawName = rawNameBuf;
20941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tag = tag->parent;
20951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
20961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TRUE;
20971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
20981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
20991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
21001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccicontentProcessor(XML_Parser parser,
21011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 const char *start,
21021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 const char *end,
21031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 const char **endPtr)
21041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
21051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Error result = doContent(parser, 0, encoding, start, end,
21061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    endPtr, (XML_Bool)!ps_finalBuffer);
21071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (result == XML_ERROR_NONE) {
21081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!storeRawNames(parser))
21091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NO_MEMORY;
21101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
21111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return result;
21121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
21131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
21141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
21151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciexternalEntityInitProcessor(XML_Parser parser,
21161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            const char *start,
21171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            const char *end,
21181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            const char **endPtr)
21191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
21201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Error result = initializeEncoding(parser);
21211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (result != XML_ERROR_NONE)
21221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return result;
21231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  processor = externalEntityInitProcessor2;
21241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return externalEntityInitProcessor2(parser, start, end, endPtr);
21251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
21261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
21271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
21281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciexternalEntityInitProcessor2(XML_Parser parser,
21291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const char *start,
21301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const char *end,
21311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const char **endPtr)
21321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
21331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *next = start; /* XmlContentTok doesn't always set the last arg */
21341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int tok = XmlContentTok(encoding, start, end, &next);
21351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (tok) {
21361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_TOK_BOM:
21371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* If we are at the end of the buffer, this would cause the next stage,
21381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       i.e. externalEntityInitProcessor3, to pass control directly to
21391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       doContent (by detecting XML_TOK_NONE) without processing any xml text
21401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent.
21411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    */
21421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (next == end && !ps_finalBuffer) {
21431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *endPtr = next;
21441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
21451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
21461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    start = next;
21471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
21481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_TOK_PARTIAL:
21491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!ps_finalBuffer) {
21501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *endPtr = start;
21511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
21521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
21531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventPtr = start;
21541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_UNCLOSED_TOKEN;
21551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_TOK_PARTIAL_CHAR:
21561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!ps_finalBuffer) {
21571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *endPtr = start;
21581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
21591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
21601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventPtr = start;
21611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_PARTIAL_CHAR;
21621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
21631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  processor = externalEntityInitProcessor3;
21641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return externalEntityInitProcessor3(parser, start, end, endPtr);
21651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
21661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
21671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
21681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciexternalEntityInitProcessor3(XML_Parser parser,
21691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const char *start,
21701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const char *end,
21711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const char **endPtr)
21721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
21731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int tok;
21741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *next = start; /* XmlContentTok doesn't always set the last arg */
21751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  eventPtr = start;
21761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tok = XmlContentTok(encoding, start, end, &next);
21771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  eventEndPtr = next;
21781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
21791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (tok) {
21801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_TOK_XML_DECL:
21811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
21821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      enum XML_Error result;
21831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = processXmlDecl(parser, 1, start, next);
21841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (result != XML_ERROR_NONE)
21851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return result;
21861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (ps_parsing) {
21871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_SUSPENDED:
21881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *endPtr = next;
21891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
21901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_FINISHED:
21911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_ABORTED;
21921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
21931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        start = next;
21941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
21951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
21961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
21971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_TOK_PARTIAL:
21981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!ps_finalBuffer) {
21991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *endPtr = start;
22001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
22011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
22021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_UNCLOSED_TOKEN;
22031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_TOK_PARTIAL_CHAR:
22041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!ps_finalBuffer) {
22051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *endPtr = start;
22061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
22071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
22081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_PARTIAL_CHAR;
22091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
22101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  processor = externalEntityContentProcessor;
22111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tagLevel = 1;
22121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return externalEntityContentProcessor(parser, start, end, endPtr);
22131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
22141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
22151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
22161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciexternalEntityContentProcessor(XML_Parser parser,
22171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               const char *start,
22181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               const char *end,
22191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               const char **endPtr)
22201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
22211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Error result = doContent(parser, 1, encoding, start, end,
22221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    endPtr, (XML_Bool)!ps_finalBuffer);
22231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (result == XML_ERROR_NONE) {
22241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!storeRawNames(parser))
22251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NO_MEMORY;
22261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
22271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return result;
22281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
22291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
22301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
22311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoContent(XML_Parser parser,
22321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          int startTagLevel,
22331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const ENCODING *enc,
22341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const char *s,
22351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const char *end,
22361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const char **nextPtr,
22371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          XML_Bool haveMore)
22381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
22391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* save one level of indirection */
22401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD * const dtd = _dtd;
22411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
22421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char **eventPP;
22431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char **eventEndPP;
22441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (enc == encoding) {
22451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventPP = &eventPtr;
22461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventEndPP = &eventEndPtr;
22471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
22481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
22491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventPP = &(openInternalEntities->internalEventPtr);
22501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventEndPP = &(openInternalEntities->internalEventEndPtr);
22511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
22521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *eventPP = s;
22531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
22541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
22551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char *next = s; /* XmlContentTok doesn't always set the last arg */
22561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int tok = XmlContentTok(enc, s, end, &next);
22571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *eventEndPP = next;
22581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (tok) {
22591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_TRAILING_CR:
22601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (haveMore) {
22611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = s;
22621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
22631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
22641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *eventEndPP = end;
22651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (characterDataHandler) {
22661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_Char c = 0xA;
22671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        characterDataHandler(handlerArg, &c, 1);
22681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
22691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (defaultHandler)
22701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        reportDefault(parser, enc, s, end);
22711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* We are at the end of the final buffer, should we check for
22721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         XML_SUSPENDED, XML_FINISHED?
22731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      */
22741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (startTagLevel == 0)
22751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_ELEMENTS;
22761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (tagLevel != startTagLevel)
22771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_ASYNC_ENTITY;
22781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextPtr = end;
22791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
22801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_NONE:
22811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (haveMore) {
22821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = s;
22831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
22841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
22851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (startTagLevel > 0) {
22861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (tagLevel != startTagLevel)
22871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_ASYNC_ENTITY;
22881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = s;
22891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
22901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
22911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NO_ELEMENTS;
22921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_INVALID:
22931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *eventPP = next;
22941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_INVALID_TOKEN;
22951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_PARTIAL:
22961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (haveMore) {
22971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = s;
22981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
22991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
23001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_UNCLOSED_TOKEN;
23011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_PARTIAL_CHAR:
23021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (haveMore) {
23031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = s;
23041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
23051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
23061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_PARTIAL_CHAR;
23071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_ENTITY_REF:
23081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
23091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const XML_Char *name;
23101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ENTITY *entity;
23111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc,
23121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              s + enc->minBytesPerChar,
23131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              next - enc->minBytesPerChar);
23141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (ch) {
23151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (characterDataHandler)
23161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            characterDataHandler(handlerArg, &ch, 1);
23171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          else if (defaultHandler)
23181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            reportDefault(parser, enc, s, next);
23191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
23201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
23211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        name = poolStoreString(&dtd->pool, enc,
23221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                s + enc->minBytesPerChar,
23231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                next - enc->minBytesPerChar);
23241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!name)
23251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
23261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0);
23271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolDiscard(&dtd->pool);
23281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* First, determine if a check for an existing declaration is needed;
23291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           if yes, check that the entity exists, and that it is internal,
23301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           otherwise call the skipped entity or default handler.
23311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        */
23321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!dtd->hasParamEntityRefs || dtd->standalone) {
23331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!entity)
23341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_UNDEFINED_ENTITY;
23351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          else if (!entity->is_internal)
23361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_ENTITY_DECLARED_IN_PE;
23371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
23381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (!entity) {
23391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (skippedEntityHandler)
23401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            skippedEntityHandler(handlerArg, name, 0);
23411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          else if (defaultHandler)
23421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            reportDefault(parser, enc, s, next);
23431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
23441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
23451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (entity->open)
23461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_RECURSIVE_ENTITY_REF;
23471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (entity->notation)
23481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_BINARY_ENTITY_REF;
23491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (entity->textPtr) {
23501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          enum XML_Error result;
23511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!defaultExpandInternalEntities) {
23521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (skippedEntityHandler)
23531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              skippedEntityHandler(handlerArg, entity->name, 0);
23541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            else if (defaultHandler)
23551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              reportDefault(parser, enc, s, next);
23561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            break;
23571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
23581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          result = processInternalEntity(parser, entity, XML_FALSE);
23591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (result != XML_ERROR_NONE)
23601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return result;
23611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
23621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (externalEntityRefHandler) {
23631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const XML_Char *context;
23641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          entity->open = XML_TRUE;
23651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          context = getContext(parser);
23661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          entity->open = XML_FALSE;
23671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!context)
23681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_NO_MEMORY;
23691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!externalEntityRefHandler(externalEntityRefHandlerArg,
23701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        context,
23711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        entity->base,
23721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        entity->systemId,
23731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        entity->publicId))
23741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
23751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          poolDiscard(&tempPool);
23761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
23771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (defaultHandler)
23781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          reportDefault(parser, enc, s, next);
23791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
23801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
23811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_START_TAG_NO_ATTS:
23821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* fall through */
23831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_START_TAG_WITH_ATTS:
23841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
23851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        TAG *tag;
23861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        enum XML_Error result;
23871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_Char *toPtr;
23881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (freeTagList) {
23891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          tag = freeTagList;
23901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          freeTagList = freeTagList->parent;
23911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
23921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else {
23931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          tag = (TAG *)MALLOC(sizeof(TAG));
23941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!tag)
23951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_NO_MEMORY;
23961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE);
23971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!tag->buf) {
23981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            FREE(tag);
23991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_NO_MEMORY;
24001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
24011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE;
24021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
24031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tag->bindings = NULL;
24041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tag->parent = tagStack;
24051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tagStack = tag;
24061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tag->name.localPart = NULL;
24071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tag->name.prefix = NULL;
24081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tag->rawName = s + enc->minBytesPerChar;
24091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tag->rawNameLength = XmlNameLength(enc, tag->rawName);
24101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ++tagLevel;
24111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
24121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const char *rawNameEnd = tag->rawName + tag->rawNameLength;
24131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const char *fromPtr = tag->rawName;
24141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          toPtr = (XML_Char *)tag->buf;
24151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          for (;;) {
24161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            int bufSize;
24171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            int convLen;
24181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            XmlConvert(enc,
24191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       &fromPtr, rawNameEnd,
24201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1);
24211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            convLen = (int)(toPtr - (XML_Char *)tag->buf);
24221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (fromPtr == rawNameEnd) {
24231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              tag->name.strLen = convLen;
24241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              break;
24251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
24261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            bufSize = (int)(tag->bufEnd - tag->buf) << 1;
24271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            {
24281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              char *temp = (char *)REALLOC(tag->buf, bufSize);
24291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              if (temp == NULL)
24301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                return XML_ERROR_NO_MEMORY;
24311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              tag->buf = temp;
24321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              tag->bufEnd = temp + bufSize;
24331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              toPtr = (XML_Char *)temp + convLen;
24341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
24351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
24361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
24371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tag->name.str = (XML_Char *)tag->buf;
24381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *toPtr = XML_T('\0');
24391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings));
24401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (result)
24411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return result;
24421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (startElementHandler)
24431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          startElementHandler(handlerArg, tag->name.str,
24441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              (const XML_Char **)atts);
24451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (defaultHandler)
24461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          reportDefault(parser, enc, s, next);
24471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolClear(&tempPool);
24481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
24491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
24501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_EMPTY_ELEMENT_NO_ATTS:
24511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* fall through */
24521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_EMPTY_ELEMENT_WITH_ATTS:
24531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
24541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const char *rawName = s + enc->minBytesPerChar;
24551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        enum XML_Error result;
24561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        BINDING *bindings = NULL;
24571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_Bool noElmHandlers = XML_TRUE;
24581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        TAG_NAME name;
24591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        name.str = poolStoreString(&tempPool, enc, rawName,
24601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   rawName + XmlNameLength(enc, rawName));
24611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!name.str)
24621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
24631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolFinish(&tempPool);
24641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result = storeAtts(parser, enc, s, &name, &bindings);
24651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (result)
24661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return result;
24671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolFinish(&tempPool);
24681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (startElementHandler) {
24691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          startElementHandler(handlerArg, name.str, (const XML_Char **)atts);
24701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          noElmHandlers = XML_FALSE;
24711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
24721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (endElementHandler) {
24731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (startElementHandler)
24741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            *eventPP = *eventEndPP;
24751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          endElementHandler(handlerArg, name.str);
24761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          noElmHandlers = XML_FALSE;
24771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
24781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (noElmHandlers && defaultHandler)
24791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          reportDefault(parser, enc, s, next);
24801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolClear(&tempPool);
24811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        while (bindings) {
24821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          BINDING *b = bindings;
24831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (endNamespaceDeclHandler)
24841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            endNamespaceDeclHandler(handlerArg, b->prefix->name);
24851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          bindings = bindings->nextTagBinding;
24861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          b->nextTagBinding = freeBindingList;
24871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          freeBindingList = b;
24881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          b->prefix->binding = b->prevPrefixBinding;
24891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
24901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
24911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (tagLevel == 0)
24921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return epilogProcessor(parser, next, end, nextPtr);
24931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
24941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_END_TAG:
24951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (tagLevel == startTagLevel)
24961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_ASYNC_ENTITY;
24971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else {
24981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int len;
24991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const char *rawName;
25001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        TAG *tag = tagStack;
25011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tagStack = tag->parent;
25021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tag->parent = freeTagList;
25031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        freeTagList = tag;
25041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        rawName = s + enc->minBytesPerChar*2;
25051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        len = XmlNameLength(enc, rawName);
25061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (len != tag->rawNameLength
25071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            || memcmp(tag->rawName, rawName, len) != 0) {
25081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *eventPP = rawName;
25091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_TAG_MISMATCH;
25101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
25111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        --tagLevel;
25121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (endElementHandler) {
25131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const XML_Char *localPart;
25141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const XML_Char *prefix;
25151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          XML_Char *uri;
25161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          localPart = tag->name.localPart;
25171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (ns && localPart) {
25181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            /* localPart and prefix may have been overwritten in
25191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               tag->name.str, since this points to the binding->uri
25201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               buffer which gets re-used; so we have to add them again
25211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            */
25221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            uri = (XML_Char *)tag->name.str + tag->name.uriLen;
25231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            /* don't need to check for space - already done in storeAtts() */
25241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            while (*localPart) *uri++ = *localPart++;
25251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            prefix = (XML_Char *)tag->name.prefix;
25261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (ns_triplets && prefix) {
25271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              *uri++ = namespaceSeparator;
25281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              while (*prefix) *uri++ = *prefix++;
25291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             }
25301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            *uri = XML_T('\0');
25311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
25321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          endElementHandler(handlerArg, tag->name.str);
25331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
25341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (defaultHandler)
25351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          reportDefault(parser, enc, s, next);
25361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        while (tag->bindings) {
25371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          BINDING *b = tag->bindings;
25381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (endNamespaceDeclHandler)
25391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            endNamespaceDeclHandler(handlerArg, b->prefix->name);
25401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          tag->bindings = tag->bindings->nextTagBinding;
25411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          b->nextTagBinding = freeBindingList;
25421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          freeBindingList = b;
25431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          b->prefix->binding = b->prevPrefixBinding;
25441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
25451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (tagLevel == 0)
25461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return epilogProcessor(parser, next, end, nextPtr);
25471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
25481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
25491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_CHAR_REF:
25501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
25511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int n = XmlCharRefNumber(enc, s);
25521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (n < 0)
25531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_BAD_CHAR_REF;
25541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (characterDataHandler) {
25551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          XML_Char buf[XML_ENCODE_MAX];
25561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf));
25571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
25581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (defaultHandler)
25591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          reportDefault(parser, enc, s, next);
25601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
25611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
25621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_XML_DECL:
25631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_MISPLACED_XML_PI;
25641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_DATA_NEWLINE:
25651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (characterDataHandler) {
25661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_Char c = 0xA;
25671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        characterDataHandler(handlerArg, &c, 1);
25681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
25691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (defaultHandler)
25701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        reportDefault(parser, enc, s, next);
25711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
25721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_CDATA_SECT_OPEN:
25731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
25741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        enum XML_Error result;
25751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (startCdataSectionHandler)
25761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          startCdataSectionHandler(handlerArg);
25771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if 0
25781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* Suppose you doing a transformation on a document that involves
25791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           changing only the character data.  You set up a defaultHandler
25801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           and a characterDataHandler.  The defaultHandler simply copies
25811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           characters through.  The characterDataHandler does the
25821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           transformation and writes the characters out escaping them as
25831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           necessary.  This case will fail to work if we leave out the
25841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           following two lines (because & and < inside CDATA sections will
25851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           be incorrectly escaped).
25861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
25871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           However, now we have a start/endCdataSectionHandler, so it seems
25881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           easier to let the user deal with this.
25891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        */
25901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (characterDataHandler)
25911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          characterDataHandler(handlerArg, dataBuf, 0);
25921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
25931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (defaultHandler)
25941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          reportDefault(parser, enc, s, next);
25951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore);
25961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (result != XML_ERROR_NONE)
25971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return result;
25981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (!next) {
25991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          processor = cdataSectionProcessor;
26001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return result;
26011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
26021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
26031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
26041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_TRAILING_RSQB:
26051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (haveMore) {
26061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = s;
26071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
26081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
26091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (characterDataHandler) {
26101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (MUST_CONVERT(enc, s)) {
26111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ICHAR *dataPtr = (ICHAR *)dataBuf;
26121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);
26131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          characterDataHandler(handlerArg, dataBuf,
26141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               (int)(dataPtr - (ICHAR *)dataBuf));
26151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
26161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else
26171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          characterDataHandler(handlerArg,
26181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               (XML_Char *)s,
26191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               (int)((XML_Char *)end - (XML_Char *)s));
26201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
26211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (defaultHandler)
26221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        reportDefault(parser, enc, s, end);
26231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* We are at the end of the final buffer, should we check for
26241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         XML_SUSPENDED, XML_FINISHED?
26251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      */
26261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (startTagLevel == 0) {
26271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *eventPP = end;
26281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_ELEMENTS;
26291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
26301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (tagLevel != startTagLevel) {
26311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *eventPP = end;
26321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_ASYNC_ENTITY;
26331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
26341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextPtr = end;
26351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
26361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_DATA_CHARS:
26371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
26381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_CharacterDataHandler charDataHandler = characterDataHandler;
26391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (charDataHandler) {
26401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (MUST_CONVERT(enc, s)) {
26411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            for (;;) {
26421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              ICHAR *dataPtr = (ICHAR *)dataBuf;
26431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
26441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              *eventEndPP = s;
26451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              charDataHandler(handlerArg, dataBuf,
26461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              (int)(dataPtr - (ICHAR *)dataBuf));
26471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              if (s == next)
26481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                break;
26491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              *eventPP = s;
26501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
26511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
26521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          else
26531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            charDataHandler(handlerArg,
26541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            (XML_Char *)s,
26551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            (int)((XML_Char *)next - (XML_Char *)s));
26561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
26571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (defaultHandler)
26581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          reportDefault(parser, enc, s, next);
26591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
26601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
26611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_PI:
26621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!reportProcessingInstruction(parser, enc, s, next))
26631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
26641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
26651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_COMMENT:
26661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!reportComment(parser, enc, s, next))
26671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
26681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
26691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
26701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (defaultHandler)
26711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        reportDefault(parser, enc, s, next);
26721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
26731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
26741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *eventPP = s = next;
26751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (ps_parsing) {
26761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_SUSPENDED:
26771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextPtr = next;
26781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
26791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_FINISHED:
26801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_ABORTED;
26811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default: ;
26821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
26831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
26841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* not reached */
26851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
26861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
26871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Precondition: all arguments must be non-NULL;
26881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   Purpose:
26891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   - normalize attributes
26901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   - check attributes for well-formedness
26911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   - generate namespace aware attribute names (URI, prefix)
26921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   - build list of attributes for startElementHandler
26931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   - default attributes
26941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   - process namespace declarations (check and report them)
26951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   - generate namespace aware element name (URI, prefix)
26961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/
26971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
26981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistoreAtts(XML_Parser parser, const ENCODING *enc,
26991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const char *attStr, TAG_NAME *tagNamePtr,
27001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          BINDING **bindingsPtr)
27011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
27021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD * const dtd = _dtd;  /* save one level of indirection */
27031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ELEMENT_TYPE *elementType;
27041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int nDefaultAtts;
27051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char **appAtts;   /* the attribute list for the application */
27061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int attIndex = 0;
27071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int prefixLen;
27081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int i;
27091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int n;
27101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char *uri;
27111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int nPrefixes = 0;
27121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BINDING *binding;
27131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *localPart;
27141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* lookup the element type name */
27161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str,0);
27171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!elementType) {
27181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str);
27191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!name)
27201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NO_MEMORY;
27211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name,
27221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         sizeof(ELEMENT_TYPE));
27231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!elementType)
27241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NO_MEMORY;
27251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ns && !setElementTypePrefix(parser, elementType))
27261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NO_MEMORY;
27271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
27281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  nDefaultAtts = elementType->nDefaultAtts;
27291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* get the attributes from the tokenizer */
27311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  n = XmlGetAttributes(enc, attStr, attsSize, atts);
27321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (n + nDefaultAtts > attsSize) {
27331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int oldAttsSize = attsSize;
27341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ATTRIBUTE *temp;
27351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO
27361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_AttrInfo *temp2;
27371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
27381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;
27391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE));
27401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (temp == NULL)
27411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NO_MEMORY;
27421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    atts = temp;
27431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO
27441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    temp2 = (XML_AttrInfo *)REALLOC((void *)attInfo, attsSize * sizeof(XML_AttrInfo));
27451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (temp2 == NULL)
27461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NO_MEMORY;
27471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    attInfo = temp2;
27481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
27491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (n > oldAttsSize)
27501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      XmlGetAttributes(enc, attStr, n, atts);
27511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
27521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  appAtts = (const XML_Char **)atts;
27541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (i = 0; i < n; i++) {
27551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ATTRIBUTE *currAtt = &atts[i];
27561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO
27571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_AttrInfo *currAttInfo = &attInfo[i];
27581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
27591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* add the name and value to the attribute list */
27601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name,
27611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         currAtt->name
27621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         + XmlNameLength(enc, currAtt->name));
27631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!attId)
27641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NO_MEMORY;
27651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO
27661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    currAttInfo->nameStart = parseEndByteIndex - (parseEndPtr - currAtt->name);
27671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    currAttInfo->nameEnd = currAttInfo->nameStart +
27681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           XmlNameLength(enc, currAtt->name);
27691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    currAttInfo->valueStart = parseEndByteIndex -
27701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            (parseEndPtr - currAtt->valuePtr);
27711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    currAttInfo->valueEnd = parseEndByteIndex - (parseEndPtr - currAtt->valueEnd);
27721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
27731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* Detect duplicate attributes by their QNames. This does not work when
27741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       namespace processing is turned on and different prefixes for the same
27751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       namespace are used. For this case we have a check further down.
27761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    */
27771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if ((attId->name)[-1]) {
27781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (enc == encoding)
27791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        eventPtr = atts[i].name;
27801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_DUPLICATE_ATTRIBUTE;
27811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
27821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    (attId->name)[-1] = 1;
27831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    appAtts[attIndex++] = attId->name;
27841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!atts[i].normalized) {
27851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      enum XML_Error result;
27861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      XML_Bool isCdata = XML_TRUE;
27871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* figure out whether declared as other than CDATA */
27891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (attId->maybeTokenized) {
27901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int j;
27911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        for (j = 0; j < nDefaultAtts; j++) {
27921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (attId == elementType->defaultAtts[j].id) {
27931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            isCdata = elementType->defaultAtts[j].isCdata;
27941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            break;
27951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
27961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
27971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
27981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* normalize the attribute value */
28001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = storeAttributeValue(parser, enc, isCdata,
28011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   atts[i].valuePtr, atts[i].valueEnd,
28021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   &tempPool);
28031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (result)
28041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return result;
28051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      appAtts[attIndex] = poolStart(&tempPool);
28061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      poolFinish(&tempPool);
28071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
28081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else {
28091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* the value did not need normalizing */
28101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr,
28111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          atts[i].valueEnd);
28121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (appAtts[attIndex] == 0)
28131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
28141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      poolFinish(&tempPool);
28151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
28161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* handle prefixed attribute names */
28171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (attId->prefix) {
28181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (attId->xmlns) {
28191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* deal with namespace declarations here */
28201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        enum XML_Error result = addBinding(parser, attId->prefix, attId,
28211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           appAtts[attIndex], bindingsPtr);
28221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (result)
28231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return result;
28241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        --attIndex;
28251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
28261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else {
28271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* deal with other prefixed names later */
28281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        attIndex++;
28291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nPrefixes++;
28301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (attId->name)[-1] = 2;
28311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
28321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
28331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else
28341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      attIndex++;
28351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
28361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
28371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* set-up for XML_GetSpecifiedAttributeCount and XML_GetIdAttributeIndex */
28381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  nSpecifiedAtts = attIndex;
28391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (elementType->idAtt && (elementType->idAtt->name)[-1]) {
28401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (i = 0; i < attIndex; i += 2)
28411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (appAtts[i] == elementType->idAtt->name) {
28421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        idAttIndex = i;
28431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
28441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
28451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
28461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
28471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    idAttIndex = -1;
28481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
28491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* do attribute defaulting */
28501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (i = 0; i < nDefaultAtts; i++) {
28511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i;
28521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!(da->id->name)[-1] && da->value) {
28531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (da->id->prefix) {
28541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (da->id->xmlns) {
28551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          enum XML_Error result = addBinding(parser, da->id->prefix, da->id,
28561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             da->value, bindingsPtr);
28571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (result)
28581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return result;
28591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
28601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else {
28611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          (da->id->name)[-1] = 2;
28621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          nPrefixes++;
28631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          appAtts[attIndex++] = da->id->name;
28641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          appAtts[attIndex++] = da->value;
28651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
28661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
28671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else {
28681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (da->id->name)[-1] = 1;
28691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        appAtts[attIndex++] = da->id->name;
28701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        appAtts[attIndex++] = da->value;
28711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
28721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
28731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
28741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  appAtts[attIndex] = 0;
28751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
28761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* expand prefixed attribute names, check for duplicates,
28771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     and clear flags that say whether attributes were specified */
28781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  i = 0;
28791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (nPrefixes) {
28801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int j;  /* hash table index */
28811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    unsigned long version = nsAttsVersion;
28821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int nsAttsSize = (int)1 << nsAttsPower;
28831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* size of hash table must be at least 2 * (# of prefixed attributes) */
28841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if ((nPrefixes << 1) >> nsAttsPower) {  /* true for nsAttsPower = 0 */
28851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NS_ATT *temp;
28861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* hash table size must also be a power of 2 and >= 8 */
28871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      while (nPrefixes >> nsAttsPower++);
28881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (nsAttsPower < 3)
28891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nsAttsPower = 3;
28901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      nsAttsSize = (int)1 << nsAttsPower;
28911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      temp = (NS_ATT *)REALLOC(nsAtts, nsAttsSize * sizeof(NS_ATT));
28921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!temp)
28931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
28941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      nsAtts = temp;
28951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      version = 0;  /* force re-initialization of nsAtts hash table */
28961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
28971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* using a version flag saves us from initializing nsAtts every time */
28981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!version) {  /* initialize version flags when version wraps around */
28991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      version = INIT_ATTS_VERSION;
29001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      for (j = nsAttsSize; j != 0; )
29011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nsAtts[--j].version = version;
29021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
29031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    nsAttsVersion = --version;
29041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
29051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* expand prefixed names and check for duplicates */
29061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (; i < attIndex; i += 2) {
29071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const XML_Char *s = appAtts[i];
29081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (s[-1] == 2) {  /* prefixed */
29091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ATTRIBUTE_ID *id;
29101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const BINDING *b;
29111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        unsigned long uriHash = hash_secret_salt;
29121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ((XML_Char *)s)[-1] = 0;  /* clear flag */
29131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0);
29141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        b = id->prefix->binding;
29151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!b)
29161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_UNBOUND_PREFIX;
29171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
29181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* as we expand the name we also calculate its hash value */
29191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        for (j = 0; j < b->uriLen; j++) {
29201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const XML_Char c = b->uri[j];
29211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!poolAppendChar(&tempPool, c))
29221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_NO_MEMORY;
29231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          uriHash = CHAR_HASH(uriHash, c);
29241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
29251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        while (*s++ != XML_T(ASCII_COLON))
29261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ;
29271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        do {  /* copies null terminator */
29281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const XML_Char c = *s;
29291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!poolAppendChar(&tempPool, *s))
29301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_NO_MEMORY;
29311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          uriHash = CHAR_HASH(uriHash, c);
29321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        } while (*s++);
29331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
29341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        { /* Check hash table for duplicate of expanded name (uriName).
29351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             Derived from code in lookup(parser, HASH_TABLE *table, ...).
29361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          */
29371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          unsigned char step = 0;
29381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          unsigned long mask = nsAttsSize - 1;
29391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          j = uriHash & mask;  /* index into hash table */
29401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          while (nsAtts[j].version == version) {
29411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            /* for speed we compare stored hash values first */
29421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (uriHash == nsAtts[j].hash) {
29431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              const XML_Char *s1 = poolStart(&tempPool);
29441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              const XML_Char *s2 = nsAtts[j].uriName;
29451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              /* s1 is null terminated, but not s2 */
29461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              for (; *s1 == *s2 && *s1 != 0; s1++, s2++);
29471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              if (*s1 == 0)
29481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                return XML_ERROR_DUPLICATE_ATTRIBUTE;
29491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
29501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (!step)
29511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              step = PROBE_STEP(uriHash, mask, nsAttsPower);
29521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            j < step ? (j += nsAttsSize - step) : (j -= step);
29531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
29541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
29551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
29561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (ns_triplets) {  /* append namespace separator and prefix */
29571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          tempPool.ptr[-1] = namespaceSeparator;
29581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          s = b->prefix->name;
29591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          do {
29601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (!poolAppendChar(&tempPool, *s))
29611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              return XML_ERROR_NO_MEMORY;
29621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          } while (*s++);
29631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
29641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
29651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* store expanded name in attribute list */
29661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        s = poolStart(&tempPool);
29671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolFinish(&tempPool);
29681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        appAtts[i] = s;
29691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
29701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* fill empty slot with new version, uriName and hash value */
29711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nsAtts[j].version = version;
29721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nsAtts[j].hash = uriHash;
29731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nsAtts[j].uriName = s;
29741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
29751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!--nPrefixes) {
29761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          i += 2;
29771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
29781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
29791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
29801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else  /* not prefixed */
29811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ((XML_Char *)s)[-1] = 0;  /* clear flag */
29821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
29831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
29841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* clear flags for the remaining attributes */
29851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (; i < attIndex; i += 2)
29861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ((XML_Char *)(appAtts[i]))[-1] = 0;
29871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding)
29881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    binding->attId->name[-1] = 0;
29891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
29901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!ns)
29911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_NONE;
29921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
29931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* expand the element type name */
29941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (elementType->prefix) {
29951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    binding = elementType->prefix->binding;
29961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!binding)
29971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_UNBOUND_PREFIX;
29981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    localPart = tagNamePtr->str;
29991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    while (*localPart++ != XML_T(ASCII_COLON))
30001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ;
30011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
30021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else if (dtd->defaultPrefix.binding) {
30031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    binding = dtd->defaultPrefix.binding;
30041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    localPart = tagNamePtr->str;
30051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
30061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
30071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_NONE;
30081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  prefixLen = 0;
30091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ns_triplets && binding->prefix->name) {
30101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (; binding->prefix->name[prefixLen++];)
30111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ;  /* prefixLen includes null terminator */
30121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
30131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tagNamePtr->localPart = localPart;
30141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tagNamePtr->uriLen = binding->uriLen;
30151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tagNamePtr->prefix = binding->prefix->name;
30161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tagNamePtr->prefixLen = prefixLen;
30171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (i = 0; localPart[i++];)
30181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ;  /* i includes null terminator */
30191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  n = i + binding->uriLen + prefixLen;
30201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (n > binding->uriAlloc) {
30211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TAG *p;
30221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char));
30231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!uri)
30241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NO_MEMORY;
30251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    binding->uriAlloc = n + EXPAND_SPARE;
30261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char));
30271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (p = tagStack; p; p = p->parent)
30281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (p->name.str == binding->uri)
30291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        p->name.str = uri;
30301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FREE(binding->uri);
30311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    binding->uri = uri;
30321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
30331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* if namespaceSeparator != '\0' then uri includes it already */
30341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  uri = binding->uri + binding->uriLen;
30351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  memcpy(uri, localPart, i * sizeof(XML_Char));
30361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* we always have a namespace separator between localPart and prefix */
30371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (prefixLen) {
30381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    uri += i - 1;
30391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *uri = namespaceSeparator;  /* replace null terminator */
30401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char));
30411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
30421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tagNamePtr->str = binding->uri;
30431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_ERROR_NONE;
30441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
30451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
30461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* addBinding() overwrites the value of prefix->binding without checking.
30471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   Therefore one must keep track of the old value outside of addBinding().
30481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/
30491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
30501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciaddBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
30511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           const XML_Char *uri, BINDING **bindingsPtr)
30521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
30531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Char xmlNamespace[] = {
30541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH,
30551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD,
30561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L,
30571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH,
30581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c,
30591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASCII_e, '\0'
30601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
30611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const int xmlLen =
30621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    (int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1;
30631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Char xmlnsNamespace[] = {
30641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH,
30651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD,
30661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0,
30671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s,
30681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASCII_SLASH, '\0'
30691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
30701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const int xmlnsLen =
30711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    (int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1;
30721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
30731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool mustBeXML = XML_FALSE;
30741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool isXML = XML_TRUE;
30751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool isXMLNS = XML_TRUE;
30761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
30771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BINDING *b;
30781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int len;
30791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
30801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* empty URI is only valid for default namespace per XML NS 1.0 (not 1.1) */
30811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (*uri == XML_T('\0') && prefix->name)
30821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_UNDECLARING_PREFIX;
30831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
30841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (prefix->name
30851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      && prefix->name[0] == XML_T(ASCII_x)
30861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      && prefix->name[1] == XML_T(ASCII_m)
30871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      && prefix->name[2] == XML_T(ASCII_l)) {
30881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
30891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* Not allowed to bind xmlns */
30901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (prefix->name[3] == XML_T(ASCII_n)
30911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        && prefix->name[4] == XML_T(ASCII_s)
30921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        && prefix->name[5] == XML_T('\0'))
30931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_RESERVED_PREFIX_XMLNS;
30941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
30951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (prefix->name[3] == XML_T('\0'))
30961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      mustBeXML = XML_TRUE;
30971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
30981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
30991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (len = 0; uri[len]; len++) {
31001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len]))
31011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      isXML = XML_FALSE;
31021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
31031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!mustBeXML && isXMLNS
31041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        && (len > xmlnsLen || uri[len] != xmlnsNamespace[len]))
31051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      isXMLNS = XML_FALSE;
31061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
31071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  isXML = isXML && len == xmlLen;
31081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  isXMLNS = isXMLNS && len == xmlnsLen;
31091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
31101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (mustBeXML != isXML)
31111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return mustBeXML ? XML_ERROR_RESERVED_PREFIX_XML
31121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     : XML_ERROR_RESERVED_NAMESPACE_URI;
31131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
31141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (isXMLNS)
31151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_RESERVED_NAMESPACE_URI;
31161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
31171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (namespaceSeparator)
31181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    len++;
31191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (freeBindingList) {
31201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    b = freeBindingList;
31211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (len > b->uriAlloc) {
31221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      XML_Char *temp = (XML_Char *)REALLOC(b->uri,
31231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          sizeof(XML_Char) * (len + EXPAND_SPARE));
31241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (temp == NULL)
31251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
31261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      b->uri = temp;
31271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      b->uriAlloc = len + EXPAND_SPARE;
31281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
31291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    freeBindingList = b->nextTagBinding;
31301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
31311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
31321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    b = (BINDING *)MALLOC(sizeof(BINDING));
31331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!b)
31341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NO_MEMORY;
31351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE));
31361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!b->uri) {
31371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      FREE(b);
31381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NO_MEMORY;
31391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
31401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    b->uriAlloc = len + EXPAND_SPARE;
31411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
31421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b->uriLen = len;
31431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  memcpy(b->uri, uri, len * sizeof(XML_Char));
31441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (namespaceSeparator)
31451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    b->uri[len - 1] = namespaceSeparator;
31461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b->prefix = prefix;
31471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b->attId = attId;
31481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b->prevPrefixBinding = prefix->binding;
31491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* NULL binding when default namespace undeclared */
31501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix)
31511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    prefix->binding = NULL;
31521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
31531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    prefix->binding = b;
31541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  b->nextTagBinding = *bindingsPtr;
31551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *bindingsPtr = b;
31561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* if attId == NULL then we are not starting a namespace scope */
31571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (attId && startNamespaceDeclHandler)
31581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    startNamespaceDeclHandler(handlerArg, prefix->name,
31591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              prefix->binding ? uri : 0);
31601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_ERROR_NONE;
31611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
31621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
31631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* The idea here is to avoid using stack for each CDATA section when
31641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   the whole file is parsed with one call.
31651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/
31661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
31671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccicdataSectionProcessor(XML_Parser parser,
31681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      const char *start,
31691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      const char *end,
31701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      const char **endPtr)
31711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
31721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Error result = doCdataSection(parser, encoding, &start, end,
31731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         endPtr, (XML_Bool)!ps_finalBuffer);
31741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (result != XML_ERROR_NONE)
31751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return result;
31761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (start) {
31771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (parentParser) {  /* we are parsing an external entity */
31781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      processor = externalEntityContentProcessor;
31791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return externalEntityContentProcessor(parser, start, end, endPtr);
31801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
31811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else {
31821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      processor = contentProcessor;
31831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return contentProcessor(parser, start, end, endPtr);
31841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
31851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
31861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return result;
31871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
31881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
31891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* startPtr gets set to non-null if the section is closed, and to null if
31901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   the section is not yet closed.
31911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/
31921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
31931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoCdataSection(XML_Parser parser,
31941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const ENCODING *enc,
31951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char **startPtr,
31961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char *end,
31971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char **nextPtr,
31981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               XML_Bool haveMore)
31991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
32001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *s = *startPtr;
32011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char **eventPP;
32021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char **eventEndPP;
32031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (enc == encoding) {
32041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventPP = &eventPtr;
32051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *eventPP = s;
32061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventEndPP = &eventEndPtr;
32071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
32081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
32091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventPP = &(openInternalEntities->internalEventPtr);
32101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventEndPP = &(openInternalEntities->internalEventEndPtr);
32111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
32121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *eventPP = s;
32131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *startPtr = NULL;
32141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
32151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
32161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char *next;
32171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int tok = XmlCdataSectionTok(enc, s, end, &next);
32181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *eventEndPP = next;
32191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (tok) {
32201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_CDATA_SECT_CLOSE:
32211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (endCdataSectionHandler)
32221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        endCdataSectionHandler(handlerArg);
32231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if 0
32241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* see comment under XML_TOK_CDATA_SECT_OPEN */
32251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (characterDataHandler)
32261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        characterDataHandler(handlerArg, dataBuf, 0);
32271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
32281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (defaultHandler)
32291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        reportDefault(parser, enc, s, next);
32301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *startPtr = next;
32311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextPtr = next;
32321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ps_parsing == XML_FINISHED)
32331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_ABORTED;
32341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else
32351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
32361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_DATA_NEWLINE:
32371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (characterDataHandler) {
32381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_Char c = 0xA;
32391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        characterDataHandler(handlerArg, &c, 1);
32401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
32411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (defaultHandler)
32421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        reportDefault(parser, enc, s, next);
32431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
32441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_DATA_CHARS:
32451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
32461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_CharacterDataHandler charDataHandler = characterDataHandler;
32471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (charDataHandler) {
32481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (MUST_CONVERT(enc, s)) {
32491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            for (;;) {
32501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              ICHAR *dataPtr = (ICHAR *)dataBuf;
32511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
32521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              *eventEndPP = next;
32531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              charDataHandler(handlerArg, dataBuf,
32541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              (int)(dataPtr - (ICHAR *)dataBuf));
32551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              if (s == next)
32561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                break;
32571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              *eventPP = s;
32581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
32591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
32601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          else
32611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            charDataHandler(handlerArg,
32621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            (XML_Char *)s,
32631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            (int)((XML_Char *)next - (XML_Char *)s));
32641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
32651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (defaultHandler)
32661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          reportDefault(parser, enc, s, next);
32671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
32681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
32691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_INVALID:
32701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *eventPP = next;
32711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_INVALID_TOKEN;
32721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_PARTIAL_CHAR:
32731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (haveMore) {
32741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = s;
32751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
32761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
32771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_PARTIAL_CHAR;
32781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_PARTIAL:
32791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_NONE:
32801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (haveMore) {
32811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = s;
32821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
32831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
32841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_UNCLOSED_CDATA_SECTION;
32851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
32861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *eventPP = next;
32871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_UNEXPECTED_STATE;
32881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
32891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
32901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *eventPP = s = next;
32911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (ps_parsing) {
32921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_SUSPENDED:
32931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextPtr = next;
32941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
32951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_FINISHED:
32961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_ABORTED;
32971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default: ;
32981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
32991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
33001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* not reached */
33011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
33021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
33031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
33041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
33051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* The idea here is to avoid using stack for each IGNORE section when
33061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   the whole file is parsed with one call.
33071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/
33081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
33091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciignoreSectionProcessor(XML_Parser parser,
33101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const char *start,
33111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const char *end,
33121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const char **endPtr)
33131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
33141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Error result = doIgnoreSection(parser, encoding, &start, end,
33151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          endPtr, (XML_Bool)!ps_finalBuffer);
33161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (result != XML_ERROR_NONE)
33171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return result;
33181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (start) {
33191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    processor = prologProcessor;
33201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return prologProcessor(parser, start, end, endPtr);
33211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
33221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return result;
33231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
33241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
33251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* startPtr gets set to non-null is the section is closed, and to null
33261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   if the section is not yet closed.
33271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/
33281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
33291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoIgnoreSection(XML_Parser parser,
33301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const ENCODING *enc,
33311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char **startPtr,
33321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char *end,
33331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char **nextPtr,
33341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                XML_Bool haveMore)
33351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
33361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *next;
33371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int tok;
33381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *s = *startPtr;
33391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char **eventPP;
33401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char **eventEndPP;
33411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (enc == encoding) {
33421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventPP = &eventPtr;
33431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *eventPP = s;
33441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventEndPP = &eventEndPtr;
33451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
33461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
33471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventPP = &(openInternalEntities->internalEventPtr);
33481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventEndPP = &(openInternalEntities->internalEventEndPtr);
33491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
33501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *eventPP = s;
33511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *startPtr = NULL;
33521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tok = XmlIgnoreSectionTok(enc, s, end, &next);
33531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *eventEndPP = next;
33541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (tok) {
33551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_TOK_IGNORE_SECT:
33561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (defaultHandler)
33571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      reportDefault(parser, enc, s, next);
33581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *startPtr = next;
33591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextPtr = next;
33601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ps_parsing == XML_FINISHED)
33611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_ABORTED;
33621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else
33631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
33641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_TOK_INVALID:
33651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *eventPP = next;
33661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_INVALID_TOKEN;
33671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_TOK_PARTIAL_CHAR:
33681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (haveMore) {
33691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextPtr = s;
33701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
33711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
33721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_PARTIAL_CHAR;
33731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_TOK_PARTIAL:
33741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case XML_TOK_NONE:
33751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (haveMore) {
33761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextPtr = s;
33771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
33781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
33791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */
33801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
33811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *eventPP = next;
33821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_UNEXPECTED_STATE;
33831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
33841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* not reached */
33851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
33861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
33871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
33881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
33891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
33901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciinitializeEncoding(XML_Parser parser)
33911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
33921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *s;
33931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_UNICODE
33941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  char encodingBuf[128];
33951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!protocolEncodingName)
33961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    s = NULL;
33971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
33981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int i;
33991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (i = 0; protocolEncodingName[i]; i++) {
34001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (i == sizeof(encodingBuf) - 1
34011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          || (protocolEncodingName[i] & ~0x7f) != 0) {
34021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        encodingBuf[0] = '\0';
34031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
34041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
34051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      encodingBuf[i] = (char)protocolEncodingName[i];
34061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
34071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    encodingBuf[i] = '\0';
34081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    s = encodingBuf;
34091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
34101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
34111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  s = protocolEncodingName;
34121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
34131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s))
34141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_NONE;
34151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return handleUnknownEncoding(parser, protocolEncodingName);
34161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
34171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
34181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
34191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciprocessXmlDecl(XML_Parser parser, int isGeneralTextEntity,
34201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char *s, const char *next)
34211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
34221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *encodingName = NULL;
34231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *storedEncName = NULL;
34241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ENCODING *newEncoding = NULL;
34251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *version = NULL;
34261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *versionend;
34271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *storedversion = NULL;
34281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int standalone = -1;
34291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!(ns
34301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ? XmlParseXmlDeclNS
34311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        : XmlParseXmlDecl)(isGeneralTextEntity,
34321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           encoding,
34331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           s,
34341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           next,
34351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           &eventPtr,
34361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           &version,
34371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           &versionend,
34381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           &encodingName,
34391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           &newEncoding,
34401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           &standalone)) {
34411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (isGeneralTextEntity)
34421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_TEXT_DECL;
34431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else
34441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_XML_DECL;
34451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
34461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!isGeneralTextEntity && standalone == 1) {
34471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    _dtd->standalone = XML_TRUE;
34481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
34491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE)
34501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
34511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
34521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
34531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (xmlDeclHandler) {
34541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (encodingName != NULL) {
34551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      storedEncName = poolStoreString(&temp2Pool,
34561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      encoding,
34571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      encodingName,
34581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      encodingName
34591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      + XmlNameLength(encoding, encodingName));
34601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!storedEncName)
34611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              return XML_ERROR_NO_MEMORY;
34621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      poolFinish(&temp2Pool);
34631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
34641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (version) {
34651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      storedversion = poolStoreString(&temp2Pool,
34661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      encoding,
34671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      version,
34681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      versionend - encoding->minBytesPerChar);
34691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!storedversion)
34701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
34711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
34721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone);
34731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
34741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else if (defaultHandler)
34751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    reportDefault(parser, encoding, s, next);
34761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (protocolEncodingName == NULL) {
34771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (newEncoding) {
34781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) {
34791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        eventPtr = encodingName;
34801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_INCORRECT_ENCODING;
34811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
34821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      encoding = newEncoding;
34831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
34841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else if (encodingName) {
34851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      enum XML_Error result;
34861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!storedEncName) {
34871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        storedEncName = poolStoreString(
34881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          &temp2Pool, encoding, encodingName,
34891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          encodingName + XmlNameLength(encoding, encodingName));
34901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!storedEncName)
34911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
34921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
34931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = handleUnknownEncoding(parser, storedEncName);
34941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      poolClear(&temp2Pool);
34951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (result == XML_ERROR_UNKNOWN_ENCODING)
34961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        eventPtr = encodingName;
34971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return result;
34981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
34991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
35001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
35011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (storedEncName || storedversion)
35021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    poolClear(&temp2Pool);
35031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
35041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_ERROR_NONE;
35051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
35061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
35071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
35081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihandleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName)
35091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
35101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (unknownEncodingHandler) {
35111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_Encoding info;
35121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int i;
35131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (i = 0; i < 256; i++)
35141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      info.map[i] = -1;
35151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    info.convert = NULL;
35161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    info.data = NULL;
35171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    info.release = NULL;
35181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName,
35191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               &info)) {
35201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ENCODING *enc;
35211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding());
35221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!unknownEncodingMem) {
35231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (info.release)
35241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          info.release(info.data);
35251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
35261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
35271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      enc = (ns
35281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             ? XmlInitUnknownEncodingNS
35291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             : XmlInitUnknownEncoding)(unknownEncodingMem,
35301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       info.map,
35311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       info.convert,
35321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       info.data);
35331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (enc) {
35341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        unknownEncodingData = info.data;
35351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        unknownEncodingRelease = info.release;
35361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        encoding = enc;
35371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
35381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
35391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
35401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (info.release != NULL)
35411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      info.release(info.data);
35421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
35431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_ERROR_UNKNOWN_ENCODING;
35441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
35451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
35461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
35471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciprologInitProcessor(XML_Parser parser,
35481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const char *s,
35491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const char *end,
35501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const char **nextPtr)
35511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
35521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Error result = initializeEncoding(parser);
35531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (result != XML_ERROR_NONE)
35541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return result;
35551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  processor = prologProcessor;
35561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return prologProcessor(parser, s, end, nextPtr);
35571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
35581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
35591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
35601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
35611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
35621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciexternalParEntInitProcessor(XML_Parser parser,
35631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            const char *s,
35641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            const char *end,
35651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            const char **nextPtr)
35661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
35671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Error result = initializeEncoding(parser);
35681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (result != XML_ERROR_NONE)
35691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return result;
35701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
35711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* we know now that XML_Parse(Buffer) has been called,
35721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     so we consider the external parameter entity read */
35731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  _dtd->paramEntityRead = XML_TRUE;
35741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
35751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (prologState.inEntityValue) {
35761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    processor = entityValueInitProcessor;
35771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return entityValueInitProcessor(parser, s, end, nextPtr);
35781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
35791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
35801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    processor = externalParEntProcessor;
35811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return externalParEntProcessor(parser, s, end, nextPtr);
35821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
35831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
35841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
35851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
35861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccientityValueInitProcessor(XML_Parser parser,
35871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         const char *s,
35881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         const char *end,
35891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         const char **nextPtr)
35901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
35911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int tok;
35921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *start = s;
35931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *next = start;
35941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  eventPtr = start;
35951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
35961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
35971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tok = XmlPrologTok(encoding, start, end, &next);
35981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventEndPtr = next;
35991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (tok <= 0) {
36001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!ps_finalBuffer && tok != XML_TOK_INVALID) {
36011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = s;
36021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
36031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
36041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (tok) {
36051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_INVALID:
36061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_INVALID_TOKEN;
36071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_PARTIAL:
36081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_UNCLOSED_TOKEN;
36091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_PARTIAL_CHAR:
36101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_PARTIAL_CHAR;
36111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_NONE:   /* start == end */
36121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
36131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
36141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
36151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* found end of entity value - can store it now */
36161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return storeEntityValue(parser, encoding, s, end);
36171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
36181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else if (tok == XML_TOK_XML_DECL) {
36191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      enum XML_Error result;
36201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = processXmlDecl(parser, 0, start, next);
36211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (result != XML_ERROR_NONE)
36221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return result;
36231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (ps_parsing) {
36241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_SUSPENDED:
36251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = next;
36261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
36271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_FINISHED:
36281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_ABORTED;
36291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
36301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = next;
36311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
36321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* stop scanning for text declaration - we found one */
36331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      processor = entityValueProcessor;
36341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return entityValueProcessor(parser, next, end, nextPtr);
36351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
36361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* If we are at the end of the buffer, this would cause XmlPrologTok to
36371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       return XML_TOK_NONE on the next call, which would then cause the
36381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       function to exit with *nextPtr set to s - that is what we want for other
36391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       tokens, but not for the BOM - we would rather like to skip it;
36401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       then, when this routine is entered the next time, XmlPrologTok will
36411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       return XML_TOK_INVALID, since the BOM is still in the buffer
36421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    */
36431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else if (tok == XML_TOK_BOM && next == end && !ps_finalBuffer) {
36441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextPtr = next;
36451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
36461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
36471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    start = next;
36481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventPtr = start;
36491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
36501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
36511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
36521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
36531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciexternalParEntProcessor(XML_Parser parser,
36541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        const char *s,
36551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        const char *end,
36561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        const char **nextPtr)
36571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
36581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *next = s;
36591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int tok;
36601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
36611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tok = XmlPrologTok(encoding, s, end, &next);
36621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (tok <= 0) {
36631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!ps_finalBuffer && tok != XML_TOK_INVALID) {
36641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextPtr = s;
36651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
36661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
36671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (tok) {
36681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_INVALID:
36691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_INVALID_TOKEN;
36701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_PARTIAL:
36711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_UNCLOSED_TOKEN;
36721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_PARTIAL_CHAR:
36731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_PARTIAL_CHAR;
36741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_NONE:   /* start == end */
36751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
36761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
36771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
36781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
36791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM.
36801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     However, when parsing an external subset, doProlog will not accept a BOM
36811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     as valid, and report a syntax error, so we have to skip the BOM
36821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  */
36831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else if (tok == XML_TOK_BOM) {
36841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    s = next;
36851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tok = XmlPrologTok(encoding, s, end, &next);
36861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
36871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
36881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  processor = prologProcessor;
36891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return doProlog(parser, encoding, s, end, tok, next,
36901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  nextPtr, (XML_Bool)!ps_finalBuffer);
36911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
36921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
36931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
36941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccientityValueProcessor(XML_Parser parser,
36951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     const char *s,
36961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     const char *end,
36971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     const char **nextPtr)
36981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
36991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *start = s;
37001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *next = s;
37011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ENCODING *enc = encoding;
37021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int tok;
37031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
37041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
37051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tok = XmlPrologTok(enc, start, end, &next);
37061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (tok <= 0) {
37071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!ps_finalBuffer && tok != XML_TOK_INVALID) {
37081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = s;
37091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
37101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
37111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (tok) {
37121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_INVALID:
37131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_INVALID_TOKEN;
37141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_PARTIAL:
37151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_UNCLOSED_TOKEN;
37161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_PARTIAL_CHAR:
37171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_PARTIAL_CHAR;
37181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_NONE:   /* start == end */
37191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
37201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
37211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
37221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* found end of entity value - can store it now */
37231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return storeEntityValue(parser, enc, s, end);
37241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
37251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    start = next;
37261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
37271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
37281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
37291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
37301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
37311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
37321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciprologProcessor(XML_Parser parser,
37331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char *s,
37341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char *end,
37351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char **nextPtr)
37361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
37371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *next = s;
37381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int tok = XmlPrologTok(encoding, s, end, &next);
37391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return doProlog(parser, encoding, s, end, tok, next,
37401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  nextPtr, (XML_Bool)!ps_finalBuffer);
37411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
37421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
37431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
37441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoProlog(XML_Parser parser,
37451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         const ENCODING *enc,
37461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         const char *s,
37471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         const char *end,
37481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         int tok,
37491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         const char *next,
37501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         const char **nextPtr,
37511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         XML_Bool haveMore)
37521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
37531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
37541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' };
37551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
37561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Char atypeCDATA[] =
37571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
37581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' };
37591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Char atypeIDREF[] =
37601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };
37611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Char atypeIDREFS[] =
37621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };
37631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Char atypeENTITY[] =
37641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };
37651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Char atypeENTITIES[] = { ASCII_E, ASCII_N,
37661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' };
37671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Char atypeNMTOKEN[] = {
37681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };
37691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Char atypeNMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T,
37701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' };
37711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Char notationPrefix[] = { ASCII_N, ASCII_O, ASCII_T,
37721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0' };
37731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Char enumValueSep[] = { ASCII_PIPE, '\0' };
37741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' };
37751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
37761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* save one level of indirection */
37771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD * const dtd = _dtd;
37781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
37791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char **eventPP;
37801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char **eventEndPP;
37811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Content_Quant quant;
37821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
37831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (enc == encoding) {
37841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventPP = &eventPtr;
37851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventEndPP = &eventEndPtr;
37861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
37871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
37881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventPP = &(openInternalEntities->internalEventPtr);
37891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventEndPP = &(openInternalEntities->internalEventEndPtr);
37901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
37911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
37921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
37931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int role;
37941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XML_Bool handleDefault = XML_TRUE;
37951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *eventPP = s;
37961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *eventEndPP = next;
37971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (tok <= 0) {
37981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (haveMore && tok != XML_TOK_INVALID) {
37991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = s;
38001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
38011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
38021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (tok) {
38031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_INVALID:
38041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *eventPP = next;
38051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_INVALID_TOKEN;
38061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_PARTIAL:
38071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_UNCLOSED_TOKEN;
38081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_PARTIAL_CHAR:
38091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_PARTIAL_CHAR;
38101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case -XML_TOK_PROLOG_S:
38111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tok = -tok;
38121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
38131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_NONE:
38141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
38151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* for internal PE NOT referenced between declarations */
38161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (enc != encoding && !openInternalEntities->betweenDecl) {
38171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *nextPtr = s;
38181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NONE;
38191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
38201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* WFC: PE Between Declarations - must check that PE contains
38211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           complete markup, not only for external PEs, but also for
38221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           internal PEs if the reference occurs between declarations.
38231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        */
38241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (isParamEntity || enc != encoding) {
38251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc)
38261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              == XML_ROLE_ERROR)
38271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_INCOMPLETE_PE;
38281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *nextPtr = s;
38291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NONE;
38301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
38311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
38321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_ELEMENTS;
38331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
38341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tok = -tok;
38351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        next = end;
38361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
38371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
38381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
38391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    role = XmlTokenRole(&prologState, tok, s, next, enc);
38401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (role) {
38411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_XML_DECL:
38421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
38431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        enum XML_Error result = processXmlDecl(parser, 0, s, next);
38441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (result != XML_ERROR_NONE)
38451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return result;
38461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        enc = encoding;
38471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
38481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
38491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
38501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_DOCTYPE_NAME:
38511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (startDoctypeDeclHandler) {
38521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        doctypeName = poolStoreString(&tempPool, enc, s, next);
38531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!doctypeName)
38541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
38551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolFinish(&tempPool);
38561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        doctypePubid = NULL;
38571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
38581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
38591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      doctypeSysid = NULL; /* always initialize to NULL */
38601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
38611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_DOCTYPE_INTERNAL_SUBSET:
38621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (startDoctypeDeclHandler) {
38631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid,
38641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                doctypePubid, 1);
38651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        doctypeName = NULL;
38661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolClear(&tempPool);
38671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
38681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
38691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
38701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
38711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_TEXT_DECL:
38721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
38731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        enum XML_Error result = processXmlDecl(parser, 1, s, next);
38741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (result != XML_ERROR_NONE)
38751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return result;
38761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        enc = encoding;
38771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
38781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
38791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
38801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
38811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_DOCTYPE_PUBLIC_ID:
38821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
38831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      useForeignDTD = XML_FALSE;
38841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declEntity = (ENTITY *)lookup(parser,
38851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    &dtd->paramEntities,
38861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    externalSubsetName,
38871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    sizeof(ENTITY));
38881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!declEntity)
38891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
38901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
38911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      dtd->hasParamEntityRefs = XML_TRUE;
38921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (startDoctypeDeclHandler) {
38931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_Char *pubId;
38941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!XmlIsPublicId(enc, s, next, eventPP))
38951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_PUBLICID;
38961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        pubId = poolStoreString(&tempPool, enc,
38971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                s + enc->minBytesPerChar,
38981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                next - enc->minBytesPerChar);
38991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!pubId)
39001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
39011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        normalizePublicId(pubId);
39021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolFinish(&tempPool);
39031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        doctypePubid = pubId;
39041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
39051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        goto alreadyChecked;
39061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
39071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* fall through */
39081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ENTITY_PUBLIC_ID:
39091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!XmlIsPublicId(enc, s, next, eventPP))
39101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_PUBLICID;
39111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    alreadyChecked:
39121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->keepProcessing && declEntity) {
39131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_Char *tem = poolStoreString(&dtd->pool,
39141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        enc,
39151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        s + enc->minBytesPerChar,
39161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        next - enc->minBytesPerChar);
39171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!tem)
39181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
39191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        normalizePublicId(tem);
39201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        declEntity->publicId = tem;
39211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolFinish(&dtd->pool);
39221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (entityDeclHandler)
39231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          handleDefault = XML_FALSE;
39241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
39251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
39261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_DOCTYPE_CLOSE:
39271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (doctypeName) {
39281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        startDoctypeDeclHandler(handlerArg, doctypeName,
39291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                doctypeSysid, doctypePubid, 0);
39301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolClear(&tempPool);
39311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
39321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
39331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* doctypeSysid will be non-NULL in the case of a previous
39341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler
39351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         was not set, indicating an external subset
39361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      */
39371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
39381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (doctypeSysid || useForeignDTD) {
39391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs;
39401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->hasParamEntityRefs = XML_TRUE;
39411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (paramEntityParsing && externalEntityRefHandler) {
39421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ENTITY *entity = (ENTITY *)lookup(parser,
39431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            &dtd->paramEntities,
39441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            externalSubsetName,
39451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            sizeof(ENTITY));
39461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!entity)
39471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_NO_MEMORY;
39481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (useForeignDTD)
39491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            entity->base = curBase;
39501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          dtd->paramEntityRead = XML_FALSE;
39511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!externalEntityRefHandler(externalEntityRefHandlerArg,
39521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        0,
39531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        entity->base,
39541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        entity->systemId,
39551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        entity->publicId))
39561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
39571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (dtd->paramEntityRead) {
39581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (!dtd->standalone &&
39591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                notStandaloneHandler &&
39601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                !notStandaloneHandler(handlerArg))
39611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              return XML_ERROR_NOT_STANDALONE;
39621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
39631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          /* if we didn't read the foreign DTD then this means that there
39641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             is no external subset and we must reset dtd->hasParamEntityRefs
39651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          */
39661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          else if (!doctypeSysid)
39671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            dtd->hasParamEntityRefs = hadParamEntityRefs;
39681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          /* end of DTD - no need to update dtd->keepProcessing */
39691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
39701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        useForeignDTD = XML_FALSE;
39711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
39721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
39731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (endDoctypeDeclHandler) {
39741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        endDoctypeDeclHandler(handlerArg);
39751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
39761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
39771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
39781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_INSTANCE_START:
39791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
39801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* if there is no DOCTYPE declaration then now is the
39811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         last chance to read the foreign DTD
39821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      */
39831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (useForeignDTD) {
39841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs;
39851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->hasParamEntityRefs = XML_TRUE;
39861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (paramEntityParsing && externalEntityRefHandler) {
39871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities,
39881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            externalSubsetName,
39891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            sizeof(ENTITY));
39901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!entity)
39911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_NO_MEMORY;
39921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          entity->base = curBase;
39931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          dtd->paramEntityRead = XML_FALSE;
39941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!externalEntityRefHandler(externalEntityRefHandlerArg,
39951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        0,
39961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        entity->base,
39971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        entity->systemId,
39981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        entity->publicId))
39991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
40001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (dtd->paramEntityRead) {
40011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (!dtd->standalone &&
40021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                notStandaloneHandler &&
40031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                !notStandaloneHandler(handlerArg))
40041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              return XML_ERROR_NOT_STANDALONE;
40051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
40061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          /* if we didn't read the foreign DTD then this means that there
40071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             is no external subset and we must reset dtd->hasParamEntityRefs
40081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          */
40091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          else
40101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            dtd->hasParamEntityRefs = hadParamEntityRefs;
40111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          /* end of DTD - no need to update dtd->keepProcessing */
40121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
40131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
40141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
40151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      processor = contentProcessor;
40161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return contentProcessor(parser, s, end, nextPtr);
40171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ATTLIST_ELEMENT_NAME:
40181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declElementType = getElementType(parser, enc, s, next);
40191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!declElementType)
40201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
40211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto checkAttListDeclHandler;
40221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ATTRIBUTE_NAME:
40231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declAttributeId = getAttributeId(parser, enc, s, next);
40241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!declAttributeId)
40251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
40261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declAttributeIsCdata = XML_FALSE;
40271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declAttributeType = NULL;
40281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declAttributeIsId = XML_FALSE;
40291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto checkAttListDeclHandler;
40301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ATTRIBUTE_TYPE_CDATA:
40311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declAttributeIsCdata = XML_TRUE;
40321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declAttributeType = atypeCDATA;
40331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto checkAttListDeclHandler;
40341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ATTRIBUTE_TYPE_ID:
40351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declAttributeIsId = XML_TRUE;
40361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declAttributeType = atypeID;
40371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto checkAttListDeclHandler;
40381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ATTRIBUTE_TYPE_IDREF:
40391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declAttributeType = atypeIDREF;
40401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto checkAttListDeclHandler;
40411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ATTRIBUTE_TYPE_IDREFS:
40421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declAttributeType = atypeIDREFS;
40431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto checkAttListDeclHandler;
40441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ATTRIBUTE_TYPE_ENTITY:
40451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declAttributeType = atypeENTITY;
40461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto checkAttListDeclHandler;
40471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES:
40481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declAttributeType = atypeENTITIES;
40491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto checkAttListDeclHandler;
40501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN:
40511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declAttributeType = atypeNMTOKEN;
40521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto checkAttListDeclHandler;
40531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS:
40541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declAttributeType = atypeNMTOKENS;
40551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    checkAttListDeclHandler:
40561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->keepProcessing && attlistDeclHandler)
40571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
40581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
40591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ATTRIBUTE_ENUM_VALUE:
40601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ATTRIBUTE_NOTATION_VALUE:
40611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->keepProcessing && attlistDeclHandler) {
40621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const XML_Char *prefix;
40631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (declAttributeType) {
40641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          prefix = enumValueSep;
40651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
40661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else {
40671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE
40681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    ? notationPrefix
40691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    : enumValueStart);
40701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
40711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!poolAppendString(&tempPool, prefix))
40721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
40731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!poolAppend(&tempPool, enc, s, next))
40741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
40751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        declAttributeType = tempPool.start;
40761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
40771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
40781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
40791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE:
40801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE:
40811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->keepProcessing) {
40821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!defineAttribute(declElementType, declAttributeId,
40831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             declAttributeIsCdata, declAttributeIsId,
40841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             0, parser))
40851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
40861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (attlistDeclHandler && declAttributeType) {
40871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (*declAttributeType == XML_T(ASCII_LPAREN)
40881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              || (*declAttributeType == XML_T(ASCII_N)
40891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  && declAttributeType[1] == XML_T(ASCII_O))) {
40901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            /* Enumerated or Notation type */
40911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN))
40921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                || !poolAppendChar(&tempPool, XML_T('\0')))
40931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              return XML_ERROR_NO_MEMORY;
40941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            declAttributeType = tempPool.start;
40951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            poolFinish(&tempPool);
40961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
40971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *eventEndPP = s;
40981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          attlistDeclHandler(handlerArg, declElementType->name,
40991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             declAttributeId->name, declAttributeType,
41001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE);
41011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          poolClear(&tempPool);
41021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          handleDefault = XML_FALSE;
41031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
41041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
41051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
41061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE:
41071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_FIXED_ATTRIBUTE_VALUE:
41081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->keepProcessing) {
41091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const XML_Char *attVal;
41101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        enum XML_Error result =
41111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          storeAttributeValue(parser, enc, declAttributeIsCdata,
41121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              s + enc->minBytesPerChar,
41131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              next - enc->minBytesPerChar,
41141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              &dtd->pool);
41151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (result)
41161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return result;
41171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        attVal = poolStart(&dtd->pool);
41181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolFinish(&dtd->pool);
41191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* ID attributes aren't allowed to have a default */
41201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!defineAttribute(declElementType, declAttributeId,
41211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             declAttributeIsCdata, XML_FALSE, attVal, parser))
41221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
41231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (attlistDeclHandler && declAttributeType) {
41241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (*declAttributeType == XML_T(ASCII_LPAREN)
41251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              || (*declAttributeType == XML_T(ASCII_N)
41261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  && declAttributeType[1] == XML_T(ASCII_O))) {
41271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            /* Enumerated or Notation type */
41281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN))
41291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                || !poolAppendChar(&tempPool, XML_T('\0')))
41301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              return XML_ERROR_NO_MEMORY;
41311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            declAttributeType = tempPool.start;
41321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            poolFinish(&tempPool);
41331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
41341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *eventEndPP = s;
41351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          attlistDeclHandler(handlerArg, declElementType->name,
41361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             declAttributeId->name, declAttributeType,
41371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             attVal,
41381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             role == XML_ROLE_FIXED_ATTRIBUTE_VALUE);
41391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          poolClear(&tempPool);
41401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          handleDefault = XML_FALSE;
41411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
41421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
41431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
41441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ENTITY_VALUE:
41451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->keepProcessing) {
41461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        enum XML_Error result = storeEntityValue(parser, enc,
41471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            s + enc->minBytesPerChar,
41481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            next - enc->minBytesPerChar);
41491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (declEntity) {
41501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          declEntity->textPtr = poolStart(&dtd->entityValuePool);
41511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          declEntity->textLen = (int)(poolLength(&dtd->entityValuePool));
41521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          poolFinish(&dtd->entityValuePool);
41531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (entityDeclHandler) {
41541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            *eventEndPP = s;
41551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            entityDeclHandler(handlerArg,
41561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              declEntity->name,
41571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              declEntity->is_param,
41581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              declEntity->textPtr,
41591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              declEntity->textLen,
41601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              curBase, 0, 0, 0);
41611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            handleDefault = XML_FALSE;
41621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
41631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
41641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else
41651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          poolDiscard(&dtd->entityValuePool);
41661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (result != XML_ERROR_NONE)
41671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return result;
41681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
41691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
41701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_DOCTYPE_SYSTEM_ID:
41711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
41721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      useForeignDTD = XML_FALSE;
41731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
41741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      dtd->hasParamEntityRefs = XML_TRUE;
41751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (startDoctypeDeclHandler) {
41761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        doctypeSysid = poolStoreString(&tempPool, enc,
41771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       s + enc->minBytesPerChar,
41781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       next - enc->minBytesPerChar);
41791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (doctypeSysid == NULL)
41801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
41811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolFinish(&tempPool);
41821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
41831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
41841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
41851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else
41861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* use externalSubsetName to make doctypeSysid non-NULL
41871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           for the case where no startDoctypeDeclHandler is set */
41881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        doctypeSysid = externalSubsetName;
41891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
41901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!dtd->standalone
41911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
41921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          && !paramEntityParsing
41931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
41941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          && notStandaloneHandler
41951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          && !notStandaloneHandler(handlerArg))
41961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NOT_STANDALONE;
41971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef XML_DTD
41981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
41991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else /* XML_DTD */
42001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!declEntity) {
42011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        declEntity = (ENTITY *)lookup(parser,
42021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      &dtd->paramEntities,
42031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      externalSubsetName,
42041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      sizeof(ENTITY));
42051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!declEntity)
42061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
42071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        declEntity->publicId = NULL;
42081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
42091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* fall through */
42101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
42111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ENTITY_SYSTEM_ID:
42121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->keepProcessing && declEntity) {
42131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        declEntity->systemId = poolStoreString(&dtd->pool, enc,
42141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               s + enc->minBytesPerChar,
42151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               next - enc->minBytesPerChar);
42161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!declEntity->systemId)
42171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
42181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        declEntity->base = curBase;
42191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolFinish(&dtd->pool);
42201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (entityDeclHandler)
42211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          handleDefault = XML_FALSE;
42221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
42231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
42241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ENTITY_COMPLETE:
42251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->keepProcessing && declEntity && entityDeclHandler) {
42261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *eventEndPP = s;
42271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        entityDeclHandler(handlerArg,
42281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          declEntity->name,
42291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          declEntity->is_param,
42301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          0,0,
42311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          declEntity->base,
42321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          declEntity->systemId,
42331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          declEntity->publicId,
42341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          0);
42351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
42361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
42371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
42381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ENTITY_NOTATION_NAME:
42391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->keepProcessing && declEntity) {
42401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        declEntity->notation = poolStoreString(&dtd->pool, enc, s, next);
42411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!declEntity->notation)
42421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
42431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolFinish(&dtd->pool);
42441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (unparsedEntityDeclHandler) {
42451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *eventEndPP = s;
42461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          unparsedEntityDeclHandler(handlerArg,
42471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    declEntity->name,
42481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    declEntity->base,
42491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    declEntity->systemId,
42501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    declEntity->publicId,
42511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    declEntity->notation);
42521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          handleDefault = XML_FALSE;
42531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
42541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (entityDeclHandler) {
42551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *eventEndPP = s;
42561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          entityDeclHandler(handlerArg,
42571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            declEntity->name,
42581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            0,0,0,
42591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            declEntity->base,
42601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            declEntity->systemId,
42611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            declEntity->publicId,
42621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            declEntity->notation);
42631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          handleDefault = XML_FALSE;
42641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
42651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
42661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
42671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_GENERAL_ENTITY_NAME:
42681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
42691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (XmlPredefinedEntityName(enc, s, next)) {
42701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          declEntity = NULL;
42711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
42721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
42731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (dtd->keepProcessing) {
42741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);
42751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!name)
42761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_NO_MEMORY;
42771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name,
42781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        sizeof(ENTITY));
42791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!declEntity)
42801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_NO_MEMORY;
42811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (declEntity->name != name) {
42821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            poolDiscard(&dtd->pool);
42831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            declEntity = NULL;
42841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
42851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          else {
42861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            poolFinish(&dtd->pool);
42871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            declEntity->publicId = NULL;
42881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            declEntity->is_param = XML_FALSE;
42891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            /* if we have a parent parser or are reading an internal parameter
42901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               entity, then the entity declaration is not considered "internal"
42911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            */
42921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            declEntity->is_internal = !(parentParser || openInternalEntities);
42931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (entityDeclHandler)
42941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              handleDefault = XML_FALSE;
42951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
42961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
42971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else {
42981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          poolDiscard(&dtd->pool);
42991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          declEntity = NULL;
43001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
43011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
43021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
43031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_PARAM_ENTITY_NAME:
43041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
43051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->keepProcessing) {
43061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);
43071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!name)
43081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
43091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities,
43101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           name, sizeof(ENTITY));
43111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!declEntity)
43121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
43131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (declEntity->name != name) {
43141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          poolDiscard(&dtd->pool);
43151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          declEntity = NULL;
43161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
43171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else {
43181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          poolFinish(&dtd->pool);
43191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          declEntity->publicId = NULL;
43201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          declEntity->is_param = XML_TRUE;
43211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          /* if we have a parent parser or are reading an internal parameter
43221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             entity, then the entity declaration is not considered "internal"
43231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          */
43241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          declEntity->is_internal = !(parentParser || openInternalEntities);
43251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (entityDeclHandler)
43261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            handleDefault = XML_FALSE;
43271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
43281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
43291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else {
43301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolDiscard(&dtd->pool);
43311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        declEntity = NULL;
43321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
43331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else /* not XML_DTD */
43341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declEntity = NULL;
43351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
43361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
43371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_NOTATION_NAME:
43381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declNotationPublicId = NULL;
43391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      declNotationName = NULL;
43401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (notationDeclHandler) {
43411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        declNotationName = poolStoreString(&tempPool, enc, s, next);
43421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!declNotationName)
43431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
43441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolFinish(&tempPool);
43451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
43461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
43471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
43481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_NOTATION_PUBLIC_ID:
43491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!XmlIsPublicId(enc, s, next, eventPP))
43501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_PUBLICID;
43511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (declNotationName) {  /* means notationDeclHandler != NULL */
43521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_Char *tem = poolStoreString(&tempPool,
43531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        enc,
43541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        s + enc->minBytesPerChar,
43551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        next - enc->minBytesPerChar);
43561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!tem)
43571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
43581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        normalizePublicId(tem);
43591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        declNotationPublicId = tem;
43601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolFinish(&tempPool);
43611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
43621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
43631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
43641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_NOTATION_SYSTEM_ID:
43651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (declNotationName && notationDeclHandler) {
43661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const XML_Char *systemId
43671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          = poolStoreString(&tempPool, enc,
43681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            s + enc->minBytesPerChar,
43691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            next - enc->minBytesPerChar);
43701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!systemId)
43711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
43721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *eventEndPP = s;
43731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        notationDeclHandler(handlerArg,
43741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            declNotationName,
43751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            curBase,
43761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            systemId,
43771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            declNotationPublicId);
43781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
43791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
43801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      poolClear(&tempPool);
43811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
43821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_NOTATION_NO_SYSTEM_ID:
43831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (declNotationPublicId && notationDeclHandler) {
43841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *eventEndPP = s;
43851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        notationDeclHandler(handlerArg,
43861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            declNotationName,
43871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            curBase,
43881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            0,
43891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            declNotationPublicId);
43901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
43911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
43921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      poolClear(&tempPool);
43931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
43941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ERROR:
43951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (tok) {
43961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_PARAM_ENTITY_REF:
43971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* PE references in internal subset are
43981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           not allowed within declarations. */
43991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_PARAM_ENTITY_REF;
44001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_XML_DECL:
44011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_MISPLACED_XML_PI;
44021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
44031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_SYNTAX;
44041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
44051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
44061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_IGNORE_SECT:
44071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
44081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        enum XML_Error result;
44091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (defaultHandler)
44101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          reportDefault(parser, enc, s, next);
44111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
44121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore);
44131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (result != XML_ERROR_NONE)
44141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return result;
44151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (!next) {
44161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          processor = ignoreSectionProcessor;
44171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return result;
44181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
44191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
44201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
44211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
44221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_GROUP_OPEN:
44231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (prologState.level >= groupSize) {
44241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (groupSize) {
44251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          char *temp = (char *)REALLOC(groupConnector, groupSize *= 2);
44261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (temp == NULL)
44271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_NO_MEMORY;
44281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          groupConnector = temp;
44291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (dtd->scaffIndex) {
44301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            int *temp = (int *)REALLOC(dtd->scaffIndex,
44311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          groupSize * sizeof(int));
44321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (temp == NULL)
44331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              return XML_ERROR_NO_MEMORY;
44341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            dtd->scaffIndex = temp;
44351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
44361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
44371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else {
44381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          groupConnector = (char *)MALLOC(groupSize = 32);
44391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!groupConnector)
44401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_NO_MEMORY;
44411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
44421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
44431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      groupConnector[prologState.level] = 0;
44441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->in_eldecl) {
44451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int myindex = nextScaffoldPart(parser);
44461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (myindex < 0)
44471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
44481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->scaffIndex[dtd->scaffLevel] = myindex;
44491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->scaffLevel++;
44501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->scaffold[myindex].type = XML_CTYPE_SEQ;
44511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (elementDeclHandler)
44521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          handleDefault = XML_FALSE;
44531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
44541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
44551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_GROUP_SEQUENCE:
44561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (groupConnector[prologState.level] == ASCII_PIPE)
44571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_SYNTAX;
44581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      groupConnector[prologState.level] = ASCII_COMMA;
44591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->in_eldecl && elementDeclHandler)
44601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
44611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
44621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_GROUP_CHOICE:
44631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (groupConnector[prologState.level] == ASCII_COMMA)
44641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_SYNTAX;
44651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->in_eldecl
44661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          && !groupConnector[prologState.level]
44671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
44681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              != XML_CTYPE_MIXED)
44691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ) {
44701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
44711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            = XML_CTYPE_CHOICE;
44721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (elementDeclHandler)
44731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          handleDefault = XML_FALSE;
44741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
44751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      groupConnector[prologState.level] = ASCII_PIPE;
44761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
44771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_PARAM_ENTITY_REF:
44781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
44791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_INNER_PARAM_ENTITY_REF:
44801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      dtd->hasParamEntityRefs = XML_TRUE;
44811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!paramEntityParsing)
44821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->keepProcessing = dtd->standalone;
44831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else {
44841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const XML_Char *name;
44851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ENTITY *entity;
44861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        name = poolStoreString(&dtd->pool, enc,
44871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                s + enc->minBytesPerChar,
44881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                next - enc->minBytesPerChar);
44891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!name)
44901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
44911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0);
44921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolDiscard(&dtd->pool);
44931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* first, determine if a check for an existing declaration is needed;
44941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           if yes, check that the entity exists, and that it is internal,
44951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           otherwise call the skipped entity handler
44961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        */
44971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (prologState.documentEntity &&
44981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            (dtd->standalone
44991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             ? !openInternalEntities
45001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             : !dtd->hasParamEntityRefs)) {
45011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!entity)
45021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_UNDEFINED_ENTITY;
45031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          else if (!entity->is_internal)
45041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_ENTITY_DECLARED_IN_PE;
45051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
45061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (!entity) {
45071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          dtd->keepProcessing = dtd->standalone;
45081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          /* cannot report skipped entities in declarations */
45091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) {
45101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            skippedEntityHandler(handlerArg, name, 1);
45111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            handleDefault = XML_FALSE;
45121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
45131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
45141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
45151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (entity->open)
45161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_RECURSIVE_ENTITY_REF;
45171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (entity->textPtr) {
45181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          enum XML_Error result;
45191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          XML_Bool betweenDecl =
45201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE);
45211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          result = processInternalEntity(parser, entity, betweenDecl);
45221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (result != XML_ERROR_NONE)
45231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return result;
45241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          handleDefault = XML_FALSE;
45251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
45261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
45271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (externalEntityRefHandler) {
45281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          dtd->paramEntityRead = XML_FALSE;
45291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          entity->open = XML_TRUE;
45301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!externalEntityRefHandler(externalEntityRefHandlerArg,
45311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        0,
45321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        entity->base,
45331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        entity->systemId,
45341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        entity->publicId)) {
45351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            entity->open = XML_FALSE;
45361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
45371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
45381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          entity->open = XML_FALSE;
45391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          handleDefault = XML_FALSE;
45401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!dtd->paramEntityRead) {
45411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            dtd->keepProcessing = dtd->standalone;
45421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            break;
45431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
45441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
45451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else {
45461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          dtd->keepProcessing = dtd->standalone;
45471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
45481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
45491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
45501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
45511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!dtd->standalone &&
45521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          notStandaloneHandler &&
45531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          !notStandaloneHandler(handlerArg))
45541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NOT_STANDALONE;
45551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
45561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
45571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* Element declaration stuff */
45581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
45591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ELEMENT_NAME:
45601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (elementDeclHandler) {
45611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        declElementType = getElementType(parser, enc, s, next);
45621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!declElementType)
45631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
45641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->scaffLevel = 0;
45651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->scaffCount = 0;
45661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->in_eldecl = XML_TRUE;
45671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
45681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
45691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
45701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
45711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_CONTENT_ANY:
45721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_CONTENT_EMPTY:
45731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->in_eldecl) {
45741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (elementDeclHandler) {
45751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content));
45761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!content)
45771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_NO_MEMORY;
45781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          content->quant = XML_CQUANT_NONE;
45791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          content->name = NULL;
45801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          content->numchildren = 0;
45811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          content->children = NULL;
45821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          content->type = ((role == XML_ROLE_CONTENT_ANY) ?
45831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           XML_CTYPE_ANY :
45841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           XML_CTYPE_EMPTY);
45851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *eventEndPP = s;
45861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          elementDeclHandler(handlerArg, declElementType->name, content);
45871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          handleDefault = XML_FALSE;
45881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
45891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->in_eldecl = XML_FALSE;
45901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
45911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
45921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
45931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_CONTENT_PCDATA:
45941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->in_eldecl) {
45951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
45961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            = XML_CTYPE_MIXED;
45971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (elementDeclHandler)
45981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          handleDefault = XML_FALSE;
45991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
46001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
46011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
46021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_CONTENT_ELEMENT:
46031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quant = XML_CQUANT_NONE;
46041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto elementContent;
46051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_CONTENT_ELEMENT_OPT:
46061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quant = XML_CQUANT_OPT;
46071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto elementContent;
46081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_CONTENT_ELEMENT_REP:
46091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quant = XML_CQUANT_REP;
46101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto elementContent;
46111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_CONTENT_ELEMENT_PLUS:
46121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quant = XML_CQUANT_PLUS;
46131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    elementContent:
46141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->in_eldecl) {
46151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ELEMENT_TYPE *el;
46161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const XML_Char *name;
46171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int nameLen;
46181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const char *nxt = (quant == XML_CQUANT_NONE
46191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           ? next
46201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           : next - enc->minBytesPerChar);
46211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int myindex = nextScaffoldPart(parser);
46221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (myindex < 0)
46231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
46241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->scaffold[myindex].type = XML_CTYPE_NAME;
46251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->scaffold[myindex].quant = quant;
46261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        el = getElementType(parser, enc, s, nxt);
46271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!el)
46281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
46291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        name = el->name;
46301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->scaffold[myindex].name = name;
46311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nameLen = 0;
46321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        for (; name[nameLen++]; );
46331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->contentStringLen +=  nameLen;
46341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (elementDeclHandler)
46351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          handleDefault = XML_FALSE;
46361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
46371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
46381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
46391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_GROUP_CLOSE:
46401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quant = XML_CQUANT_NONE;
46411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto closeGroup;
46421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_GROUP_CLOSE_OPT:
46431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quant = XML_CQUANT_OPT;
46441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto closeGroup;
46451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_GROUP_CLOSE_REP:
46461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quant = XML_CQUANT_REP;
46471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto closeGroup;
46481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_GROUP_CLOSE_PLUS:
46491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quant = XML_CQUANT_PLUS;
46501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    closeGroup:
46511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->in_eldecl) {
46521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (elementDeclHandler)
46531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          handleDefault = XML_FALSE;
46541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->scaffLevel--;
46551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant;
46561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (dtd->scaffLevel == 0) {
46571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!handleDefault) {
46581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            XML_Content *model = build_model(parser);
46591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (!model)
46601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              return XML_ERROR_NO_MEMORY;
46611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            *eventEndPP = s;
46621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            elementDeclHandler(handlerArg, declElementType->name, model);
46631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
46641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          dtd->in_eldecl = XML_FALSE;
46651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          dtd->contentStringLen = 0;
46661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
46671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
46681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
46691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* End element declaration stuff */
46701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
46711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_PI:
46721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!reportProcessingInstruction(parser, enc, s, next))
46731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
46741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      handleDefault = XML_FALSE;
46751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
46761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_COMMENT:
46771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!reportComment(parser, enc, s, next))
46781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
46791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      handleDefault = XML_FALSE;
46801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
46811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_NONE:
46821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (tok) {
46831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_BOM:
46841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
46851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
46861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
46871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
46881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_DOCTYPE_NONE:
46891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (startDoctypeDeclHandler)
46901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
46911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
46921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ENTITY_NONE:
46931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->keepProcessing && entityDeclHandler)
46941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
46951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
46961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_NOTATION_NONE:
46971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (notationDeclHandler)
46981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
46991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
47001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ATTLIST_NONE:
47011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (dtd->keepProcessing && attlistDeclHandler)
47021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
47031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
47041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_ROLE_ELEMENT_NONE:
47051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (elementDeclHandler)
47061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        handleDefault = XML_FALSE;
47071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
47081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    } /* end of big switch */
47091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
47101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (handleDefault && defaultHandler)
47111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      reportDefault(parser, enc, s, next);
47121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
47131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (ps_parsing) {
47141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_SUSPENDED:
47151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextPtr = next;
47161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
47171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_FINISHED:
47181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_ABORTED;
47191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
47201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      s = next;
47211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      tok = XmlPrologTok(enc, s, end, &next);
47221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
47231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
47241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* not reached */
47251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
47261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
47271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
47281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciepilogProcessor(XML_Parser parser,
47291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char *s,
47301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char *end,
47311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char **nextPtr)
47321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
47331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  processor = epilogProcessor;
47341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  eventPtr = s;
47351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
47361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char *next = NULL;
47371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int tok = XmlPrologTok(encoding, s, end, &next);
47381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventEndPtr = next;
47391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (tok) {
47401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* report partial linebreak - it might be the last token */
47411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case -XML_TOK_PROLOG_S:
47421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (defaultHandler) {
47431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        reportDefault(parser, encoding, s, next);
47441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (ps_parsing == XML_FINISHED)
47451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_ABORTED;
47461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
47471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextPtr = next;
47481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
47491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_NONE:
47501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextPtr = s;
47511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
47521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_PROLOG_S:
47531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (defaultHandler)
47541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        reportDefault(parser, encoding, s, next);
47551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
47561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_PI:
47571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!reportProcessingInstruction(parser, encoding, s, next))
47581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
47591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
47601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_COMMENT:
47611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!reportComment(parser, encoding, s, next))
47621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
47631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
47641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_INVALID:
47651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      eventPtr = next;
47661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_INVALID_TOKEN;
47671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_PARTIAL:
47681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!ps_finalBuffer) {
47691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = s;
47701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
47711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
47721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_UNCLOSED_TOKEN;
47731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_PARTIAL_CHAR:
47741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!ps_finalBuffer) {
47751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextPtr = s;
47761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NONE;
47771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
47781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_PARTIAL_CHAR;
47791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
47801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_JUNK_AFTER_DOC_ELEMENT;
47811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
47821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    eventPtr = s = next;
47831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (ps_parsing) {
47841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_SUSPENDED:
47851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextPtr = next;
47861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
47871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_FINISHED:
47881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_ABORTED;
47891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default: ;
47901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
47911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
47921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
47931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
47941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
47951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciprocessInternalEntity(XML_Parser parser, ENTITY *entity,
47961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      XML_Bool betweenDecl)
47971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
47981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *textStart, *textEnd;
47991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *next;
48001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Error result;
48011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OPEN_INTERNAL_ENTITY *openEntity;
48021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
48031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (freeInternalEntities) {
48041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    openEntity = freeInternalEntities;
48051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    freeInternalEntities = openEntity->next;
48061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
48071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
48081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(sizeof(OPEN_INTERNAL_ENTITY));
48091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!openEntity)
48101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NO_MEMORY;
48111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
48121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  entity->open = XML_TRUE;
48131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  entity->processed = 0;
48141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  openEntity->next = openInternalEntities;
48151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  openInternalEntities = openEntity;
48161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  openEntity->entity = entity;
48171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  openEntity->startTagLevel = tagLevel;
48181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  openEntity->betweenDecl = betweenDecl;
48191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  openEntity->internalEventPtr = NULL;
48201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  openEntity->internalEventEndPtr = NULL;
48211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  textStart = (char *)entity->textPtr;
48221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  textEnd = (char *)(entity->textPtr + entity->textLen);
48231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
48241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
48251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (entity->is_param) {
48261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next);
48271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
48281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      next, &next, XML_FALSE);
48291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
48301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
48311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
48321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    result = doContent(parser, tagLevel, internalEncoding, textStart,
48331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       textEnd, &next, XML_FALSE);
48341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
48351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (result == XML_ERROR_NONE) {
48361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (textEnd != next && ps_parsing == XML_SUSPENDED) {
48371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      entity->processed = (int)(next - textStart);
48381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      processor = internalEntityProcessor;
48391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
48401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else {
48411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      entity->open = XML_FALSE;
48421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      openInternalEntities = openEntity->next;
48431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* put openEntity back in list of free instances */
48441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      openEntity->next = freeInternalEntities;
48451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      freeInternalEntities = openEntity;
48461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
48471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
48481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return result;
48491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
48501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
48511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
48521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciinternalEntityProcessor(XML_Parser parser,
48531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        const char *s,
48541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        const char *end,
48551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        const char **nextPtr)
48561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
48571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ENTITY *entity;
48581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *textStart, *textEnd;
48591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *next;
48601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Error result;
48611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OPEN_INTERNAL_ENTITY *openEntity = openInternalEntities;
48621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!openEntity)
48631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_UNEXPECTED_STATE;
48641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
48651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  entity = openEntity->entity;
48661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  textStart = ((char *)entity->textPtr) + entity->processed;
48671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  textEnd = (char *)(entity->textPtr + entity->textLen);
48681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
48691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
48701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (entity->is_param) {
48711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next);
48721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
48731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      next, &next, XML_FALSE);
48741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
48751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
48761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
48771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    result = doContent(parser, openEntity->startTagLevel, internalEncoding,
48781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       textStart, textEnd, &next, XML_FALSE);
48791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
48801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (result != XML_ERROR_NONE)
48811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return result;
48821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else if (textEnd != next && ps_parsing == XML_SUSPENDED) {
48831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    entity->processed = (int)(next - (char *)entity->textPtr);
48841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return result;
48851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
48861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
48871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    entity->open = XML_FALSE;
48881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    openInternalEntities = openEntity->next;
48891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* put openEntity back in list of free instances */
48901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    openEntity->next = freeInternalEntities;
48911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    freeInternalEntities = openEntity;
48921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
48931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
48941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
48951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (entity->is_param) {
48961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int tok;
48971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    processor = prologProcessor;
48981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tok = XmlPrologTok(encoding, s, end, &next);
48991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return doProlog(parser, encoding, s, end, tok, next, nextPtr,
49001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    (XML_Bool)!ps_finalBuffer);
49011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
49021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
49031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
49041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
49051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    processor = contentProcessor;
49061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* see externalEntityContentProcessor vs contentProcessor */
49071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return doContent(parser, parentParser ? 1 : 0, encoding, s, end,
49081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     nextPtr, (XML_Bool)!ps_finalBuffer);
49091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
49101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
49111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
49121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL
49131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccierrorProcessor(XML_Parser parser,
49141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char *s,
49151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char *end,
49161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char **nextPtr)
49171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
49181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return errorCode;
49191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
49201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
49211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
49221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistoreAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
49231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const char *ptr, const char *end,
49241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    STRING_POOL *pool)
49251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
49261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr,
49271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               end, pool);
49281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (result)
49291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return result;
49301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20)
49311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    poolChop(pool);
49321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!poolAppendChar(pool, XML_T('\0')))
49331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_ERROR_NO_MEMORY;
49341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_ERROR_NONE;
49351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
49361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
49371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
49381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciappendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
49391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     const char *ptr, const char *end,
49401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     STRING_POOL *pool)
49411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
49421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD * const dtd = _dtd;  /* save one level of indirection */
49431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
49441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char *next;
49451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int tok = XmlAttributeValueTok(enc, ptr, end, &next);
49461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (tok) {
49471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_NONE:
49481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NONE;
49491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_INVALID:
49501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (enc == encoding)
49511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        eventPtr = next;
49521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_INVALID_TOKEN;
49531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_PARTIAL:
49541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (enc == encoding)
49551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        eventPtr = ptr;
49561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_INVALID_TOKEN;
49571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_CHAR_REF:
49581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
49591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_Char buf[XML_ENCODE_MAX];
49601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int i;
49611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int n = XmlCharRefNumber(enc, ptr);
49621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (n < 0) {
49631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (enc == encoding)
49641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            eventPtr = ptr;
49651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_BAD_CHAR_REF;
49661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
49671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!isCdata
49681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            && n == 0x20 /* space */
49691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20))
49701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
49711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        n = XmlEncode(n, (ICHAR *)buf);
49721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!n) {
49731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (enc == encoding)
49741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            eventPtr = ptr;
49751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_BAD_CHAR_REF;
49761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
49771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        for (i = 0; i < n; i++) {
49781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!poolAppendChar(pool, buf[i]))
49791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_NO_MEMORY;
49801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
49811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
49821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
49831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_DATA_CHARS:
49841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!poolAppend(pool, enc, ptr, next))
49851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
49861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
49871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_TRAILING_CR:
49881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      next = ptr + enc->minBytesPerChar;
49891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* fall through */
49901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_ATTRIBUTE_VALUE_S:
49911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_DATA_NEWLINE:
49921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20))
49931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
49941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!poolAppendChar(pool, 0x20))
49951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_ERROR_NO_MEMORY;
49961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
49971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_ENTITY_REF:
49981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
49991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const XML_Char *name;
50001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ENTITY *entity;
50011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        char checkEntityDecl;
50021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc,
50031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              ptr + enc->minBytesPerChar,
50041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              next - enc->minBytesPerChar);
50051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (ch) {
50061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!poolAppendChar(pool, ch))
50071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                return XML_ERROR_NO_MEMORY;
50081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
50091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
50101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        name = poolStoreString(&temp2Pool, enc,
50111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               ptr + enc->minBytesPerChar,
50121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               next - enc->minBytesPerChar);
50131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!name)
50141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_NO_MEMORY;
50151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0);
50161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolDiscard(&temp2Pool);
50171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* First, determine if a check for an existing declaration is needed;
50181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           if yes, check that the entity exists, and that it is internal.
50191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        */
50201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (pool == &dtd->pool)  /* are we called from prolog? */
50211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          checkEntityDecl =
50221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
50231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              prologState.documentEntity &&
50241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
50251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              (dtd->standalone
50261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               ? !openInternalEntities
50271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               : !dtd->hasParamEntityRefs);
50281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else /* if (pool == &tempPool): we are called from content */
50291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone;
50301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (checkEntityDecl) {
50311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!entity)
50321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_UNDEFINED_ENTITY;
50331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          else if (!entity->is_internal)
50341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_ERROR_ENTITY_DECLARED_IN_PE;
50351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
50361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else if (!entity) {
50371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          /* Cannot report skipped entity here - see comments on
50381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             skippedEntityHandler.
50391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (skippedEntityHandler)
50401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            skippedEntityHandler(handlerArg, name, 0);
50411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          */
50421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          /* Cannot call the default handler because this would be
50431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             out of sync with the call to the startElementHandler.
50441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if ((pool == &tempPool) && defaultHandler)
50451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            reportDefault(parser, enc, ptr, next);
50461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          */
50471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
50481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
50491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (entity->open) {
50501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (enc == encoding)
50511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            eventPtr = ptr;
50521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_RECURSIVE_ENTITY_REF;
50531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
50541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (entity->notation) {
50551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (enc == encoding)
50561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            eventPtr = ptr;
50571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_BINARY_ENTITY_REF;
50581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
50591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!entity->textPtr) {
50601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (enc == encoding)
50611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            eventPtr = ptr;
50621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF;
50631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
50641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else {
50651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          enum XML_Error result;
50661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const XML_Char *textEnd = entity->textPtr + entity->textLen;
50671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          entity->open = XML_TRUE;
50681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          result = appendAttributeValue(parser, internalEncoding, isCdata,
50691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        (char *)entity->textPtr,
50701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        (char *)textEnd, pool);
50711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          entity->open = XML_FALSE;
50721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (result)
50731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return result;
50741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
50751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
50761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
50771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
50781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (enc == encoding)
50791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        eventPtr = ptr;
50801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_UNEXPECTED_STATE;
50811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
50821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr = next;
50831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
50841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* not reached */
50851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
50861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
50871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error
50881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistoreEntityValue(XML_Parser parser,
50891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 const ENCODING *enc,
50901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 const char *entityTextPtr,
50911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 const char *entityTextEnd)
50921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
50931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD * const dtd = _dtd;  /* save one level of indirection */
50941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  STRING_POOL *pool = &(dtd->entityValuePool);
50951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum XML_Error result = XML_ERROR_NONE;
50961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
50971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int oldInEntityValue = prologState.inEntityValue;
50981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  prologState.inEntityValue = 1;
50991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
51001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* never return Null for the value argument in EntityDeclHandler,
51011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     since this would indicate an external entity; therefore we
51021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     have to make sure that entityValuePool.start is not null */
51031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!pool->blocks) {
51041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!poolGrow(pool))
51051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_ERROR_NO_MEMORY;
51061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
51071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
51091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char *next;
51101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next);
51111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (tok) {
51121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_PARAM_ENTITY_REF:
51131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
51141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (isParamEntity || enc != encoding) {
51151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const XML_Char *name;
51161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ENTITY *entity;
51171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        name = poolStoreString(&tempPool, enc,
51181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               entityTextPtr + enc->minBytesPerChar,
51191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               next - enc->minBytesPerChar);
51201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!name) {
51211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          result = XML_ERROR_NO_MEMORY;
51221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          goto endEntityValue;
51231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
51241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0);
51251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolDiscard(&tempPool);
51261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!entity) {
51271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          /* not a well-formedness error - see XML 1.0: WFC Entity Declared */
51281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          /* cannot report skipped entity here - see comments on
51291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             skippedEntityHandler
51301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (skippedEntityHandler)
51311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            skippedEntityHandler(handlerArg, name, 0);
51321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          */
51331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          dtd->keepProcessing = dtd->standalone;
51341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          goto endEntityValue;
51351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
51361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (entity->open) {
51371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (enc == encoding)
51381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            eventPtr = entityTextPtr;
51391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          result = XML_ERROR_RECURSIVE_ENTITY_REF;
51401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          goto endEntityValue;
51411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
51421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (entity->systemId) {
51431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (externalEntityRefHandler) {
51441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            dtd->paramEntityRead = XML_FALSE;
51451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            entity->open = XML_TRUE;
51461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (!externalEntityRefHandler(externalEntityRefHandlerArg,
51471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          0,
51481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          entity->base,
51491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          entity->systemId,
51501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          entity->publicId)) {
51511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              entity->open = XML_FALSE;
51521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              result = XML_ERROR_EXTERNAL_ENTITY_HANDLING;
51531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              goto endEntityValue;
51541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
51551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            entity->open = XML_FALSE;
51561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (!dtd->paramEntityRead)
51571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              dtd->keepProcessing = dtd->standalone;
51581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
51591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          else
51601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            dtd->keepProcessing = dtd->standalone;
51611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
51621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else {
51631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          entity->open = XML_TRUE;
51641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          result = storeEntityValue(parser,
51651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    internalEncoding,
51661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    (char *)entity->textPtr,
51671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    (char *)(entity->textPtr
51681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             + entity->textLen));
51691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          entity->open = XML_FALSE;
51701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (result)
51711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            goto endEntityValue;
51721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
51731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
51741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
51751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
51761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* In the internal subset, PE references are not legal
51771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         within markup declarations, e.g entity values in this case. */
51781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      eventPtr = entityTextPtr;
51791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = XML_ERROR_PARAM_ENTITY_REF;
51801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto endEntityValue;
51811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_NONE:
51821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = XML_ERROR_NONE;
51831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto endEntityValue;
51841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_ENTITY_REF:
51851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_DATA_CHARS:
51861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!poolAppend(pool, enc, entityTextPtr, next)) {
51871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result = XML_ERROR_NO_MEMORY;
51881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        goto endEntityValue;
51891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
51901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
51911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_TRAILING_CR:
51921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      next = entityTextPtr + enc->minBytesPerChar;
51931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* fall through */
51941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_DATA_NEWLINE:
51951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (pool->end == pool->ptr && !poolGrow(pool)) {
51961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              result = XML_ERROR_NO_MEMORY;
51971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        goto endEntityValue;
51981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
51991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *(pool->ptr)++ = 0xA;
52001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
52011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_CHAR_REF:
52021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
52031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        XML_Char buf[XML_ENCODE_MAX];
52041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int i;
52051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int n = XmlCharRefNumber(enc, entityTextPtr);
52061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (n < 0) {
52071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (enc == encoding)
52081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            eventPtr = entityTextPtr;
52091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          result = XML_ERROR_BAD_CHAR_REF;
52101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          goto endEntityValue;
52111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
52121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        n = XmlEncode(n, (ICHAR *)buf);
52131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!n) {
52141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (enc == encoding)
52151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            eventPtr = entityTextPtr;
52161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          result = XML_ERROR_BAD_CHAR_REF;
52171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          goto endEntityValue;
52181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
52191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        for (i = 0; i < n; i++) {
52201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (pool->end == pool->ptr && !poolGrow(pool)) {
52211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            result = XML_ERROR_NO_MEMORY;
52221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            goto endEntityValue;
52231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
52241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *(pool->ptr)++ = buf[i];
52251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
52261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
52271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
52281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_PARTIAL:
52291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (enc == encoding)
52301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        eventPtr = entityTextPtr;
52311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = XML_ERROR_INVALID_TOKEN;
52321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto endEntityValue;
52331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case XML_TOK_INVALID:
52341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (enc == encoding)
52351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        eventPtr = next;
52361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = XML_ERROR_INVALID_TOKEN;
52371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto endEntityValue;
52381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
52391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (enc == encoding)
52401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        eventPtr = entityTextPtr;
52411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result = XML_ERROR_UNEXPECTED_STATE;
52421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      goto endEntityValue;
52431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
52441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    entityTextPtr = next;
52451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
52461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciendEntityValue:
52471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
52481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  prologState.inEntityValue = oldInEntityValue;
52491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
52501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return result;
52511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
52521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
52531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL
52541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccinormalizeLines(XML_Char *s)
52551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
52561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char *p;
52571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;; s++) {
52581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (*s == XML_T('\0'))
52591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
52601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (*s == 0xD)
52611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
52621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
52631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p = s;
52641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  do {
52651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (*s == 0xD) {
52661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *p++ = 0xA;
52671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (*++s == 0xA)
52681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        s++;
52691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
52701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else
52711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *p++ = *s++;
52721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } while (*s);
52731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *p = XML_T('\0');
52741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
52751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
52761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int
52771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccireportProcessingInstruction(XML_Parser parser, const ENCODING *enc,
52781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            const char *start, const char *end)
52791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
52801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *target;
52811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char *data;
52821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *tem;
52831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!processingInstructionHandler) {
52841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (defaultHandler)
52851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      reportDefault(parser, enc, start, end);
52861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 1;
52871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
52881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  start += enc->minBytesPerChar * 2;
52891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tem = start + XmlNameLength(enc, start);
52901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  target = poolStoreString(&tempPool, enc, start, tem);
52911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!target)
52921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 0;
52931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolFinish(&tempPool);
52941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  data = poolStoreString(&tempPool, enc,
52951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        XmlSkipS(enc, tem),
52961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        end - enc->minBytesPerChar*2);
52971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!data)
52981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 0;
52991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  normalizeLines(data);
53001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  processingInstructionHandler(handlerArg, target, data);
53011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolClear(&tempPool);
53021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return 1;
53031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
53041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
53051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int
53061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccireportComment(XML_Parser parser, const ENCODING *enc,
53071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              const char *start, const char *end)
53081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
53091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char *data;
53101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!commentHandler) {
53111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (defaultHandler)
53121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      reportDefault(parser, enc, start, end);
53131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 1;
53141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
53151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  data = poolStoreString(&tempPool,
53161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         enc,
53171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         start + enc->minBytesPerChar * 4,
53181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         end - enc->minBytesPerChar * 3);
53191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!data)
53201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 0;
53211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  normalizeLines(data);
53221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  commentHandler(handlerArg, data);
53231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolClear(&tempPool);
53241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return 1;
53251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
53261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
53271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void
53281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccireportDefault(XML_Parser parser, const ENCODING *enc,
53291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              const char *s, const char *end)
53301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
53311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (MUST_CONVERT(enc, s)) {
53321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char **eventPP;
53331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char **eventEndPP;
53341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (enc == encoding) {
53351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      eventPP = &eventPtr;
53361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      eventEndPP = &eventEndPtr;
53371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
53381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else {
53391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      eventPP = &(openInternalEntities->internalEventPtr);
53401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      eventEndPP = &(openInternalEntities->internalEventEndPtr);
53411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
53421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    do {
53431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ICHAR *dataPtr = (ICHAR *)dataBuf;
53441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);
53451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *eventEndPP = s;
53461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      defaultHandler(handlerArg, dataBuf, (int)(dataPtr - (ICHAR *)dataBuf));
53471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *eventPP = s;
53481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    } while (s != end);
53491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
53501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
53511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    defaultHandler(handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s));
53521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
53531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
53541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
53551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int
53561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidefineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata,
53571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                XML_Bool isId, const XML_Char *value, XML_Parser parser)
53581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
53591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DEFAULT_ATTRIBUTE *att;
53601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (value || isId) {
53611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* The handling of default attributes gets messed up if we have
53621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       a default which duplicates a non-default. */
53631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int i;
53641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (i = 0; i < type->nDefaultAtts; i++)
53651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (attId == type->defaultAtts[i].id)
53661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 1;
53671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (isId && !type->idAtt && !attId->xmlns)
53681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      type->idAtt = attId;
53691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
53701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (type->nDefaultAtts == type->allocDefaultAtts) {
53711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (type->allocDefaultAtts == 0) {
53721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      type->allocDefaultAtts = 8;
53731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts
53741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            * sizeof(DEFAULT_ATTRIBUTE));
53751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!type->defaultAtts)
53761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
53771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
53781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else {
53791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DEFAULT_ATTRIBUTE *temp;
53801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int count = type->allocDefaultAtts * 2;
53811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      temp = (DEFAULT_ATTRIBUTE *)
53821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE)));
53831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (temp == NULL)
53841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
53851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      type->allocDefaultAtts = count;
53861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      type->defaultAtts = temp;
53871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
53881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
53891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  att = type->defaultAtts + type->nDefaultAtts;
53901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  att->id = attId;
53911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  att->value = value;
53921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  att->isCdata = isCdata;
53931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!isCdata)
53941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    attId->maybeTokenized = XML_TRUE;
53951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  type->nDefaultAtts += 1;
53961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return 1;
53971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
53981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
53991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int
54001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccisetElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType)
54011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
54021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD * const dtd = _dtd;  /* save one level of indirection */
54031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *name;
54041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (name = elementType->name; *name; name++) {
54051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (*name == XML_T(ASCII_COLON)) {
54061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PREFIX *prefix;
54071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const XML_Char *s;
54081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      for (s = elementType->name; s != name; s++) {
54091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!poolAppendChar(&dtd->pool, *s))
54101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return 0;
54111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
54121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!poolAppendChar(&dtd->pool, XML_T('\0')))
54131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
54141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool),
54151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                sizeof(PREFIX));
54161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!prefix)
54171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
54181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (prefix->name == poolStart(&dtd->pool))
54191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolFinish(&dtd->pool);
54201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else
54211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolDiscard(&dtd->pool);
54221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      elementType->prefix = prefix;
54231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
54241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
54251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
54261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return 1;
54271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
54281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
54291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic ATTRIBUTE_ID *
54301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccigetAttributeId(XML_Parser parser, const ENCODING *enc,
54311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char *start, const char *end)
54321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
54331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD * const dtd = _dtd;  /* save one level of indirection */
54341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ATTRIBUTE_ID *id;
54351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *name;
54361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!poolAppendChar(&dtd->pool, XML_T('\0')))
54371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
54381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  name = poolStoreString(&dtd->pool, enc, start, end);
54391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!name)
54401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
54411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* skip quotation mark - its storage will be re-used (like in name[-1]) */
54421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ++name;
54431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, sizeof(ATTRIBUTE_ID));
54441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!id)
54451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
54461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (id->name != name)
54471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    poolDiscard(&dtd->pool);
54481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
54491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    poolFinish(&dtd->pool);
54501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!ns)
54511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ;
54521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else if (name[0] == XML_T(ASCII_x)
54531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        && name[1] == XML_T(ASCII_m)
54541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        && name[2] == XML_T(ASCII_l)
54551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        && name[3] == XML_T(ASCII_n)
54561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        && name[4] == XML_T(ASCII_s)
54571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) {
54581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (name[5] == XML_T('\0'))
54591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        id->prefix = &dtd->defaultPrefix;
54601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else
54611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, sizeof(PREFIX));
54621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      id->xmlns = XML_TRUE;
54631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
54641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else {
54651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int i;
54661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      for (i = 0; name[i]; i++) {
54671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* attributes without prefix are *not* in the default namespace */
54681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (name[i] == XML_T(ASCII_COLON)) {
54691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          int j;
54701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          for (j = 0; j < i; j++) {
54711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (!poolAppendChar(&dtd->pool, name[j]))
54721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              return NULL;
54731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
54741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!poolAppendChar(&dtd->pool, XML_T('\0')))
54751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return NULL;
54761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool),
54771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        sizeof(PREFIX));
54781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (id->prefix->name == poolStart(&dtd->pool))
54791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            poolFinish(&dtd->pool);
54801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          else
54811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            poolDiscard(&dtd->pool);
54821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
54831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
54841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
54851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
54861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
54871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return id;
54881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
54891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
54901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CONTEXT_SEP XML_T(ASCII_FF)
54911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
54921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char *
54931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccigetContext(XML_Parser parser)
54941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
54951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD * const dtd = _dtd;  /* save one level of indirection */
54961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HASH_TABLE_ITER iter;
54971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Bool needSep = XML_FALSE;
54981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
54991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (dtd->defaultPrefix.binding) {
55001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int i;
55011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int len;
55021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS)))
55031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return NULL;
55041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    len = dtd->defaultPrefix.binding->uriLen;
55051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (namespaceSeparator)
55061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      len--;
55071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (i = 0; i < len; i++)
55081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i]))
55091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return NULL;
55101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    needSep = XML_TRUE;
55111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
55121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
55131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableIterInit(&iter, &(dtd->prefixes));
55141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
55151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int i;
55161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int len;
55171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const XML_Char *s;
55181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter);
55191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!prefix)
55201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
55211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!prefix->binding)
55221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      continue;
55231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP))
55241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return NULL;
55251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (s = prefix->name; *s; s++)
55261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!poolAppendChar(&tempPool, *s))
55271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return NULL;
55281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS)))
55291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return NULL;
55301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    len = prefix->binding->uriLen;
55311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (namespaceSeparator)
55321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      len--;
55331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (i = 0; i < len; i++)
55341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!poolAppendChar(&tempPool, prefix->binding->uri[i]))
55351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return NULL;
55361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    needSep = XML_TRUE;
55371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
55381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
55391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
55401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableIterInit(&iter, &(dtd->generalEntities));
55411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
55421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const XML_Char *s;
55431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ENTITY *e = (ENTITY *)hashTableIterNext(&iter);
55441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!e)
55451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
55461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!e->open)
55471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      continue;
55481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP))
55491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return NULL;
55501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (s = e->name; *s; s++)
55511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!poolAppendChar(&tempPool, *s))
55521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
55531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    needSep = XML_TRUE;
55541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
55551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
55561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!poolAppendChar(&tempPool, XML_T('\0')))
55571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
55581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return tempPool.start;
55591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
55601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
55611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool
55621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccisetContext(XML_Parser parser, const XML_Char *context)
55631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
55641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD * const dtd = _dtd;  /* save one level of indirection */
55651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *s = context;
55661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
55671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (*context != XML_T('\0')) {
55681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (*s == CONTEXT_SEP || *s == XML_T('\0')) {
55691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ENTITY *e;
55701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!poolAppendChar(&tempPool, XML_T('\0')))
55711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_FALSE;
55721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&tempPool), 0);
55731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (e)
55741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        e->open = XML_TRUE;
55751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (*s != XML_T('\0'))
55761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        s++;
55771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      context = s;
55781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      poolDiscard(&tempPool);
55791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
55801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else if (*s == XML_T(ASCII_EQUALS)) {
55811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PREFIX *prefix;
55821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (poolLength(&tempPool) == 0)
55831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        prefix = &dtd->defaultPrefix;
55841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else {
55851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!poolAppendChar(&tempPool, XML_T('\0')))
55861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_FALSE;
55871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&tempPool),
55881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  sizeof(PREFIX));
55891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!prefix)
55901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_FALSE;
55911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (prefix->name == poolStart(&tempPool)) {
55921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          prefix->name = poolCopyString(&dtd->pool, prefix->name);
55931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!prefix->name)
55941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_FALSE;
55951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
55961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        poolDiscard(&tempPool);
55971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
55981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      for (context = s + 1;
55991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           *context != CONTEXT_SEP && *context != XML_T('\0');
56001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           context++)
56011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!poolAppendChar(&tempPool, *context))
56021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_FALSE;
56031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!poolAppendChar(&tempPool, XML_T('\0')))
56041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_FALSE;
56051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (addBinding(parser, prefix, NULL, poolStart(&tempPool),
56061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     &inheritedBindings) != XML_ERROR_NONE)
56071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_FALSE;
56081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      poolDiscard(&tempPool);
56091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (*context != XML_T('\0'))
56101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ++context;
56111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      s = context;
56121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
56131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else {
56141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!poolAppendChar(&tempPool, *s))
56151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_FALSE;
56161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      s++;
56171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
56181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
56191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TRUE;
56201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
56211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
56221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL
56231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccinormalizePublicId(XML_Char *publicId)
56241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
56251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char *p = publicId;
56261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char *s;
56271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (s = publicId; *s; s++) {
56281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (*s) {
56291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case 0x20:
56301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case 0xD:
56311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case 0xA:
56321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (p != publicId && p[-1] != 0x20)
56331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *p++ = 0x20;
56341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
56351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
56361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *p++ = *s;
56371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
56381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
56391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (p != publicId && p[-1] == 0x20)
56401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    --p;
56411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *p = XML_T('\0');
56421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
56431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
56441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic DTD *
56451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidtdCreate(const XML_Memory_Handling_Suite *ms)
56461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
56471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD));
56481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (p == NULL)
56491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return p;
56501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolInit(&(p->pool), ms);
56511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolInit(&(p->entityValuePool), ms);
56521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableInit(&(p->generalEntities), ms);
56531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableInit(&(p->elementTypes), ms);
56541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableInit(&(p->attributeIds), ms);
56551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableInit(&(p->prefixes), ms);
56561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
56571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->paramEntityRead = XML_FALSE;
56581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableInit(&(p->paramEntities), ms);
56591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
56601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->defaultPrefix.name = NULL;
56611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->defaultPrefix.binding = NULL;
56621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
56631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->in_eldecl = XML_FALSE;
56641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->scaffIndex = NULL;
56651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->scaffold = NULL;
56661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->scaffLevel = 0;
56671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->scaffSize = 0;
56681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->scaffCount = 0;
56691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->contentStringLen = 0;
56701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
56711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->keepProcessing = XML_TRUE;
56721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->hasParamEntityRefs = XML_FALSE;
56731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->standalone = XML_FALSE;
56741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return p;
56751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
56761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
56771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void
56781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidtdReset(DTD *p, const XML_Memory_Handling_Suite *ms)
56791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
56801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HASH_TABLE_ITER iter;
56811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableIterInit(&iter, &(p->elementTypes));
56821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
56831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);
56841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!e)
56851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
56861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (e->allocDefaultAtts != 0)
56871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ms->free_fcn(e->defaultAtts);
56881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
56891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableClear(&(p->generalEntities));
56901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
56911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->paramEntityRead = XML_FALSE;
56921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableClear(&(p->paramEntities));
56931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
56941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableClear(&(p->elementTypes));
56951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableClear(&(p->attributeIds));
56961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableClear(&(p->prefixes));
56971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolClear(&(p->pool));
56981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolClear(&(p->entityValuePool));
56991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->defaultPrefix.name = NULL;
57001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->defaultPrefix.binding = NULL;
57011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
57021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->in_eldecl = XML_FALSE;
57031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
57041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ms->free_fcn(p->scaffIndex);
57051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->scaffIndex = NULL;
57061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ms->free_fcn(p->scaffold);
57071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->scaffold = NULL;
57081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
57091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->scaffLevel = 0;
57101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->scaffSize = 0;
57111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->scaffCount = 0;
57121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->contentStringLen = 0;
57131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
57141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->keepProcessing = XML_TRUE;
57151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->hasParamEntityRefs = XML_FALSE;
57161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->standalone = XML_FALSE;
57171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
57181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
57191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void
57201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms)
57211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
57221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HASH_TABLE_ITER iter;
57231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableIterInit(&iter, &(p->elementTypes));
57241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
57251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);
57261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!e)
57271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
57281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (e->allocDefaultAtts != 0)
57291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ms->free_fcn(e->defaultAtts);
57301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
57311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableDestroy(&(p->generalEntities));
57321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
57331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableDestroy(&(p->paramEntities));
57341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
57351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableDestroy(&(p->elementTypes));
57361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableDestroy(&(p->attributeIds));
57371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableDestroy(&(p->prefixes));
57381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolDestroy(&(p->pool));
57391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolDestroy(&(p->entityValuePool));
57401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (isDocEntity) {
57411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ms->free_fcn(p->scaffIndex);
57421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ms->free_fcn(p->scaffold);
57431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
57441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ms->free_fcn(p);
57451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
57461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
57471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise.
57481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   The new DTD has already been initialized.
57491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/
57501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int
57511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
57521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
57531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HASH_TABLE_ITER iter;
57541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
57551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* Copy the prefix table. */
57561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
57571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableIterInit(&iter, &(oldDtd->prefixes));
57581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
57591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const XML_Char *name;
57601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter);
57611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!oldP)
57621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
57631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    name = poolCopyString(&(newDtd->pool), oldP->name);
57641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!name)
57651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0;
57661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX)))
57671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0;
57681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
57691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
57701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableIterInit(&iter, &(oldDtd->attributeIds));
57711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
57721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* Copy the attribute id table. */
57731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
57741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
57751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ATTRIBUTE_ID *newA;
57761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const XML_Char *name;
57771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter);
57781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
57791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!oldA)
57801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
57811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* Remember to allocate the scratch byte before the name. */
57821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!poolAppendChar(&(newDtd->pool), XML_T('\0')))
57831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0;
57841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    name = poolCopyString(&(newDtd->pool), oldA->name);
57851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!name)
57861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0;
57871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ++name;
57881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    newA = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), name,
57891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  sizeof(ATTRIBUTE_ID));
57901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!newA)
57911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0;
57921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    newA->maybeTokenized = oldA->maybeTokenized;
57931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (oldA->prefix) {
57941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      newA->xmlns = oldA->xmlns;
57951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (oldA->prefix == &oldDtd->defaultPrefix)
57961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        newA->prefix = &newDtd->defaultPrefix;
57971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else
57981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        newA->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes),
57991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        oldA->prefix->name, 0);
58001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
58011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
58021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
58031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* Copy the element type table. */
58041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
58051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableIterInit(&iter, &(oldDtd->elementTypes));
58061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
58071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
58081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int i;
58091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ELEMENT_TYPE *newE;
58101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const XML_Char *name;
58111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter);
58121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!oldE)
58131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
58141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    name = poolCopyString(&(newDtd->pool), oldE->name);
58151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!name)
58161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0;
58171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    newE = (ELEMENT_TYPE *)lookup(oldParser, &(newDtd->elementTypes), name,
58181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  sizeof(ELEMENT_TYPE));
58191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!newE)
58201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0;
58211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (oldE->nDefaultAtts) {
58221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      newE->defaultAtts = (DEFAULT_ATTRIBUTE *)
58231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));
58241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!newE->defaultAtts) {
58251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ms->free_fcn(newE);
58261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
58271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
58281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
58291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (oldE->idAtt)
58301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      newE->idAtt = (ATTRIBUTE_ID *)
58311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          lookup(oldParser, &(newDtd->attributeIds), oldE->idAtt->name, 0);
58321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts;
58331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (oldE->prefix)
58341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes),
58351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      oldE->prefix->name, 0);
58361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (i = 0; i < newE->nDefaultAtts; i++) {
58371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      newE->defaultAtts[i].id = (ATTRIBUTE_ID *)
58381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          lookup(oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0);
58391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata;
58401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (oldE->defaultAtts[i].value) {
58411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        newE->defaultAtts[i].value
58421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value);
58431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!newE->defaultAtts[i].value)
58441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return 0;
58451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
58461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else
58471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        newE->defaultAtts[i].value = NULL;
58481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
58491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
58501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
58511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* Copy the entity tables. */
58521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!copyEntityTable(oldParser,
58531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       &(newDtd->generalEntities),
58541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       &(newDtd->pool),
58551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       &(oldDtd->generalEntities)))
58561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0;
58571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
58581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
58591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!copyEntityTable(oldParser,
58601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       &(newDtd->paramEntities),
58611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       &(newDtd->pool),
58621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       &(oldDtd->paramEntities)))
58631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0;
58641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  newDtd->paramEntityRead = oldDtd->paramEntityRead;
58651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
58661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
58671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  newDtd->keepProcessing = oldDtd->keepProcessing;
58681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs;
58691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  newDtd->standalone = oldDtd->standalone;
58701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
58711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* Don't want deep copying for scaffolding */
58721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  newDtd->in_eldecl = oldDtd->in_eldecl;
58731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  newDtd->scaffold = oldDtd->scaffold;
58741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  newDtd->contentStringLen = oldDtd->contentStringLen;
58751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  newDtd->scaffSize = oldDtd->scaffSize;
58761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  newDtd->scaffLevel = oldDtd->scaffLevel;
58771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  newDtd->scaffIndex = oldDtd->scaffIndex;
58781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
58791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return 1;
58801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  /* End dtdCopy */
58811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
58821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int
58831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccicopyEntityTable(XML_Parser oldParser,
58841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                HASH_TABLE *newTable,
58851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                STRING_POOL *newPool,
58861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const HASH_TABLE *oldTable)
58871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
58881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HASH_TABLE_ITER iter;
58891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *cachedOldBase = NULL;
58901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *cachedNewBase = NULL;
58911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
58921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hashTableIterInit(&iter, oldTable);
58931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
58941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
58951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ENTITY *newE;
58961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const XML_Char *name;
58971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter);
58981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!oldE)
58991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
59001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    name = poolCopyString(newPool, oldE->name);
59011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!name)
59021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0;
59031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    newE = (ENTITY *)lookup(oldParser, newTable, name, sizeof(ENTITY));
59041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!newE)
59051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0;
59061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (oldE->systemId) {
59071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const XML_Char *tem = poolCopyString(newPool, oldE->systemId);
59081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!tem)
59091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
59101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      newE->systemId = tem;
59111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (oldE->base) {
59121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (oldE->base == cachedOldBase)
59131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          newE->base = cachedNewBase;
59141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else {
59151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          cachedOldBase = oldE->base;
59161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          tem = poolCopyString(newPool, cachedOldBase);
59171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!tem)
59181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return 0;
59191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          cachedNewBase = newE->base = tem;
59201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
59211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
59221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (oldE->publicId) {
59231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tem = poolCopyString(newPool, oldE->publicId);
59241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!tem)
59251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return 0;
59261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        newE->publicId = tem;
59271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
59281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
59291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else {
59301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr,
59311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            oldE->textLen);
59321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!tem)
59331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
59341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      newE->textPtr = tem;
59351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      newE->textLen = oldE->textLen;
59361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
59371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (oldE->notation) {
59381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const XML_Char *tem = poolCopyString(newPool, oldE->notation);
59391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!tem)
59401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
59411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      newE->notation = tem;
59421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
59431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    newE->is_param = oldE->is_param;
59441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    newE->is_internal = oldE->is_internal;
59451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
59461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return 1;
59471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
59481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
59491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_POWER 6
59501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
59511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool FASTCALL
59521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccikeyeq(KEY s1, KEY s2)
59531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
59541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (; *s1 == *s2; s1++, s2++)
59551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (*s1 == 0)
59561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TRUE;
59571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_FALSE;
59581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
59591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
59601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic unsigned long FASTCALL
59611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccihash(XML_Parser parser, KEY s)
59621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
59631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unsigned long h = hash_secret_salt;
59641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (*s)
59651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    h = CHAR_HASH(h, *s++);
59661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return h;
59671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
59681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
59691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic NAMED *
59701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccilookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize)
59711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
59721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t i;
59731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (table->size == 0) {
59741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    size_t tsize;
59751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!createSize)
59761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return NULL;
59771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    table->power = INIT_POWER;
59781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* table->size is a power of 2 */
59791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    table->size = (size_t)1 << INIT_POWER;
59801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tsize = table->size * sizeof(NAMED *);
59811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    table->v = (NAMED **)table->mem->malloc_fcn(tsize);
59821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!table->v) {
59831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      table->size = 0;
59841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return NULL;
59851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
59861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    memset(table->v, 0, tsize);
59871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    i = hash(parser, name) & ((unsigned long)table->size - 1);
59881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
59891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
59901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    unsigned long h = hash(parser, name);
59911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    unsigned long mask = (unsigned long)table->size - 1;
59921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    unsigned char step = 0;
59931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    i = h & mask;
59941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    while (table->v[i]) {
59951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (keyeq(name, table->v[i]->name))
59961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return table->v[i];
59971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!step)
59981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        step = PROBE_STEP(h, mask, table->power);
59991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      i < step ? (i += table->size - step) : (i -= step);
60001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
60011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!createSize)
60021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return NULL;
60031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
60041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* check for overflow (table is half full) */
60051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (table->used >> (table->power - 1)) {
60061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      unsigned char newPower = table->power + 1;
60071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      size_t newSize = (size_t)1 << newPower;
60081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      unsigned long newMask = (unsigned long)newSize - 1;
60091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      size_t tsize = newSize * sizeof(NAMED *);
60101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize);
60111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!newV)
60121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return NULL;
60131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      memset(newV, 0, tsize);
60141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      for (i = 0; i < table->size; i++)
60151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (table->v[i]) {
60161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          unsigned long newHash = hash(parser, table->v[i]->name);
60171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          size_t j = newHash & newMask;
60181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          step = 0;
60191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          while (newV[j]) {
60201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (!step)
60211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              step = PROBE_STEP(newHash, newMask, newPower);
60221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            j < step ? (j += newSize - step) : (j -= step);
60231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
60241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          newV[j] = table->v[i];
60251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
60261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      table->mem->free_fcn(table->v);
60271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      table->v = newV;
60281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      table->power = newPower;
60291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      table->size = newSize;
60301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      i = h & newMask;
60311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      step = 0;
60321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      while (table->v[i]) {
60331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (!step)
60341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          step = PROBE_STEP(h, newMask, newPower);
60351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        i < step ? (i += newSize - step) : (i -= step);
60361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
60371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
60381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
60391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize);
60401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!table->v[i])
60411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
60421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  memset(table->v[i], 0, createSize);
60431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  table->v[i]->name = name;
60441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (table->used)++;
60451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return table->v[i];
60461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
60471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
60481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL
60491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihashTableClear(HASH_TABLE *table)
60501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
60511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t i;
60521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (i = 0; i < table->size; i++) {
60531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    table->mem->free_fcn(table->v[i]);
60541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    table->v[i] = NULL;
60551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
60561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  table->used = 0;
60571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
60581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
60591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL
60601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihashTableDestroy(HASH_TABLE *table)
60611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
60621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t i;
60631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (i = 0; i < table->size; i++)
60641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    table->mem->free_fcn(table->v[i]);
60651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  table->mem->free_fcn(table->v);
60661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
60671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
60681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL
60691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms)
60701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
60711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->power = 0;
60721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->size = 0;
60731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->used = 0;
60741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->v = NULL;
60751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p->mem = ms;
60761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
60771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
60781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL
60791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table)
60801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
60811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  iter->p = table->v;
60821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  iter->end = iter->p + table->size;
60831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
60841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
60851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic NAMED * FASTCALL
60861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihashTableIterNext(HASH_TABLE_ITER *iter)
60871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
60881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (iter->p != iter->end) {
60891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NAMED *tem = *(iter->p)++;
60901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (tem)
60911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return tem;
60921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
60931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return NULL;
60941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
60951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
60961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL
60971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms)
60981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
60991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pool->blocks = NULL;
61001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pool->freeBlocks = NULL;
61011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pool->start = NULL;
61021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pool->ptr = NULL;
61031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pool->end = NULL;
61041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pool->mem = ms;
61051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
61061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
61071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL
61081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolClear(STRING_POOL *pool)
61091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
61101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!pool->freeBlocks)
61111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pool->freeBlocks = pool->blocks;
61121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
61131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BLOCK *p = pool->blocks;
61141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    while (p) {
61151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      BLOCK *tem = p->next;
61161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      p->next = pool->freeBlocks;
61171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pool->freeBlocks = p;
61181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      p = tem;
61191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
61201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
61211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pool->blocks = NULL;
61221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pool->start = NULL;
61231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pool->ptr = NULL;
61241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pool->end = NULL;
61251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
61261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
61271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL
61281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolDestroy(STRING_POOL *pool)
61291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
61301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BLOCK *p = pool->blocks;
61311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (p) {
61321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BLOCK *tem = p->next;
61331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pool->mem->free_fcn(p);
61341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    p = tem;
61351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
61361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  p = pool->freeBlocks;
61371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (p) {
61381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BLOCK *tem = p->next;
61391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pool->mem->free_fcn(p);
61401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    p = tem;
61411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
61421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
61431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
61441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Char *
61451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolAppend(STRING_POOL *pool, const ENCODING *enc,
61461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           const char *ptr, const char *end)
61471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
61481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!pool->ptr && !poolGrow(pool))
61491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
61501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
61511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end);
61521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ptr == end)
61531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
61541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!poolGrow(pool))
61551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return NULL;
61561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
61571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return pool->start;
61581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
61591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
61601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char * FASTCALL
61611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolCopyString(STRING_POOL *pool, const XML_Char *s)
61621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
61631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  do {
61641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!poolAppendChar(pool, *s))
61651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return NULL;
61661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } while (*s++);
61671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  s = pool->start;
61681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolFinish(pool);
61691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return s;
61701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
61711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
61721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char *
61731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n)
61741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
61751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!pool->ptr && !poolGrow(pool))
61761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
61771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (; n > 0; --n, s++) {
61781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!poolAppendChar(pool, *s))
61791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return NULL;
61801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
61811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  s = pool->start;
61821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  poolFinish(pool);
61831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return s;
61841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
61851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
61861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char * FASTCALL
61871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolAppendString(STRING_POOL *pool, const XML_Char *s)
61881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
61891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (*s) {
61901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!poolAppendChar(pool, *s))
61911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return NULL;
61921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    s++;
61931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
61941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return pool->start;
61951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
61961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
61971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Char *
61981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolStoreString(STRING_POOL *pool, const ENCODING *enc,
61991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char *ptr, const char *end)
62001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
62011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!poolAppend(pool, enc, ptr, end))
62021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
62031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (pool->ptr == pool->end && !poolGrow(pool))
62041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
62051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *(pool->ptr)++ = 0;
62061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return pool->start;
62071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
62081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
62091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool FASTCALL
62101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolGrow(STRING_POOL *pool)
62111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
62121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (pool->freeBlocks) {
62131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (pool->start == 0) {
62141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pool->blocks = pool->freeBlocks;
62151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pool->freeBlocks = pool->freeBlocks->next;
62161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pool->blocks->next = NULL;
62171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pool->start = pool->blocks->s;
62181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pool->end = pool->start + pool->blocks->size;
62191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pool->ptr = pool->start;
62201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TRUE;
62211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
62221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (pool->end - pool->start < pool->freeBlocks->size) {
62231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      BLOCK *tem = pool->freeBlocks->next;
62241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pool->freeBlocks->next = pool->blocks;
62251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pool->blocks = pool->freeBlocks;
62261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pool->freeBlocks = tem;
62271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      memcpy(pool->blocks->s, pool->start,
62281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             (pool->end - pool->start) * sizeof(XML_Char));
62291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pool->ptr = pool->blocks->s + (pool->ptr - pool->start);
62301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pool->start = pool->blocks->s;
62311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pool->end = pool->start + pool->blocks->size;
62321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TRUE;
62331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
62341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
62351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (pool->blocks && pool->start == pool->blocks->s) {
62361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int blockSize = (int)(pool->end - pool->start)*2;
62371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BLOCK *temp = (BLOCK *)
62381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pool->mem->realloc_fcn(pool->blocks,
62391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             (offsetof(BLOCK, s)
62401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              + blockSize * sizeof(XML_Char)));
62411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (temp == NULL)
62421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_FALSE;
62431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pool->blocks = temp;
62441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pool->blocks->size = blockSize;
62451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pool->ptr = pool->blocks->s + (pool->ptr - pool->start);
62461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pool->start = pool->blocks->s;
62471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pool->end = pool->start + blockSize;
62481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
62491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
62501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BLOCK *tem;
62511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int blockSize = (int)(pool->end - pool->start);
62521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (blockSize < INIT_BLOCK_SIZE)
62531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      blockSize = INIT_BLOCK_SIZE;
62541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else
62551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      blockSize *= 2;
62561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s)
62571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        + blockSize * sizeof(XML_Char));
62581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!tem)
62591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_FALSE;
62601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tem->size = blockSize;
62611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tem->next = pool->blocks;
62621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pool->blocks = tem;
62631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (pool->ptr != pool->start)
62641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      memcpy(tem->s, pool->start,
62651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             (pool->ptr - pool->start) * sizeof(XML_Char));
62661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pool->ptr = tem->s + (pool->ptr - pool->start);
62671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pool->start = tem->s;
62681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pool->end = tem->s + blockSize;
62691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
62701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TRUE;
62711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
62721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
62731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int FASTCALL
62741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccinextScaffoldPart(XML_Parser parser)
62751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
62761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD * const dtd = _dtd;  /* save one level of indirection */
62771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CONTENT_SCAFFOLD * me;
62781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int next;
62791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
62801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!dtd->scaffIndex) {
62811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int));
62821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!dtd->scaffIndex)
62831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return -1;
62841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dtd->scaffIndex[0] = 0;
62851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
62861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
62871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (dtd->scaffCount >= dtd->scaffSize) {
62881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CONTENT_SCAFFOLD *temp;
62891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (dtd->scaffold) {
62901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      temp = (CONTENT_SCAFFOLD *)
62911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD));
62921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (temp == NULL)
62931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return -1;
62941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      dtd->scaffSize *= 2;
62951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
62961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else {
62971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS
62981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        * sizeof(CONTENT_SCAFFOLD));
62991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (temp == NULL)
63001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return -1;
63011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS;
63021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
63031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dtd->scaffold = temp;
63041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
63051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  next = dtd->scaffCount++;
63061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  me = &dtd->scaffold[next];
63071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (dtd->scaffLevel) {
63081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]];
63091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (parent->lastchild) {
63101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      dtd->scaffold[parent->lastchild].nextsib = next;
63111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
63121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!parent->childcnt)
63131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      parent->firstchild = next;
63141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    parent->lastchild = next;
63151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    parent->childcnt++;
63161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
63171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0;
63181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return next;
63191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
63201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
63211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void
63221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibuild_node(XML_Parser parser,
63231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           int src_node,
63241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           XML_Content *dest,
63251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           XML_Content **contpos,
63261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           XML_Char **strpos)
63271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
63281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD * const dtd = _dtd;  /* save one level of indirection */
63291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dest->type = dtd->scaffold[src_node].type;
63301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dest->quant = dtd->scaffold[src_node].quant;
63311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (dest->type == XML_CTYPE_NAME) {
63321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const XML_Char *src;
63331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dest->name = *strpos;
63341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    src = dtd->scaffold[src_node].name;
63351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (;;) {
63361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *(*strpos)++ = *src;
63371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!*src)
63381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
63391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      src++;
63401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
63411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dest->numchildren = 0;
63421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dest->children = NULL;
63431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
63441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
63451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    unsigned int i;
63461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int cn;
63471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dest->numchildren = dtd->scaffold[src_node].childcnt;
63481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dest->children = *contpos;
63491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *contpos += dest->numchildren;
63501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (i = 0, cn = dtd->scaffold[src_node].firstchild;
63511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         i < dest->numchildren;
63521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         i++, cn = dtd->scaffold[cn].nextsib) {
63531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      build_node(parser, cn, &(dest->children[i]), contpos, strpos);
63541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
63551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dest->name = NULL;
63561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
63571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
63581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
63591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Content *
63601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibuild_model (XML_Parser parser)
63611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
63621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD * const dtd = _dtd;  /* save one level of indirection */
63631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Content *ret;
63641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Content *cpos;
63651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  XML_Char * str;
63661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int allocsize = (dtd->scaffCount * sizeof(XML_Content)
63671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   + (dtd->contentStringLen * sizeof(XML_Char)));
63681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
63691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ret = (XML_Content *)MALLOC(allocsize);
63701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!ret)
63711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
63721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
63731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  str =  (XML_Char *) (&ret[dtd->scaffCount]);
63741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cpos = &ret[1];
63751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
63761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  build_node(parser, 0, ret, &cpos, &str);
63771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return ret;
63781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
63791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
63801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic ELEMENT_TYPE *
63811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccigetElementType(XML_Parser parser,
63821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const ENCODING *enc,
63831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char *ptr,
63841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char *end)
63851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
63861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DTD * const dtd = _dtd;  /* save one level of indirection */
63871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end);
63881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ELEMENT_TYPE *ret;
63891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
63901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!name)
63911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
63921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ret = (ELEMENT_TYPE *) lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE));
63931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!ret)
63941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
63951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ret->name != name)
63961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    poolDiscard(&dtd->pool);
63971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
63981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    poolFinish(&dtd->pool);
63991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!setElementTypePrefix(parser, ret))
64001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return NULL;
64011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
64021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return ret;
64031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6404