xmlparse.c revision fc03a94aaccc9ae606ee3438ca21d65a335d43e9
1fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
2fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   See the file COPYING for copying permission.
31dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis*/
41dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* Added to look for memcpy */
6fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include <Python.h>
7fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
8fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include <stddef.h>
9fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include <string.h>                     /* memset(), memcpy() */
10fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef COMPILED_FROM_DSP
12fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
13fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include "winconfig.h"
14fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define XMLPARSEAPI(type) type __cdecl
15fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include "expat.h"
16fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#undef XMLPARSEAPI
17fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
18fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#elif defined(MACOS_CLASSIC)
19fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
20fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include "macconfig.h"
21fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include "expat.h"
22fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else
24fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
25fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* Unused - MvL
26fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include <expat_config.h>
27fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/
281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef __declspec
30fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define XMLPARSEAPI(type) type __cdecl
311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif
321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#include "expat.h"
341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef __declspec
36fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#undef XMLPARSEAPI
371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif
381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* ndef COMPILED_FROM_DSP */
391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_UNICODE
411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX
421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlConvert XmlUtf16Convert
431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding
441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS
451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlEncode XmlUtf16Encode
461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1))
471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef unsigned short ICHAR;
481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else
491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX
501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlConvert XmlUtf8Convert
511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding
521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS
531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlEncode XmlUtf8Encode
541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define MUST_CONVERT(enc, s) (!(enc)->isUtf8)
551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef char ICHAR;
561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif
571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifndef XML_NS
601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlInitEncodingNS XmlInitEncoding
621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding
631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#undef XmlGetInternalEncodingNS
641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlGetInternalEncodingNS XmlGetInternalEncoding
651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlParseXmlDeclNS XmlParseXmlDecl
661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif
681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
69fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_UNICODE
70fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_UNICODE_WCHAR_T
72fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define XML_T(x) (const wchar_t)x
73fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define XML_L(x) L ## x
74fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#else
75fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define XML_T(x) (const unsigned short)x
76fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define XML_L(x) x
77fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif
78fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else
80fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XML_T(x) x
82fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define XML_L(x) x
83fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif
851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis/* Round up n to be a multiple of sz, where sz is a power of 2. */
871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1))
881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
89fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* Handle the case where memmove() doesn't exist. */
90fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifndef HAVE_MEMMOVE
91fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef HAVE_BCOPY
92fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define memmove(d,s,l) bcopy((s),(d),(l))
93fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#else
94fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#error memmove does not exist on this platform, nor is a substitute available
95fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* HAVE_BCOPY */
96fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* HAVE_MEMMOVE */
97fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
98fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include "internal.h"
991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#include "xmltok.h"
1001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#include "xmlrole.h"
1011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef const XML_Char *KEY;
1031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct {
1051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  KEY name;
1061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} NAMED;
1071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct {
1091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  NAMED **v;
1101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  size_t size;
1111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  size_t used;
1121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  size_t usedLim;
113fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const XML_Memory_Handling_Suite *mem;
1141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} HASH_TABLE;
1151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct {
1171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  NAMED **p;
1181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  NAMED **end;
1191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} HASH_TABLE_ITER;
1201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define INIT_TAG_BUF_SIZE 32  /* must be a multiple of sizeof(XML_Char) */
1221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define INIT_DATA_BUF_SIZE 1024
1231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define INIT_ATTS_SIZE 16
1241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define INIT_BLOCK_SIZE 1024
1251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define INIT_BUFFER_SIZE 1024
1261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define EXPAND_SPARE 24
1281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct binding {
1301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  struct prefix *prefix;
1311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  struct binding *nextTagBinding;
1321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  struct binding *prevPrefixBinding;
1331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const struct attribute_id *attId;
1341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Char *uri;
1351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int uriLen;
1361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int uriAlloc;
1371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} BINDING;
1381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct prefix {
1401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *name;
1411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  BINDING *binding;
1421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} PREFIX;
1431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct {
1451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *str;
1461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *localPart;
147fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const XML_Char *prefix;
148fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  int strLen;
1491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int uriLen;
150fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  int prefixLen;
1511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} TAG_NAME;
1521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
153fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* TAG represents an open element.
154fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   The name of the element is stored in both the document and API
155fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   encodings.  The memory buffer 'buf' is a separately-allocated
156fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   memory area which stores the name.  During the XML_Parse()/
157fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   XMLParseBuffer() when the element is open, the memory for the 'raw'
158fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   version of the name (in the document encoding) is shared with the
159fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   document buffer.  If the element is open across calls to
160fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to
161fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   contain the 'raw' name as well.
162fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
163fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   A parser re-uses these structures, maintaining a list of allocated
164fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   TAG objects in a free list.
165fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/
1661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct tag {
167fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  struct tag *parent;           /* parent of this element */
168fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const char *rawName;          /* tagName in the original encoding */
1691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int rawNameLength;
170fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  TAG_NAME name;                /* tagName in the API encoding */
171fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  char *buf;                    /* buffer for name components */
172fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  char *bufEnd;                 /* end of the buffer */
1731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  BINDING *bindings;
1741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} TAG;
1751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct {
1771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *name;
1781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *textPtr;
1791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int textLen;
1801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *systemId;
1811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *base;
1821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *publicId;
1831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *notation;
184fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool open;
185fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool is_param;
186fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool is_internal; /* true if declared in internal subset outside PE */
1871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} ENTITY;
1881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct {
190fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  enum XML_Content_Type         type;
191fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  enum XML_Content_Quant        quant;
192fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const XML_Char *              name;
193fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  int                           firstchild;
194fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  int                           lastchild;
195fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  int                           childcnt;
196fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  int                           nextsib;
1971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} CONTENT_SCAFFOLD;
1981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
199fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define INIT_SCAFFOLD_ELEMENTS 32
200fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
2011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct block {
2021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  struct block *next;
2031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int size;
2041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Char s[1];
2051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} BLOCK;
2061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
2071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct {
2081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  BLOCK *blocks;
2091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  BLOCK *freeBlocks;
2101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *end;
2111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Char *ptr;
2121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Char *start;
213fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const XML_Memory_Handling_Suite *mem;
2141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} STRING_POOL;
2151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
2161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis/* The XML_Char before the name is used to determine whether
217fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   an attribute has been specified. */
2181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct attribute_id {
2191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Char *name;
2201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  PREFIX *prefix;
221fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool maybeTokenized;
222fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool xmlns;
2231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} ATTRIBUTE_ID;
2241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
2251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct {
2261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const ATTRIBUTE_ID *id;
227fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool isCdata;
2281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *value;
2291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} DEFAULT_ATTRIBUTE;
2301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
2311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct {
2321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *name;
2331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  PREFIX *prefix;
2341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const ATTRIBUTE_ID *idAtt;
2351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int nDefaultAtts;
2361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int allocDefaultAtts;
2371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  DEFAULT_ATTRIBUTE *defaultAtts;
2381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} ELEMENT_TYPE;
2391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
2401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct {
2411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  HASH_TABLE generalEntities;
2421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  HASH_TABLE elementTypes;
2431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  HASH_TABLE attributeIds;
2441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  HASH_TABLE prefixes;
2451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  STRING_POOL pool;
246fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  STRING_POOL entityValuePool;
247fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* false once a parameter entity reference has been skipped */
248fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool keepProcessing;
249fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* true once an internal or external PE reference has been encountered;
250fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     this includes the reference to an external subset */
251fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool hasParamEntityRefs;
252fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool standalone;
2531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
254fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* indicates if external PE has been read */
255fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool paramEntityRead;
2561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  HASH_TABLE paramEntities;
2571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
2581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  PREFIX defaultPrefix;
2591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* === scaffolding for building content model === */
260fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool in_eldecl;
2611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  CONTENT_SCAFFOLD *scaffold;
2621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  unsigned contentStringLen;
2631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  unsigned scaffSize;
2641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  unsigned scaffCount;
2651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int scaffLevel;
2661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int *scaffIndex;
2671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} DTD;
2681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
2691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct open_internal_entity {
2701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *internalEventPtr;
2711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *internalEventEndPtr;
2721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  struct open_internal_entity *next;
2731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  ENTITY *entity;
2741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} OPEN_INTERNAL_ENTITY;
2751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
276fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwistypedef enum XML_Error PTRCALL Processor(XML_Parser parser,
277fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                         const char *start,
278fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                         const char *end,
279fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                         const char **endPtr);
2801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
2811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor prologProcessor;
2821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor prologInitProcessor;
2831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor contentProcessor;
2841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor cdataSectionProcessor;
2851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
2861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor ignoreSectionProcessor;
287fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic Processor externalParEntProcessor;
288fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic Processor externalParEntInitProcessor;
289fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic Processor entityValueProcessor;
290fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic Processor entityValueInitProcessor;
2911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
2921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor epilogProcessor;
2931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor errorProcessor;
2941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor externalEntityInitProcessor;
2951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor externalEntityInitProcessor2;
2961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor externalEntityInitProcessor3;
2971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor externalEntityContentProcessor;
2981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
2991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
3001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwishandleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName);
3011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
302fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisprocessXmlDecl(XML_Parser parser, int isGeneralTextEntity,
303fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const char *, const char *);
3041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
3051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisinitializeEncoding(XML_Parser parser);
3061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
3071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisdoProlog(XML_Parser parser, const ENCODING *enc, const char *s,
308fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         const char *end, int tok, const char *next, const char **nextPtr);
3091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
3101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisprocessInternalParamEntity(XML_Parser parser, ENTITY *entity);
3111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
3121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisdoContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
313fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const char *start, const char *end, const char **endPtr);
3141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
315fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdoCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr,
316fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const char *end, const char **nextPtr);
3171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
3181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
319fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdoIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr,
320fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                const char *end, const char **nextPtr);
3211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
3221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
323fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error
324fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisstoreAtts(XML_Parser parser, const ENCODING *,
325fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const char *s, TAG_NAME *tagNamePtr, BINDING **bindingsPtr);
326fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error
327fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisaddBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
328fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           const XML_Char *uri, BINDING **bindingsPtr);
3291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic int
3301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisdefineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *,
331fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                XML_Bool isCdata, XML_Bool isId, const XML_Char *dfltValue,
332fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                XML_Parser parser);
3331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
334fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisstoreAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata,
335fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                    const char *, const char *, STRING_POOL *);
3361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
337fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisappendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata,
338fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                     const char *, const char *, STRING_POOL *);
3391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic ATTRIBUTE_ID *
340fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisgetAttributeId(XML_Parser parser, const ENCODING *enc, const char *start,
341fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const char *end);
342fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int
343fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwissetElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *);
3441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
345fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisstoreEntityValue(XML_Parser parser, const ENCODING *enc, const char *start,
346fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                 const char *end);
3471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic int
348fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisreportProcessingInstruction(XML_Parser parser, const ENCODING *enc,
349fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            const char *start, const char *end);
3501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic int
351fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisreportComment(XML_Parser parser, const ENCODING *enc, const char *start,
352fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              const char *end);
3531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic void
354fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisreportDefault(XML_Parser parser, const ENCODING *enc, const char *start,
355fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              const char *end);
3561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
357fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char * getContext(XML_Parser parser);
358fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Bool
359fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwissetContext(XML_Parser parser, const XML_Char *context);
3601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
361fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL normalizePublicId(XML_Char *s);
3621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
363fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic DTD * dtdCreate(const XML_Memory_Handling_Suite *ms);
364fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* do not call if parentParser != NULL */
365fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms);
366fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void
367fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms);
368fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int
369fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms);
370fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int
371fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwiscopyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *);
372fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
373fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic NAMED *
374fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwislookup(HASH_TABLE *table, KEY name, size_t createSize);
375fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL
376fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwishashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms);
377fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL hashTableClear(HASH_TABLE *);
378fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL hashTableDestroy(HASH_TABLE *);
379fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL
380fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwishashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *);
381fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *);
382fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
383fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL
384fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms);
385fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL poolClear(STRING_POOL *);
386fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL poolDestroy(STRING_POOL *);
387fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Char *
388fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolAppend(STRING_POOL *pool, const ENCODING *enc,
389fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           const char *ptr, const char *end);
390fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Char *
391fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolStoreString(STRING_POOL *pool, const ENCODING *enc,
392fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                const char *ptr, const char *end);
393fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Bool FASTCALL poolGrow(STRING_POOL *pool);
394fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char * FASTCALL
395fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolCopyString(STRING_POOL *pool, const XML_Char *s);
396fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char *
397fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n);
398fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char * FASTCALL
399fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolAppendString(STRING_POOL *pool, const XML_Char *s);
400fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
401fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int FASTCALL nextScaffoldPart(XML_Parser parser);
402fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Content * build_model(XML_Parser parser);
403fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic ELEMENT_TYPE *
404fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisgetElementType(XML_Parser parser, const ENCODING *enc,
405fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const char *ptr, const char *end);
406fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
407fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Parser
408fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisparserCreate(const XML_Char *encodingName,
409fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             const XML_Memory_Handling_Suite *memsuite,
410fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             const XML_Char *nameSep,
411fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             DTD *dtd);
412fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void
413fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisparserInit(XML_Parser parser, const XML_Char *encodingName);
4141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolStart(pool) ((pool)->start)
4161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolEnd(pool) ((pool)->ptr)
4171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolLength(pool) ((pool)->ptr - (pool)->start)
4181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolChop(pool) ((void)--(pool->ptr))
4191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolLastChar(pool) (((pool)->ptr)[-1])
4201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolDiscard(pool) ((pool)->ptr = (pool)->start)
4211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolFinish(pool) ((pool)->start = (pool)->ptr)
4221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolAppendChar(pool, c) \
4231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  (((pool)->ptr == (pool)->end && !poolGrow(pool)) \
4241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis   ? 0 \
4251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis   : ((*((pool)->ptr)++ = c), 1))
4261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
427fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstruct XML_ParserStruct {
428fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* The first member must be userData so that the XML_GetUserData
429fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     macro works. */
4301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  void *m_userData;
4311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  void *m_handlerArg;
4321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  char *m_buffer;
433fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const XML_Memory_Handling_Suite m_mem;
4341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* first character to be parsed */
4351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *m_bufferPtr;
4361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* past last character to be parsed */
4371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  char *m_bufferEnd;
4381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* allocated end of buffer */
4391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *m_bufferLim;
4401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  long m_parseEndByteIndex;
4411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *m_parseEndPtr;
4421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Char *m_dataBuf;
4431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Char *m_dataBufEnd;
4441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_StartElementHandler m_startElementHandler;
4451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_EndElementHandler m_endElementHandler;
4461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_CharacterDataHandler m_characterDataHandler;
4471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_ProcessingInstructionHandler m_processingInstructionHandler;
4481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_CommentHandler m_commentHandler;
4491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_StartCdataSectionHandler m_startCdataSectionHandler;
4501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_EndCdataSectionHandler m_endCdataSectionHandler;
4511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_DefaultHandler m_defaultHandler;
4521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler;
4531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler;
4541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler;
4551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_NotationDeclHandler m_notationDeclHandler;
4561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler;
4571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler;
4581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_NotStandaloneHandler m_notStandaloneHandler;
4591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_ExternalEntityRefHandler m_externalEntityRefHandler;
460fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Parser m_externalEntityRefHandlerArg;
461fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_SkippedEntityHandler m_skippedEntityHandler;
4621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_UnknownEncodingHandler m_unknownEncodingHandler;
4631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_ElementDeclHandler m_elementDeclHandler;
4641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_AttlistDeclHandler m_attlistDeclHandler;
4651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_EntityDeclHandler m_entityDeclHandler;
4661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_XmlDeclHandler m_xmlDeclHandler;
4671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const ENCODING *m_encoding;
4681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  INIT_ENCODING m_initEncoding;
4691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const ENCODING *m_internalEncoding;
4701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *m_protocolEncodingName;
471fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool m_ns;
472fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool m_ns_triplets;
4731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  void *m_unknownEncodingMem;
4741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  void *m_unknownEncodingData;
4751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  void *m_unknownEncodingHandlerData;
4761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  void (*m_unknownEncodingRelease)(void *);
4771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  PROLOG_STATE m_prologState;
4781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  Processor *m_processor;
4791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  enum XML_Error m_errorCode;
4801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *m_eventPtr;
4811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *m_eventEndPtr;
4821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *m_positionPtr;
4831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  OPEN_INTERNAL_ENTITY *m_openInternalEntities;
484fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool m_defaultExpandInternalEntities;
4851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int m_tagLevel;
4861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  ENTITY *m_declEntity;
4871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *m_doctypeName;
4881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *m_doctypeSysid;
4891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *m_doctypePubid;
4901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *m_declAttributeType;
4911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *m_declNotationName;
4921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *m_declNotationPublicId;
4931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  ELEMENT_TYPE *m_declElementType;
4941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  ATTRIBUTE_ID *m_declAttributeId;
495fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool m_declAttributeIsCdata;
496fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool m_declAttributeIsId;
497fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD *m_dtd;
4981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *m_curBase;
4991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  TAG *m_tagStack;
5001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  TAG *m_freeTagList;
5011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  BINDING *m_inheritedBindings;
5021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  BINDING *m_freeBindingList;
5031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int m_attsSize;
5041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int m_nSpecifiedAtts;
5051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int m_idAttIndex;
5061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  ATTRIBUTE *m_atts;
5071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  POSITION m_position;
5081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  STRING_POOL m_tempPool;
5091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  STRING_POOL m_temp2Pool;
5101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  char *m_groupConnector;
5111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  unsigned m_groupSize;
5121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Char m_namespaceSeparator;
513fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Parser m_parentParser;
5141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
515fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool m_isParamEntity;
516fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool m_useForeignDTD;
5171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  enum XML_ParamEntityParsing m_paramEntityParsing;
5181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif
519fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis};
520fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
521fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define MALLOC(s) (parser->m_mem.malloc_fcn((s)))
522fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s)))
523fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define FREE(p) (parser->m_mem.free_fcn((p)))
524fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
525fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define userData (parser->m_userData)
526fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define handlerArg (parser->m_handlerArg)
527fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define startElementHandler (parser->m_startElementHandler)
528fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define endElementHandler (parser->m_endElementHandler)
529fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define characterDataHandler (parser->m_characterDataHandler)
530fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define processingInstructionHandler \
531fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        (parser->m_processingInstructionHandler)
532fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define commentHandler (parser->m_commentHandler)
533fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define startCdataSectionHandler \
534fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        (parser->m_startCdataSectionHandler)
535fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define endCdataSectionHandler (parser->m_endCdataSectionHandler)
536fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define defaultHandler (parser->m_defaultHandler)
537fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler)
538fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler)
539fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define unparsedEntityDeclHandler \
540fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        (parser->m_unparsedEntityDeclHandler)
541fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define notationDeclHandler (parser->m_notationDeclHandler)
542fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define startNamespaceDeclHandler \
543fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        (parser->m_startNamespaceDeclHandler)
544fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler)
545fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define notStandaloneHandler (parser->m_notStandaloneHandler)
546fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define externalEntityRefHandler \
547fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        (parser->m_externalEntityRefHandler)
548fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define externalEntityRefHandlerArg \
549fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        (parser->m_externalEntityRefHandlerArg)
550fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define internalEntityRefHandler \
551fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        (parser->m_internalEntityRefHandler)
552fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define skippedEntityHandler (parser->m_skippedEntityHandler)
553fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define unknownEncodingHandler (parser->m_unknownEncodingHandler)
554fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define elementDeclHandler (parser->m_elementDeclHandler)
555fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define attlistDeclHandler (parser->m_attlistDeclHandler)
556fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define entityDeclHandler (parser->m_entityDeclHandler)
557fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define xmlDeclHandler (parser->m_xmlDeclHandler)
558fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define encoding (parser->m_encoding)
559fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define initEncoding (parser->m_initEncoding)
560fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define internalEncoding (parser->m_internalEncoding)
561fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define unknownEncodingMem (parser->m_unknownEncodingMem)
562fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define unknownEncodingData (parser->m_unknownEncodingData)
5631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define unknownEncodingHandlerData \
564fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  (parser->m_unknownEncodingHandlerData)
565fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define unknownEncodingRelease (parser->m_unknownEncodingRelease)
566fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define protocolEncodingName (parser->m_protocolEncodingName)
567fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define ns (parser->m_ns)
568fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define ns_triplets (parser->m_ns_triplets)
569fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define prologState (parser->m_prologState)
570fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define processor (parser->m_processor)
571fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define errorCode (parser->m_errorCode)
572fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define eventPtr (parser->m_eventPtr)
573fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define eventEndPtr (parser->m_eventEndPtr)
574fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define positionPtr (parser->m_positionPtr)
575fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define position (parser->m_position)
576fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define openInternalEntities (parser->m_openInternalEntities)
577fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define defaultExpandInternalEntities \
578fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        (parser->m_defaultExpandInternalEntities)
579fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define tagLevel (parser->m_tagLevel)
580fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define buffer (parser->m_buffer)
581fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define bufferPtr (parser->m_bufferPtr)
582fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define bufferEnd (parser->m_bufferEnd)
583fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define parseEndByteIndex (parser->m_parseEndByteIndex)
584fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define parseEndPtr (parser->m_parseEndPtr)
585fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define bufferLim (parser->m_bufferLim)
586fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define dataBuf (parser->m_dataBuf)
587fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define dataBufEnd (parser->m_dataBufEnd)
588fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define _dtd (parser->m_dtd)
589fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define curBase (parser->m_curBase)
590fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declEntity (parser->m_declEntity)
591fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define doctypeName (parser->m_doctypeName)
592fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define doctypeSysid (parser->m_doctypeSysid)
593fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define doctypePubid (parser->m_doctypePubid)
594fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declAttributeType (parser->m_declAttributeType)
595fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declNotationName (parser->m_declNotationName)
596fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declNotationPublicId (parser->m_declNotationPublicId)
597fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declElementType (parser->m_declElementType)
598fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declAttributeId (parser->m_declAttributeId)
599fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declAttributeIsCdata (parser->m_declAttributeIsCdata)
600fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declAttributeIsId (parser->m_declAttributeIsId)
601fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define freeTagList (parser->m_freeTagList)
602fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define freeBindingList (parser->m_freeBindingList)
603fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define inheritedBindings (parser->m_inheritedBindings)
604fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define tagStack (parser->m_tagStack)
605fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define atts (parser->m_atts)
606fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define attsSize (parser->m_attsSize)
607fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define nSpecifiedAtts (parser->m_nSpecifiedAtts)
608fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define idAttIndex (parser->m_idAttIndex)
609fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define tempPool (parser->m_tempPool)
610fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define temp2Pool (parser->m_temp2Pool)
611fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define groupConnector (parser->m_groupConnector)
612fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define groupSize (parser->m_groupSize)
613fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define namespaceSeparator (parser->m_namespaceSeparator)
614fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define parentParser (parser->m_parentParser)
6151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
616fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define isParamEntity (parser->m_isParamEntity)
617fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define useForeignDTD (parser->m_useForeignDTD)
618fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define paramEntityParsing (parser->m_paramEntityParsing)
6191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
6201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
621fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define parsing \
622fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  (parentParser \
623fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    ? \
624fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    (isParamEntity \
625fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      ? \
626fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      (processor != externalParEntInitProcessor) \
627fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      : \
628fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      (processor != externalEntityInitProcessor)) \
629fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    : \
630fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    (processor != prologInitProcessor))
6311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
632fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_Parser
633fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ParserCreate(const XML_Char *encodingName)
6341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
6351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return XML_ParserCreate_MM(encodingName, NULL, NULL);
6361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
6371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
638fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_Parser
639fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep)
6401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
6411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Char tmp[2];
6421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  *tmp = nsSep;
6431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return XML_ParserCreate_MM(encodingName, NULL, tmp);
6441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
6451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
646fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char implicitContext[] = {
647fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  'x', 'm', 'l', '=', 'h', 't', 't', 'p', ':', '/', '/',
648fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  'w', 'w', 'w', '.', 'w', '3', '.', 'o', 'r', 'g', '/',
649fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  'X', 'M', 'L', '/', '1', '9', '9', '8', '/',
650fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  'n', 'a', 'm', 'e', 's', 'p', 'a', 'c', 'e', '\0'
651fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis};
652fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
6531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisXML_Parser
6541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisXML_ParserCreate_MM(const XML_Char *encodingName,
655fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                    const XML_Memory_Handling_Suite *memsuite,
656fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                    const XML_Char *nameSep)
657fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
658fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Parser parser = parserCreate(encodingName, memsuite, nameSep, NULL);
659fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (parser != NULL && ns) {
660fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    /* implicit context only set for root parser, since child
661fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       parsers (i.e. external entity parsers) will inherit it
662fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    */
663fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (!setContext(parser, implicitContext)) {
664fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      XML_ParserFree(parser);
665fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
666fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
667fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
668fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return parser;
669fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
6701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
671fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Parser
672fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisparserCreate(const XML_Char *encodingName,
673fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             const XML_Memory_Handling_Suite *memsuite,
674fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             const XML_Char *nameSep,
675fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             DTD *dtd)
676fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
677fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Parser parser;
6781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
6791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (memsuite) {
6801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    XML_Memory_Handling_Suite *mtemp;
681fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    parser = (XML_Parser)
682fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      memsuite->malloc_fcn(sizeof(struct XML_ParserStruct));
683fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (parser != NULL) {
684fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
685fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      mtemp->malloc_fcn = memsuite->malloc_fcn;
686fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      mtemp->realloc_fcn = memsuite->realloc_fcn;
687fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      mtemp->free_fcn = memsuite->free_fcn;
688fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
6891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
6901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
6911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    XML_Memory_Handling_Suite *mtemp;
692fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct));
693fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (parser != NULL) {
694fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
695fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      mtemp->malloc_fcn = malloc;
696fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      mtemp->realloc_fcn = realloc;
697fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      mtemp->free_fcn = free;
698fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
6991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
7001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
7011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!parser)
7021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return parser;
703fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
704fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  buffer = NULL;
705fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  bufferLim = NULL;
706fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
7071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  attsSize = INIT_ATTS_SIZE;
708fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE));
709fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (atts == NULL) {
710fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    FREE(parser);
711fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
712fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
713fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char));
714fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (dataBuf == NULL) {
715fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    FREE(atts);
716fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    FREE(parser);
717fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
718fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
719fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE;
720fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
721fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (dtd)
722fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    _dtd = dtd;
723fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  else {
724fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    _dtd = dtdCreate(&parser->m_mem);
725fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (_dtd == NULL) {
726fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      FREE(dataBuf);
727fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      FREE(atts);
728fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      FREE(parser);
729fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
730fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
731fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
732fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
733fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  freeBindingList = NULL;
734fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  freeTagList = NULL;
735fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
7361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  groupSize = 0;
737fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  groupConnector = NULL;
738fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
739fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  unknownEncodingHandler = NULL;
740fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  unknownEncodingHandlerData = NULL;
741fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
7421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  namespaceSeparator = '!';
743fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  ns = XML_FALSE;
744fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  ns_triplets = XML_FALSE;
745fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
746fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  poolInit(&tempPool, &(parser->m_mem));
747fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  poolInit(&temp2Pool, &(parser->m_mem));
748fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  parserInit(parser, encodingName);
749fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
750fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (encodingName && !protocolEncodingName) {
7511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    XML_ParserFree(parser);
752fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
7531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
7541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
7551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (nameSep) {
756fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    ns = XML_TRUE;
7571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    internalEncoding = XmlGetInternalEncodingNS();
7581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    namespaceSeparator = *nameSep;
7591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
7601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
7611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    internalEncoding = XmlGetInternalEncoding();
7621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
7631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
7641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return parser;
765fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
766fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
767fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void
768fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisparserInit(XML_Parser parser, const XML_Char *encodingName)
769fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
770fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  processor = prologInitProcessor;
771fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XmlPrologStateInit(&prologState);
772fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  protocolEncodingName = (encodingName != NULL
773fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          ? poolCopyString(&tempPool, encodingName)
774fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          : NULL);
775fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  curBase = NULL;
776fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XmlInitEncoding(&initEncoding, &encoding, 0);
777fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  userData = NULL;
778fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  handlerArg = NULL;
779fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  startElementHandler = NULL;
780fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  endElementHandler = NULL;
781fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  characterDataHandler = NULL;
782fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  processingInstructionHandler = NULL;
783fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  commentHandler = NULL;
784fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  startCdataSectionHandler = NULL;
785fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  endCdataSectionHandler = NULL;
786fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  defaultHandler = NULL;
787fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  startDoctypeDeclHandler = NULL;
788fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  endDoctypeDeclHandler = NULL;
789fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  unparsedEntityDeclHandler = NULL;
790fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  notationDeclHandler = NULL;
791fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  startNamespaceDeclHandler = NULL;
792fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  endNamespaceDeclHandler = NULL;
793fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  notStandaloneHandler = NULL;
794fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  externalEntityRefHandler = NULL;
795fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  externalEntityRefHandlerArg = parser;
796fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  skippedEntityHandler = NULL;
797fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  elementDeclHandler = NULL;
798fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  attlistDeclHandler = NULL;
799fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  entityDeclHandler = NULL;
800fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  xmlDeclHandler = NULL;
801fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  bufferPtr = buffer;
802fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  bufferEnd = buffer;
803fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  parseEndByteIndex = 0;
804fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  parseEndPtr = NULL;
805fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  declElementType = NULL;
806fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  declAttributeId = NULL;
807fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  declEntity = NULL;
808fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  doctypeName = NULL;
809fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  doctypeSysid = NULL;
810fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  doctypePubid = NULL;
811fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  declAttributeType = NULL;
812fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  declNotationName = NULL;
813fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  declNotationPublicId = NULL;
814fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  declAttributeIsCdata = XML_FALSE;
815fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  declAttributeIsId = XML_FALSE;
816fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  memset(&position, 0, sizeof(POSITION));
817fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  errorCode = XML_ERROR_NONE;
818fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  eventPtr = NULL;
819fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  eventEndPtr = NULL;
820fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  positionPtr = NULL;
821fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  openInternalEntities = 0;
822fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  defaultExpandInternalEntities = XML_TRUE;
823fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  tagLevel = 0;
824fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  tagStack = NULL;
825fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  inheritedBindings = NULL;
826fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  nSpecifiedAtts = 0;
827fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  unknownEncodingMem = NULL;
828fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  unknownEncodingRelease = NULL;
829fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  unknownEncodingData = NULL;
830fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  parentParser = NULL;
831fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
832fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  isParamEntity = XML_FALSE;
833fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  useForeignDTD = XML_FALSE;
834fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
835fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif
836fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
837fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
838fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* moves list of bindings to freeBindingList */
839fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL
840fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwismoveToFreeBindingList(XML_Parser parser, BINDING *bindings)
841fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
842fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  while (bindings) {
843fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    BINDING *b = bindings;
844fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    bindings = bindings->nextTagBinding;
845fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    b->nextTagBinding = freeBindingList;
846fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    freeBindingList = b;
847fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
848fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
849fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
850fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_Bool
851fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ParserReset(XML_Parser parser, const XML_Char *encodingName)
852fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
853fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  TAG *tStk;
854fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (parentParser)
855fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return XML_FALSE;
856fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* move tagStack to freeTagList */
857fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  tStk = tagStack;
858fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  while (tStk) {
859fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    TAG *tag = tStk;
860fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    tStk = tStk->parent;
861fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    tag->parent = freeTagList;
862fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    moveToFreeBindingList(parser, tag->bindings);
863fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    tag->bindings = NULL;
864fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    freeTagList = tag;
865fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
866fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  moveToFreeBindingList(parser, inheritedBindings);
867fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (unknownEncodingMem)
868fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    FREE(unknownEncodingMem);
869fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (unknownEncodingRelease)
870fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    unknownEncodingRelease(unknownEncodingData);
871fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  poolClear(&tempPool);
872fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  poolClear(&temp2Pool);
873fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  parserInit(parser, encodingName);
874fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  dtdReset(_dtd, &parser->m_mem);
875fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return setContext(parser, implicitContext);
876fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
8771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
878fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisenum XML_Status
879fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetEncoding(XML_Parser parser, const XML_Char *encodingName)
8801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
881fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* Block after XML_Parse()/XML_ParseBuffer() has been called.
882fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     XXX There's no way for the caller to determine which of the
883fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     XXX possible error cases caused the XML_STATUS_ERROR return.
884fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  */
885fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (parsing)
886fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return XML_STATUS_ERROR;
887fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (encodingName == NULL)
888fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    protocolEncodingName = NULL;
8891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
8901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    protocolEncodingName = poolCopyString(&tempPool, encodingName);
8911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!protocolEncodingName)
892fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_STATUS_ERROR;
8931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
894fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return XML_STATUS_OK;
8951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
8961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
897fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_Parser
898fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ExternalEntityParserCreate(XML_Parser oldParser,
899fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               const XML_Char *context,
900fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               const XML_Char *encodingName)
9011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
9021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Parser parser = oldParser;
903fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD *newDtd = NULL;
904fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD *oldDtd = _dtd;
9051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_StartElementHandler oldStartElementHandler = startElementHandler;
9061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_EndElementHandler oldEndElementHandler = endElementHandler;
9071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler;
908fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_ProcessingInstructionHandler oldProcessingInstructionHandler
909fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      = processingInstructionHandler;
9101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_CommentHandler oldCommentHandler = commentHandler;
911fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_StartCdataSectionHandler oldStartCdataSectionHandler
912fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      = startCdataSectionHandler;
913fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_EndCdataSectionHandler oldEndCdataSectionHandler
914fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      = endCdataSectionHandler;
9151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_DefaultHandler oldDefaultHandler = defaultHandler;
916fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler
917fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      = unparsedEntityDeclHandler;
9181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler;
919fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler
920fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      = startNamespaceDeclHandler;
921fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler
922fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      = endNamespaceDeclHandler;
9231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler;
924fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_ExternalEntityRefHandler oldExternalEntityRefHandler
925fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      = externalEntityRefHandler;
926fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler;
927fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_UnknownEncodingHandler oldUnknownEncodingHandler
928fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      = unknownEncodingHandler;
9291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler;
9301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler;
9311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler;
9321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler;
9331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  ELEMENT_TYPE * oldDeclElementType = declElementType;
9341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
9351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  void *oldUserData = userData;
9361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  void *oldHandlerArg = handlerArg;
937fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities;
938fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg;
9391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
940fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing;
941fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  int oldInEntityValue = prologState.inEntityValue;
9421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif
943fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool oldns_triplets = ns_triplets;
944fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
945fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
946fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (!context)
947fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    newDtd = oldDtd;
948fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */
9491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
950fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* Note that the magical uses of the pre-processor to make field
951fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     access look more like C++ require that `parser' be overwritten
952fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     here.  This makes this function more painful to follow than it
953fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     would be otherwise.
954fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  */
9551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (ns) {
9561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    XML_Char tmp[2];
9571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *tmp = namespaceSeparator;
958fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd);
9591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
9601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
961fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd);
9621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
9631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
9641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!parser)
965fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
9661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
9671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  startElementHandler = oldStartElementHandler;
9681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  endElementHandler = oldEndElementHandler;
9691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  characterDataHandler = oldCharacterDataHandler;
9701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  processingInstructionHandler = oldProcessingInstructionHandler;
9711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  commentHandler = oldCommentHandler;
9721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  startCdataSectionHandler = oldStartCdataSectionHandler;
9731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  endCdataSectionHandler = oldEndCdataSectionHandler;
9741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  defaultHandler = oldDefaultHandler;
9751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler;
9761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  notationDeclHandler = oldNotationDeclHandler;
9771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  startNamespaceDeclHandler = oldStartNamespaceDeclHandler;
9781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  endNamespaceDeclHandler = oldEndNamespaceDeclHandler;
9791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  notStandaloneHandler = oldNotStandaloneHandler;
9801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  externalEntityRefHandler = oldExternalEntityRefHandler;
981fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  skippedEntityHandler = oldSkippedEntityHandler;
9821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  unknownEncodingHandler = oldUnknownEncodingHandler;
9831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  elementDeclHandler = oldElementDeclHandler;
9841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  attlistDeclHandler = oldAttlistDeclHandler;
9851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  entityDeclHandler = oldEntityDeclHandler;
9861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  xmlDeclHandler = oldXmlDeclHandler;
9871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  declElementType = oldDeclElementType;
9881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  userData = oldUserData;
9891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (oldUserData == oldHandlerArg)
9901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    handlerArg = userData;
9911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else
9921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    handlerArg = parser;
9931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (oldExternalEntityRefHandlerArg != oldParser)
9941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg;
9951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  defaultExpandInternalEntities = oldDefaultExpandInternalEntities;
9961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  ns_triplets = oldns_triplets;
997fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  parentParser = oldParser;
9981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
9991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  paramEntityParsing = oldParamEntityParsing;
1000fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  prologState.inEntityValue = oldInEntityValue;
10011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (context) {
10021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
1003fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (!dtdCopy(_dtd, oldDtd, &parser->m_mem)
1004fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      || !setContext(parser, context)) {
10051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      XML_ParserFree(parser);
1006fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
10071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
10081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    processor = externalEntityInitProcessor;
10091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
10101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
10111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
1012fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    /* The DTD instance referenced by _dtd is shared between the document's
1013fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       root parser and external PE parsers, therefore one does not need to
1014fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       call setContext. In addition, one also *must* not call setContext,
1015fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       because this would overwrite existing prefix->binding pointers in
1016fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       _dtd with ones that get destroyed with the external PE parser.
1017fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       This would leave those prefixes with dangling pointers.
1018fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    */
1019fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    isParamEntity = XML_TRUE;
10201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    XmlPrologStateInitExternalEntity(&prologState);
1021fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    processor = externalParEntInitProcessor;
10221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
10231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
10241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return parser;
10251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
10261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1027fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL
1028fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdestroyBindings(BINDING *bindings, XML_Parser parser)
10291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
10301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
10311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    BINDING *b = bindings;
10321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!b)
10331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
10341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    bindings = b->nextTagBinding;
10351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    FREE(b->uri);
10361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    FREE(b);
10371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
10381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
10391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1040fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1041fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ParserFree(XML_Parser parser)
10421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
10431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
10441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    TAG *p;
1045fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (tagStack == NULL) {
1046fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (freeTagList == NULL)
1047fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        break;
10481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      tagStack = freeTagList;
1049fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      freeTagList = NULL;
10501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
10511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    p = tagStack;
10521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    tagStack = tagStack->parent;
10531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    FREE(p->buf);
10541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    destroyBindings(p->bindings, parser);
10551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    FREE(p);
10561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
10571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  destroyBindings(freeBindingList, parser);
10581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  destroyBindings(inheritedBindings, parser);
10591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  poolDestroy(&tempPool);
10601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  poolDestroy(&temp2Pool);
10611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
1062fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* external parameter entity parsers share the DTD structure
1063fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     parser->m_dtd with the root parser, so we must not destroy it
1064fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  */
1065fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (!isParamEntity && _dtd)
1066fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#else
1067fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (_dtd)
10681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
1069fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem);
10701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  FREE((void *)atts);
10711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (groupConnector)
10721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    FREE(groupConnector);
10731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (buffer)
10741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    FREE(buffer);
10751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  FREE(dataBuf);
10761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (unknownEncodingMem)
10771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    FREE(unknownEncodingMem);
10781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (unknownEncodingRelease)
10791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    unknownEncodingRelease(unknownEncodingData);
10801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  FREE(parser);
10811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
10821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1083fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1084fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_UseParserAsHandlerArg(XML_Parser parser)
10851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
10861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  handlerArg = parser;
10871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
10881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1089fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisenum XML_Error
1090fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD)
1091fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
1092fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
1093fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* block after XML_Parse()/XML_ParseBuffer() has been called */
1094fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (parsing)
1095fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING;
1096fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  useForeignDTD = useDTD;
1097fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return XML_ERROR_NONE;
1098fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#else
1099fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return XML_ERROR_FEATURE_REQUIRES_XML_DTD;
1100fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif
1101fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
1102fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
11031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisvoid
1104fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetReturnNSTriplet(XML_Parser parser, int do_nst)
1105fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
1106fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* block after XML_Parse()/XML_ParseBuffer() has been called */
1107fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (parsing)
1108fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return;
1109fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  ns_triplets = do_nst ? XML_TRUE : XML_FALSE;
11101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
11111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1112fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1113fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetUserData(XML_Parser parser, void *p)
11141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
11151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (handlerArg == userData)
11161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    handlerArg = userData = p;
11171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else
11181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    userData = p;
11191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
11201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1121fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisenum XML_Status
1122fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetBase(XML_Parser parser, const XML_Char *p)
11231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
11241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (p) {
1125fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    p = poolCopyString(&_dtd->pool, p);
11261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!p)
1127fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_STATUS_ERROR;
11281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    curBase = p;
11291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
11301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else
1131fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    curBase = NULL;
1132fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return XML_STATUS_OK;
11331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
11341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1135fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisconst XML_Char *
1136fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetBase(XML_Parser parser)
11371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
11381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return curBase;
11391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
11401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1141fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisint
1142fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetSpecifiedAttributeCount(XML_Parser parser)
11431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
11441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return nSpecifiedAtts;
11451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
11461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1147fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisint
1148fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetIdAttributeIndex(XML_Parser parser)
11491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
11501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return idAttIndex;
11511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
11521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1153fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1154fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetElementHandler(XML_Parser parser,
1155fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                      XML_StartElementHandler start,
1156fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                      XML_EndElementHandler end)
11571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
11581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  startElementHandler = start;
11591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  endElementHandler = end;
11601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
11611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1162fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1163fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetStartElementHandler(XML_Parser parser,
1164fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           XML_StartElementHandler start) {
11651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  startElementHandler = start;
11661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
11671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1168fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1169fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetEndElementHandler(XML_Parser parser,
1170fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                         XML_EndElementHandler end) {
11711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  endElementHandler = end;
11721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
11731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1174fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1175fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetCharacterDataHandler(XML_Parser parser,
1176fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            XML_CharacterDataHandler handler)
11771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
11781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  characterDataHandler = handler;
11791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
11801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1181fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1182fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetProcessingInstructionHandler(XML_Parser parser,
1183fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                    XML_ProcessingInstructionHandler handler)
11841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
11851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  processingInstructionHandler = handler;
11861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
11871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1188fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1189fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetCommentHandler(XML_Parser parser,
1190fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                      XML_CommentHandler handler)
11911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
11921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  commentHandler = handler;
11931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
11941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1195fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1196fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetCdataSectionHandler(XML_Parser parser,
1197fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           XML_StartCdataSectionHandler start,
1198fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           XML_EndCdataSectionHandler end)
11991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
12001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  startCdataSectionHandler = start;
12011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  endCdataSectionHandler = end;
12021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
12031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1204fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1205fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetStartCdataSectionHandler(XML_Parser parser,
1206fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                XML_StartCdataSectionHandler start) {
12071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  startCdataSectionHandler = start;
12081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
12091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1210fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1211fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetEndCdataSectionHandler(XML_Parser parser,
1212fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                              XML_EndCdataSectionHandler end) {
12131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  endCdataSectionHandler = end;
12141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
12151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1216fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1217fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetDefaultHandler(XML_Parser parser,
1218fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                      XML_DefaultHandler handler)
12191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
12201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  defaultHandler = handler;
1221fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  defaultExpandInternalEntities = XML_FALSE;
12221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
12231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1224fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1225fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetDefaultHandlerExpand(XML_Parser parser,
1226fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            XML_DefaultHandler handler)
12271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
12281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  defaultHandler = handler;
1229fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  defaultExpandInternalEntities = XML_TRUE;
12301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
12311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1232fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1233fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetDoctypeDeclHandler(XML_Parser parser,
1234fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          XML_StartDoctypeDeclHandler start,
1235fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          XML_EndDoctypeDeclHandler end)
12361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
12371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  startDoctypeDeclHandler = start;
12381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  endDoctypeDeclHandler = end;
12391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
12401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1241fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1242fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetStartDoctypeDeclHandler(XML_Parser parser,
1243fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               XML_StartDoctypeDeclHandler start) {
12441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  startDoctypeDeclHandler = start;
12451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
12461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1247fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1248fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetEndDoctypeDeclHandler(XML_Parser parser,
1249fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             XML_EndDoctypeDeclHandler end) {
12501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  endDoctypeDeclHandler = end;
12511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
12521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1253fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1254fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetUnparsedEntityDeclHandler(XML_Parser parser,
1255fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                 XML_UnparsedEntityDeclHandler handler)
12561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
12571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  unparsedEntityDeclHandler = handler;
12581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
12591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1260fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1261fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetNotationDeclHandler(XML_Parser parser,
1262fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           XML_NotationDeclHandler handler)
12631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
12641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  notationDeclHandler = handler;
12651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
12661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1267fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1268fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetNamespaceDeclHandler(XML_Parser parser,
1269fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            XML_StartNamespaceDeclHandler start,
1270fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            XML_EndNamespaceDeclHandler end)
12711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
12721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  startNamespaceDeclHandler = start;
12731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  endNamespaceDeclHandler = end;
12741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
12751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1276fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1277fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetStartNamespaceDeclHandler(XML_Parser parser,
1278fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                 XML_StartNamespaceDeclHandler start) {
12791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  startNamespaceDeclHandler = start;
12801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
12811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1282fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1283fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetEndNamespaceDeclHandler(XML_Parser parser,
1284fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               XML_EndNamespaceDeclHandler end) {
12851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  endNamespaceDeclHandler = end;
12861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
12871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1288fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1289fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetNotStandaloneHandler(XML_Parser parser,
1290fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            XML_NotStandaloneHandler handler)
12911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
12921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  notStandaloneHandler = handler;
12931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
12941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1295fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1296fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetExternalEntityRefHandler(XML_Parser parser,
1297fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                XML_ExternalEntityRefHandler handler)
12981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
12991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  externalEntityRefHandler = handler;
13001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
13011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1302fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1303fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg)
13041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
13051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (arg)
1306fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    externalEntityRefHandlerArg = (XML_Parser)arg;
13071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else
13081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    externalEntityRefHandlerArg = parser;
13091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
13101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1311fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1312fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetSkippedEntityHandler(XML_Parser parser,
1313fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            XML_SkippedEntityHandler handler)
1314fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
1315fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  skippedEntityHandler = handler;
1316fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
1317fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
1318fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1319fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetUnknownEncodingHandler(XML_Parser parser,
1320fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                              XML_UnknownEncodingHandler handler,
1321fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                              void *data)
13221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
13231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  unknownEncodingHandler = handler;
13241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  unknownEncodingHandlerData = data;
13251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
13261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1327fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1328fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetElementDeclHandler(XML_Parser parser,
1329fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          XML_ElementDeclHandler eldecl)
13301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
13311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  elementDeclHandler = eldecl;
13321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
13331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1334fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1335fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetAttlistDeclHandler(XML_Parser parser,
1336fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          XML_AttlistDeclHandler attdecl)
13371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
13381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  attlistDeclHandler = attdecl;
13391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
13401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1341fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1342fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetEntityDeclHandler(XML_Parser parser,
1343fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                         XML_EntityDeclHandler handler)
13441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
13451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  entityDeclHandler = handler;
13461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
13471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1348fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1349fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetXmlDeclHandler(XML_Parser parser,
1350fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                      XML_XmlDeclHandler handler) {
13511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  xmlDeclHandler = handler;
13521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
13531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1354fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisint
1355fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetParamEntityParsing(XML_Parser parser,
1356fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          enum XML_ParamEntityParsing peParsing)
13571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
1358fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* block after XML_Parse()/XML_ParseBuffer() has been called */
1359fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (parsing)
1360fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return 0;
13611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
1362fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  paramEntityParsing = peParsing;
13631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return 1;
13641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else
1365fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return peParsing == XML_PARAM_ENTITY_PARSING_NEVER;
13661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif
13671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
13681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1369fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisenum XML_Status
1370fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
13711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
13721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (len == 0) {
13731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!isFinal)
1374fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_STATUS_OK;
13751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    positionPtr = bufferPtr;
13761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    errorCode = processor(parser, bufferPtr, parseEndPtr = bufferEnd, 0);
13771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (errorCode == XML_ERROR_NONE)
1378fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_STATUS_OK;
13791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventEndPtr = eventPtr;
13801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    processor = errorProcessor;
1381fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return XML_STATUS_ERROR;
13821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
13831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifndef XML_CONTEXT_BYTES
13841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else if (bufferPtr == bufferEnd) {
13851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const char *end;
13861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int nLeftOver;
13871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    parseEndByteIndex += len;
13881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    positionPtr = s;
13891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (isFinal) {
13901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      errorCode = processor(parser, s, parseEndPtr = s + len, 0);
13911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (errorCode == XML_ERROR_NONE)
1392fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_STATUS_OK;
13931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      eventEndPtr = eventPtr;
13941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      processor = errorProcessor;
1395fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_STATUS_ERROR;
13961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
13971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    errorCode = processor(parser, s, parseEndPtr = s + len, &end);
13981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (errorCode != XML_ERROR_NONE) {
13991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      eventEndPtr = eventPtr;
14001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      processor = errorProcessor;
1401fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_STATUS_ERROR;
14021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
14031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    XmlUpdatePosition(encoding, positionPtr, end, &position);
1404fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    positionPtr = end;
14051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    nLeftOver = s + len - end;
14061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (nLeftOver) {
1407fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (buffer == NULL || nLeftOver > bufferLim - buffer) {
1408fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        /* FIXME avoid integer overflow */
1409fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        char *temp;
1410fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        temp = (buffer == NULL
1411fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                ? (char *)MALLOC(len * 2)
1412fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                : (char *)REALLOC(buffer, len * 2));
1413fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (temp == NULL) {
1414fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          errorCode = XML_ERROR_NO_MEMORY;
1415fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_STATUS_ERROR;
1416fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
1417fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        buffer = temp;
1418fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!buffer) {
1419fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          errorCode = XML_ERROR_NO_MEMORY;
1420fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          eventPtr = eventEndPtr = NULL;
1421fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          processor = errorProcessor;
1422fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_STATUS_ERROR;
1423fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
1424fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        bufferLim = buffer + len * 2;
14251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
14261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      memcpy(buffer, end, nLeftOver);
14271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      bufferPtr = buffer;
14281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      bufferEnd = buffer + nLeftOver;
14291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
1430fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return XML_STATUS_OK;
14311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
14321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif  /* not defined XML_CONTEXT_BYTES */
14331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
1434fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    void *buff = XML_GetBuffer(parser, len);
1435fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (buff == NULL)
1436fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_STATUS_ERROR;
1437fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    else {
1438fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      memcpy(buff, s, len);
1439fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_ParseBuffer(parser, len, isFinal);
1440fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
14411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
14421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
14431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1444fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisenum XML_Status
1445fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ParseBuffer(XML_Parser parser, int len, int isFinal)
14461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
14471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *start = bufferPtr;
14481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  positionPtr = start;
14491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  bufferEnd += len;
14501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  parseEndByteIndex += len;
14511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  errorCode = processor(parser, start, parseEndPtr = bufferEnd,
1452fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                        isFinal ? (const char **)NULL : &bufferPtr);
14531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (errorCode == XML_ERROR_NONE) {
1454fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (!isFinal) {
14551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
1456fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      positionPtr = bufferPtr;
1457fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
1458fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return XML_STATUS_OK;
14591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
14601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
14611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventEndPtr = eventPtr;
14621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    processor = errorProcessor;
1463fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return XML_STATUS_ERROR;
14641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
14651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
14661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1467fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid *
1468fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetBuffer(XML_Parser parser, int len)
14691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
14701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (len > bufferLim - bufferEnd) {
14711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    /* FIXME avoid integer overflow */
14721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int neededSize = len + (bufferEnd - bufferPtr);
14731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_CONTEXT_BYTES
14741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int keep = bufferPtr - buffer;
14751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
14761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (keep > XML_CONTEXT_BYTES)
14771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      keep = XML_CONTEXT_BYTES;
14781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    neededSize += keep;
14791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif  /* defined XML_CONTEXT_BYTES */
14801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (neededSize  <= bufferLim - buffer) {
14811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_CONTEXT_BYTES
14821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (keep < bufferPtr - buffer) {
1483fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        int offset = (bufferPtr - buffer) - keep;
1484fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep);
1485fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        bufferEnd -= offset;
1486fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        bufferPtr -= offset;
14871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
14881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else
14891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      memmove(buffer, bufferPtr, bufferEnd - bufferPtr);
14901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      bufferEnd = buffer + (bufferEnd - bufferPtr);
14911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      bufferPtr = buffer;
14921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif  /* not defined XML_CONTEXT_BYTES */
14931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
14941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    else {
14951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      char *newBuf;
14961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      int bufferSize = bufferLim - bufferPtr;
14971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (bufferSize == 0)
1498fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        bufferSize = INIT_BUFFER_SIZE;
14991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      do {
1500fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        bufferSize *= 2;
15011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      } while (bufferSize < neededSize);
1502fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      newBuf = (char *)MALLOC(bufferSize);
15031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (newBuf == 0) {
1504fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        errorCode = XML_ERROR_NO_MEMORY;
1505fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return NULL;
15061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
15071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      bufferLim = newBuf + bufferSize;
15081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_CONTEXT_BYTES
15091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (bufferPtr) {
1510fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        int keep = bufferPtr - buffer;
1511fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (keep > XML_CONTEXT_BYTES)
1512fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          keep = XML_CONTEXT_BYTES;
1513fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep);
1514fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        FREE(buffer);
1515fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        buffer = newBuf;
1516fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        bufferEnd = buffer + (bufferEnd - bufferPtr) + keep;
1517fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        bufferPtr = buffer + keep;
15181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
15191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else {
1520fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        bufferEnd = newBuf + (bufferEnd - bufferPtr);
1521fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        bufferPtr = buffer = newBuf;
15221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
15231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else
15241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (bufferPtr) {
1525fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr);
1526fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        FREE(buffer);
15271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
15281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      bufferEnd = newBuf + (bufferEnd - bufferPtr);
15291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      bufferPtr = buffer = newBuf;
15301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif  /* not defined XML_CONTEXT_BYTES */
15311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
15321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
15331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return bufferEnd;
15341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
15351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1536fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisenum XML_Error
1537fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetErrorCode(XML_Parser parser)
15381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
15391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return errorCode;
15401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
15411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1542fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwislong
1543fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetCurrentByteIndex(XML_Parser parser)
15441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
15451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (eventPtr)
15461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return parseEndByteIndex - (parseEndPtr - eventPtr);
15471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return -1;
15481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
15491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1550fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisint
1551fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetCurrentByteCount(XML_Parser parser)
15521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
15531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (eventEndPtr && eventPtr)
15541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return eventEndPtr - eventPtr;
15551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return 0;
15561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
15571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1558fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisconst char *
1559fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetInputContext(XML_Parser parser, int *offset, int *size)
15601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
15611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_CONTEXT_BYTES
15621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (eventPtr && buffer) {
15631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *offset = eventPtr - buffer;
15641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *size   = bufferEnd - buffer;
15651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return buffer;
15661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
15671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* defined XML_CONTEXT_BYTES */
15681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return (char *) 0;
15691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
15701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1571fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisint
1572fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetCurrentLineNumber(XML_Parser parser)
15731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
15741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (eventPtr) {
15751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
15761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    positionPtr = eventPtr;
15771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
15781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return position.lineNumber + 1;
15791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
15801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1581fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisint
1582fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetCurrentColumnNumber(XML_Parser parser)
15831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
15841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (eventPtr) {
15851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
15861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    positionPtr = eventPtr;
15871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
15881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return position.columnNumber;
15891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
15901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1591fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1592fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_FreeContentModel(XML_Parser parser, XML_Content *model)
1593fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
1594fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  FREE(model);
1595fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
1596fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
1597fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid *
1598fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_MemMalloc(XML_Parser parser, size_t size)
1599fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
1600fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return MALLOC(size);
1601fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
1602fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
1603fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid *
1604fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_MemRealloc(XML_Parser parser, void *ptr, size_t size)
1605fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
1606fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return REALLOC(ptr, size);
1607fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
1608fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
1609fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1610fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_MemFree(XML_Parser parser, void *ptr)
1611fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
1612fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  FREE(ptr);
1613fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
1614fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
1615fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid
1616fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_DefaultCurrent(XML_Parser parser)
16171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
16181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (defaultHandler) {
16191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (openInternalEntities)
16201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      reportDefault(parser,
1621fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                    internalEncoding,
1622fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                    openInternalEntities->internalEventPtr,
1623fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                    openInternalEntities->internalEventEndPtr);
16241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    else
16251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      reportDefault(parser, encoding, eventPtr, eventEndPtr);
16261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
16271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
16281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1629fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisconst XML_LChar *
1630fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ErrorString(enum XML_Error code)
16311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
16321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  static const XML_LChar *message[] = {
16331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    0,
1634fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("out of memory"),
1635fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("syntax error"),
1636fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("no element found"),
1637fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("not well-formed (invalid token)"),
1638fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("unclosed token"),
1639fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("partial character"),
1640fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("mismatched tag"),
1641fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("duplicate attribute"),
1642fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("junk after document element"),
1643fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("illegal parameter entity reference"),
1644fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("undefined entity"),
1645fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("recursive entity reference"),
1646fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("asynchronous entity"),
1647fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("reference to invalid character number"),
1648fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("reference to binary entity"),
1649fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("reference to external entity in attribute"),
1650fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("xml declaration not at start of external entity"),
1651fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("unknown encoding"),
1652fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("encoding specified in XML declaration is incorrect"),
1653fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("unclosed CDATA section"),
1654fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("error in processing external entity reference"),
1655fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("document is not standalone"),
1656fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("unexpected parser state - please send a bug report"),
1657fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("entity declared in parameter entity"),
1658fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("requested feature requires XML_DTD support in Expat"),
1659fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_L("cannot change setting once parsing has begun")
16601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  };
16611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (code > 0 && code < sizeof(message)/sizeof(message[0]))
16621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return message[code];
1663fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return NULL;
16641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
16651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
16661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisconst XML_LChar *
16671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisXML_ExpatVersion(void) {
1668fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
1669fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* V1 is used to string-ize the version number. However, it would
1670fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     string-ize the actual version macro *names* unless we get them
1671fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     substituted before being passed to V1. CPP is defined to expand
1672fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     a macro, then rescan for more expansions. Thus, we use V2 to expand
1673fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     the version macros, then CPP will expand the resulting V1() macro
1674fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     with the correct numerals. */
1675fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* ### I'm assuming cpp is portable in this respect... */
1676fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
1677fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c)
1678fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define V2(a,b,c) XML_L("expat_")V1(a,b,c)
1679fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
1680fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION);
1681fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
1682fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#undef V1
1683fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#undef V2
16841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
16851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
16861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisXML_Expat_Version
1687fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ExpatVersionInfo(void)
1688fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
16891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Expat_Version version;
16901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
16911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  version.major = XML_MAJOR_VERSION;
16921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  version.minor = XML_MINOR_VERSION;
16931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  version.micro = XML_MICRO_VERSION;
16941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
16951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return version;
16961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
16971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1698fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisconst XML_Feature *
1699fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetFeatureList(void)
17001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
1701fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  static XML_Feature features[] = {
1702fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    {XML_FEATURE_SIZEOF_XML_CHAR,  XML_L("sizeof(XML_Char)")},
1703fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)")},
1704fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_UNICODE
1705fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    {XML_FEATURE_UNICODE,          XML_L("XML_UNICODE")},
1706fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif
1707fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_UNICODE_WCHAR_T
1708fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    {XML_FEATURE_UNICODE_WCHAR_T,  XML_L("XML_UNICODE_WCHAR_T")},
1709fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif
1710fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
1711fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    {XML_FEATURE_DTD,              XML_L("XML_DTD")},
1712fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif
1713fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_CONTEXT_BYTES
1714fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    {XML_FEATURE_CONTEXT_BYTES,    XML_L("XML_CONTEXT_BYTES"),
1715fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     XML_CONTEXT_BYTES},
1716fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif
1717fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_MIN_SIZE
1718fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    {XML_FEATURE_MIN_SIZE,         XML_L("XML_MIN_SIZE")},
1719fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif
1720fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    {XML_FEATURE_END,              NULL}
1721fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  };
1722fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
1723fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  features[0].value = sizeof(XML_Char);
1724fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  features[1].value = sizeof(XML_LChar);
1725fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return features;
17261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
17271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1728fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* Initially tag->rawName always points into the parse buffer;
1729fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   for those TAG instances opened while the current parse buffer was
1730fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   processed, and not yet closed, we need to store tag->rawName in a more
1731fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   permanent location, since the parse buffer is about to be discarded.
1732fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/
1733fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Bool
1734fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisstoreRawNames(XML_Parser parser)
1735fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
1736fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  TAG *tag = tagStack;
1737fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  while (tag) {
1738fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    int bufSize;
1739fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1);
1740fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    char *rawNameBuf = tag->buf + nameLen;
1741fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    /* Stop if already stored.  Since tagStack is a stack, we can stop
1742fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       at the first entry that has already been copied; everything
1743fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       below it in the stack is already been accounted for in a
1744fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       previous call to this function.
1745fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    */
1746fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (tag->rawName == rawNameBuf)
1747fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      break;
1748fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    /* For re-use purposes we need to ensure that the
1749fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       size of tag->buf is a multiple of sizeof(XML_Char).
1750fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    */
1751fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char));
1752fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (bufSize > tag->bufEnd - tag->buf) {
1753fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      char *temp = (char *)REALLOC(tag->buf, bufSize);
1754fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (temp == NULL)
1755fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_FALSE;
1756fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      /* if tag->name.str points to tag->buf (only when namespace
1757fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         processing is off) then we have to update it
1758fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      */
1759fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (tag->name.str == (XML_Char *)tag->buf)
1760fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        tag->name.str = (XML_Char *)temp;
1761fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      /* if tag->name.localPart is set (when namespace processing is on)
1762fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         then update it as well, since it will always point into tag->buf
1763fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      */
1764fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (tag->name.localPart)
1765fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        tag->name.localPart = (XML_Char *)temp + (tag->name.localPart -
1766fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                                  (XML_Char *)tag->buf);
1767fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      tag->buf = temp;
1768fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      tag->bufEnd = temp + bufSize;
1769fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      rawNameBuf = temp + nameLen;
1770fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
1771fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    memcpy(rawNameBuf, tag->rawName, tag->rawNameLength);
1772fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    tag->rawName = rawNameBuf;
1773fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    tag = tag->parent;
1774fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
1775fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return XML_TRUE;
1776fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
1777fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
1778fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
1779fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwiscontentProcessor(XML_Parser parser,
1780fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                 const char *start,
1781fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                 const char *end,
1782fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                 const char **endPtr)
1783fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
1784fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  enum XML_Error result =
1785fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    doContent(parser, 0, encoding, start, end, endPtr);
1786fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (result != XML_ERROR_NONE)
1787fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return result;
1788fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (!storeRawNames(parser))
1789fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return XML_ERROR_NO_MEMORY;
1790fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return result;
1791fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
1792fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
1793fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
1794fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisexternalEntityInitProcessor(XML_Parser parser,
1795fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            const char *start,
1796fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            const char *end,
1797fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            const char **endPtr)
17981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
17991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  enum XML_Error result = initializeEncoding(parser);
18001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (result != XML_ERROR_NONE)
18011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return result;
18021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  processor = externalEntityInitProcessor2;
18031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return externalEntityInitProcessor2(parser, start, end, endPtr);
18041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
18051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1806fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
1807fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisexternalEntityInitProcessor2(XML_Parser parser,
1808fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             const char *start,
1809fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             const char *end,
1810fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             const char **endPtr)
18111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
1812fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const char *next = start; /* XmlContentTok doesn't always set the last arg */
18131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int tok = XmlContentTok(encoding, start, end, &next);
18141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  switch (tok) {
18151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  case XML_TOK_BOM:
1816fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    /* If we are at the end of the buffer, this would cause the next stage,
1817fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       i.e. externalEntityInitProcessor3, to pass control directly to
1818fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       doContent (by detecting XML_TOK_NONE) without processing any xml text
1819fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent.
1820fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    */
1821fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (next == end && endPtr) {
1822fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      *endPtr = next;
1823fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_ERROR_NONE;
1824fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
18251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    start = next;
18261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    break;
18271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  case XML_TOK_PARTIAL:
18281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (endPtr) {
18291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *endPtr = start;
18301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NONE;
18311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
18321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventPtr = start;
18331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return XML_ERROR_UNCLOSED_TOKEN;
18341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  case XML_TOK_PARTIAL_CHAR:
18351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (endPtr) {
18361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *endPtr = start;
18371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NONE;
18381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
18391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventPtr = start;
18401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return XML_ERROR_PARTIAL_CHAR;
18411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
18421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  processor = externalEntityInitProcessor3;
18431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return externalEntityInitProcessor3(parser, start, end, endPtr);
18441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
18451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1846fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
1847fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisexternalEntityInitProcessor3(XML_Parser parser,
1848fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             const char *start,
1849fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             const char *end,
1850fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             const char **endPtr)
18511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
1852fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const char *next = start; /* XmlContentTok doesn't always set the last arg */
18531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int tok = XmlContentTok(encoding, start, end, &next);
18541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  switch (tok) {
18551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  case XML_TOK_XML_DECL:
18561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    {
18571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      enum XML_Error result = processXmlDecl(parser, 1, start, next);
18581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (result != XML_ERROR_NONE)
1859fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return result;
18601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      start = next;
18611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
18621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    break;
18631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  case XML_TOK_PARTIAL:
18641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (endPtr) {
18651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *endPtr = start;
18661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NONE;
18671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
18681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventPtr = start;
18691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return XML_ERROR_UNCLOSED_TOKEN;
18701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  case XML_TOK_PARTIAL_CHAR:
18711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (endPtr) {
18721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *endPtr = start;
18731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NONE;
18741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
18751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventPtr = start;
18761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return XML_ERROR_PARTIAL_CHAR;
18771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
18781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  processor = externalEntityContentProcessor;
18791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  tagLevel = 1;
1880fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return externalEntityContentProcessor(parser, start, end, endPtr);
18811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
18821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
1883fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
1884fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisexternalEntityContentProcessor(XML_Parser parser,
1885fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               const char *start,
1886fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               const char *end,
1887fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               const char **endPtr)
18881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
1889fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  enum XML_Error result =
1890fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    doContent(parser, 1, encoding, start, end, endPtr);
1891fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (result != XML_ERROR_NONE)
1892fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return result;
1893fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (!storeRawNames(parser))
1894fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return XML_ERROR_NO_MEMORY;
1895fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return result;
18961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
18971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
18981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
18991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisdoContent(XML_Parser parser,
1900fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          int startTagLevel,
1901fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const ENCODING *enc,
1902fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const char *s,
1903fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const char *end,
1904fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const char **nextPtr)
19051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
1906fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD * const dtd = _dtd;  /* save one level of indirection */
19071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char **eventPP;
19081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char **eventEndPP;
19091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (enc == encoding) {
19101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventPP = &eventPtr;
19111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventEndPP = &eventEndPtr;
19121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
19131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
19141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventPP = &(openInternalEntities->internalEventPtr);
19151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventEndPP = &(openInternalEntities->internalEventEndPtr);
19161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
19171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  *eventPP = s;
19181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
19191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const char *next = s; /* XmlContentTok doesn't always set the last arg */
19201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int tok = XmlContentTok(enc, s, end, &next);
19211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *eventEndPP = next;
19221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    switch (tok) {
19231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_TRAILING_CR:
19241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (nextPtr) {
1925fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *nextPtr = s;
1926fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NONE;
19271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
19281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *eventEndPP = end;
19291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (characterDataHandler) {
1930fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        XML_Char c = 0xA;
1931fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        characterDataHandler(handlerArg, &c, 1);
19321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
19331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else if (defaultHandler)
1934fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        reportDefault(parser, enc, s, end);
19351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (startTagLevel == 0)
1936fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_ELEMENTS;
19371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (tagLevel != startTagLevel)
1938fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_ASYNC_ENTITY;
19391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NONE;
19401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_NONE:
19411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (nextPtr) {
1942fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *nextPtr = s;
1943fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NONE;
19441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
19451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (startTagLevel > 0) {
1946fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (tagLevel != startTagLevel)
1947fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_ASYNC_ENTITY;
1948fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NONE;
19491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
19501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NO_ELEMENTS;
19511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_INVALID:
19521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *eventPP = next;
19531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_INVALID_TOKEN;
19541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_PARTIAL:
19551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (nextPtr) {
1956fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *nextPtr = s;
1957fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NONE;
19581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
19591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_UNCLOSED_TOKEN;
19601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_PARTIAL_CHAR:
19611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (nextPtr) {
1962fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *nextPtr = s;
1963fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NONE;
19641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
19651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_PARTIAL_CHAR;
19661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_ENTITY_REF:
19671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      {
1968fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        const XML_Char *name;
1969fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        ENTITY *entity;
1970fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc,
1971fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                              s + enc->minBytesPerChar,
1972fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                              next - enc->minBytesPerChar);
1973fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (ch) {
1974fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (characterDataHandler)
1975fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            characterDataHandler(handlerArg, &ch, 1);
1976fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          else if (defaultHandler)
1977fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            reportDefault(parser, enc, s, next);
1978fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          break;
1979fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
1980fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        name = poolStoreString(&dtd->pool, enc,
1981fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                s + enc->minBytesPerChar,
1982fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                next - enc->minBytesPerChar);
1983fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!name)
1984fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
1985fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0);
1986fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolDiscard(&dtd->pool);
1987fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        /* First, determine if a check for an existing declaration is needed;
1988fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           if yes, check that the entity exists, and that it is internal,
1989fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           otherwise call the skipped entity or default handler.
1990fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        */
1991fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!dtd->hasParamEntityRefs || dtd->standalone) {
1992fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!entity)
1993fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_UNDEFINED_ENTITY;
1994fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          else if (!entity->is_internal)
1995fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_ENTITY_DECLARED_IN_PE;
1996fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
1997fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else if (!entity) {
1998fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (skippedEntityHandler)
1999fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            skippedEntityHandler(handlerArg, name, 0);
2000fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          else if (defaultHandler)
2001fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            reportDefault(parser, enc, s, next);
2002fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          break;
2003fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2004fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (entity->open)
2005fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_RECURSIVE_ENTITY_REF;
2006fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (entity->notation)
2007fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_BINARY_ENTITY_REF;
2008fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (entity->textPtr) {
2009fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          enum XML_Error result;
2010fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          OPEN_INTERNAL_ENTITY openEntity;
2011fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!defaultExpandInternalEntities) {
2012fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (skippedEntityHandler)
2013fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              skippedEntityHandler(handlerArg, entity->name, 0);
2014fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            else if (defaultHandler)
2015fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              reportDefault(parser, enc, s, next);
2016fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            break;
2017fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
2018fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          entity->open = XML_TRUE;
2019fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          openEntity.next = openInternalEntities;
2020fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          openInternalEntities = &openEntity;
2021fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          openEntity.entity = entity;
2022fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          openEntity.internalEventPtr = NULL;
2023fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          openEntity.internalEventEndPtr = NULL;
2024fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          result = doContent(parser,
2025fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             tagLevel,
2026fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             internalEncoding,
2027fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             (char *)entity->textPtr,
2028fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             (char *)(entity->textPtr + entity->textLen),
2029fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             0);
2030fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          entity->open = XML_FALSE;
2031fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          openInternalEntities = openEntity.next;
2032fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (result)
2033fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return result;
2034fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2035fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else if (externalEntityRefHandler) {
2036fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const XML_Char *context;
2037fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          entity->open = XML_TRUE;
2038fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          context = getContext(parser);
2039fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          entity->open = XML_FALSE;
2040fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!context)
2041fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_NO_MEMORY;
2042fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!externalEntityRefHandler((XML_Parser)externalEntityRefHandlerArg,
2043fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        context,
2044fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        entity->base,
2045fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        entity->systemId,
2046fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        entity->publicId))
2047fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
2048fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          poolDiscard(&tempPool);
2049fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2050fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else if (defaultHandler)
2051fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          reportDefault(parser, enc, s, next);
2052fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        break;
20531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
20541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_START_TAG_NO_ATTS:
2055fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      /* fall through */
2056fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_TOK_START_TAG_WITH_ATTS:
20571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      {
2058fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        TAG *tag;
2059fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        enum XML_Error result;
2060fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        XML_Char *toPtr;
2061fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (freeTagList) {
2062fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          tag = freeTagList;
2063fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          freeTagList = freeTagList->parent;
2064fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2065fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else {
2066fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          tag = (TAG *)MALLOC(sizeof(TAG));
2067fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!tag)
2068fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_NO_MEMORY;
2069fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE);
2070fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!tag->buf) {
2071fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            FREE(tag);
2072fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_NO_MEMORY;
2073fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
2074fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE;
2075fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2076fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        tag->bindings = NULL;
2077fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        tag->parent = tagStack;
2078fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        tagStack = tag;
2079fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        tag->name.localPart = NULL;
2080fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        tag->name.prefix = NULL;
2081fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        tag->rawName = s + enc->minBytesPerChar;
2082fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        tag->rawNameLength = XmlNameLength(enc, tag->rawName);
2083fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        ++tagLevel;
2084fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        {
2085fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const char *rawNameEnd = tag->rawName + tag->rawNameLength;
2086fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const char *fromPtr = tag->rawName;
2087fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          toPtr = (XML_Char *)tag->buf;
2088fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          for (;;) {
2089fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            int bufSize;
2090fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            int convLen;
2091fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            XmlConvert(enc,
2092fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                       &fromPtr, rawNameEnd,
2093fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                       (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1);
2094fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            convLen = toPtr - (XML_Char *)tag->buf;
2095fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (fromPtr == rawNameEnd) {
2096fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              tag->name.strLen = convLen;
2097fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              break;
2098fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            }
2099fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            bufSize = (tag->bufEnd - tag->buf) << 1;
2100fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            {
2101fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              char *temp = (char *)REALLOC(tag->buf, bufSize);
2102fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              if (temp == NULL)
2103fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                return XML_ERROR_NO_MEMORY;
2104fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              tag->buf = temp;
2105fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              tag->bufEnd = temp + bufSize;
2106fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              toPtr = (XML_Char *)temp + convLen;
2107fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            }
2108fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
2109fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2110fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        tag->name.str = (XML_Char *)tag->buf;
2111fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *toPtr = XML_T('\0');
2112fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!startElementHandler && (tok == XML_TOK_START_TAG_NO_ATTS)) {
2113fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (defaultHandler)
2114fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            reportDefault(parser, enc, s, next);
2115fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          break;
2116fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2117fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings));
2118fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (result)
2119fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return result;
2120fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (startElementHandler)
2121fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          startElementHandler(handlerArg, tag->name.str,
2122fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                              (const XML_Char **)atts);
2123fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else if (defaultHandler)
2124fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          reportDefault(parser, enc, s, next);
2125fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolClear(&tempPool);
2126fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        break;
21271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
2128fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_TOK_EMPTY_ELEMENT_NO_ATTS:
2129fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!startElementHandler && !endElementHandler) {
2130fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (defaultHandler)
2131fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          reportDefault(parser, enc, s, next);
2132fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (tagLevel == 0)
2133fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return epilogProcessor(parser, next, end, nextPtr);
2134fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        break;
21351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
21361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      /* fall through */
2137fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_TOK_EMPTY_ELEMENT_WITH_ATTS:
2138fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      {
2139fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        const char *rawName = s + enc->minBytesPerChar;
2140fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        enum XML_Error result;
2141fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        BINDING *bindings = NULL;
2142fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        XML_Bool noElmHandlers = XML_TRUE;
2143fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        TAG_NAME name;
2144fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        name.str = poolStoreString(&tempPool, enc, rawName,
2145fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                   rawName + XmlNameLength(enc, rawName));
2146fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!name.str)
2147fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
2148fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolFinish(&tempPool);
2149fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (startElementHandler ||
2150fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            (tok == XML_TOK_EMPTY_ELEMENT_WITH_ATTS)) {
2151fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          result = storeAtts(parser, enc, s, &name, &bindings);
2152fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (result)
2153fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return result;
2154fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          poolFinish(&tempPool);
2155fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2156fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (startElementHandler) {
2157fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          startElementHandler(handlerArg, name.str, (const XML_Char **)atts);
2158fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          noElmHandlers = XML_FALSE;
2159fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2160fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (endElementHandler) {
2161fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (startElementHandler)
2162fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            *eventPP = *eventEndPP;
2163fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          endElementHandler(handlerArg, name.str);
2164fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          noElmHandlers = XML_FALSE;
2165fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2166fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (noElmHandlers && defaultHandler)
2167fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          reportDefault(parser, enc, s, next);
2168fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolClear(&tempPool);
2169fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        while (bindings) {
2170fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          BINDING *b = bindings;
2171fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (endNamespaceDeclHandler)
2172fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            endNamespaceDeclHandler(handlerArg, b->prefix->name);
2173fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          bindings = bindings->nextTagBinding;
2174fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          b->nextTagBinding = freeBindingList;
2175fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          freeBindingList = b;
2176fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          b->prefix->binding = b->prevPrefixBinding;
2177fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
21781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
21791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (tagLevel == 0)
2180fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return epilogProcessor(parser, next, end, nextPtr);
21811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
21821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_END_TAG:
21831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (tagLevel == startTagLevel)
21841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        return XML_ERROR_ASYNC_ENTITY;
21851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else {
2186fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        int len;
2187fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        const char *rawName;
2188fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        TAG *tag = tagStack;
2189fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        tagStack = tag->parent;
2190fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        tag->parent = freeTagList;
2191fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        freeTagList = tag;
2192fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        rawName = s + enc->minBytesPerChar*2;
2193fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        len = XmlNameLength(enc, rawName);
2194fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (len != tag->rawNameLength
2195fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            || memcmp(tag->rawName, rawName, len) != 0) {
2196fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          *eventPP = rawName;
2197fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_TAG_MISMATCH;
2198fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2199fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        --tagLevel;
2200fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (endElementHandler) {
2201fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const XML_Char *localPart;
2202fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const XML_Char *prefix;
2203fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          XML_Char *uri;
2204fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          localPart = tag->name.localPart;
2205fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (ns && localPart) {
2206fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            /* localPart and prefix may have been overwritten in
2207fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               tag->name.str, since this points to the binding->uri
2208fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               buffer which gets re-used; so we have to add them again
2209fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            */
2210fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            uri = (XML_Char *)tag->name.str + tag->name.uriLen;
2211fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            /* don't need to check for space - already done in storeAtts() */
2212fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            while (*localPart) *uri++ = *localPart++;
2213fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            prefix = (XML_Char *)tag->name.prefix;
2214fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (ns_triplets && prefix) {
2215fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              *uri++ = namespaceSeparator;
2216fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              while (*prefix) *uri++ = *prefix++;
2217fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             }
2218fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            *uri = XML_T('\0');
2219fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
2220fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          endElementHandler(handlerArg, tag->name.str);
2221fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2222fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else if (defaultHandler)
2223fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          reportDefault(parser, enc, s, next);
2224fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        while (tag->bindings) {
2225fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          BINDING *b = tag->bindings;
2226fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (endNamespaceDeclHandler)
2227fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            endNamespaceDeclHandler(handlerArg, b->prefix->name);
2228fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          tag->bindings = tag->bindings->nextTagBinding;
2229fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          b->nextTagBinding = freeBindingList;
2230fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          freeBindingList = b;
2231fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          b->prefix->binding = b->prevPrefixBinding;
2232fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2233fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (tagLevel == 0)
2234fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return epilogProcessor(parser, next, end, nextPtr);
22351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
22361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
22371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_CHAR_REF:
22381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      {
2239fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        int n = XmlCharRefNumber(enc, s);
2240fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (n < 0)
2241fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_BAD_CHAR_REF;
2242fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (characterDataHandler) {
2243fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          XML_Char buf[XML_ENCODE_MAX];
2244fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf));
2245fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2246fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else if (defaultHandler)
2247fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          reportDefault(parser, enc, s, next);
22481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
22491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
22501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_XML_DECL:
22511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_MISPLACED_XML_PI;
22521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_DATA_NEWLINE:
22531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (characterDataHandler) {
2254fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        XML_Char c = 0xA;
2255fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        characterDataHandler(handlerArg, &c, 1);
22561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
22571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else if (defaultHandler)
2258fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        reportDefault(parser, enc, s, next);
22591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
22601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_CDATA_SECT_OPEN:
22611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      {
2262fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        enum XML_Error result;
2263fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (startCdataSectionHandler)
2264fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          startCdataSectionHandler(handlerArg);
22651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#if 0
2266fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        /* Suppose you doing a transformation on a document that involves
2267fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           changing only the character data.  You set up a defaultHandler
2268fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           and a characterDataHandler.  The defaultHandler simply copies
2269fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           characters through.  The characterDataHandler does the
2270fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           transformation and writes the characters out escaping them as
2271fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           necessary.  This case will fail to work if we leave out the
2272fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           following two lines (because & and < inside CDATA sections will
2273fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           be incorrectly escaped).
2274fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
2275fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           However, now we have a start/endCdataSectionHandler, so it seems
2276fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           easier to let the user deal with this.
2277fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        */
2278fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else if (characterDataHandler)
2279fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          characterDataHandler(handlerArg, dataBuf, 0);
22801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif
2281fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else if (defaultHandler)
2282fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          reportDefault(parser, enc, s, next);
2283fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        result = doCdataSection(parser, enc, &next, end, nextPtr);
2284fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!next) {
2285fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          processor = cdataSectionProcessor;
2286fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return result;
2287fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
22881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
22891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
22901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_TRAILING_RSQB:
22911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (nextPtr) {
2292fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *nextPtr = s;
2293fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NONE;
22941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
22951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (characterDataHandler) {
2296fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (MUST_CONVERT(enc, s)) {
2297fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          ICHAR *dataPtr = (ICHAR *)dataBuf;
2298fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);
2299fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          characterDataHandler(handlerArg, dataBuf,
2300fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               dataPtr - (ICHAR *)dataBuf);
2301fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2302fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else
2303fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          characterDataHandler(handlerArg,
2304fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               (XML_Char *)s,
2305fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               (XML_Char *)end - (XML_Char *)s);
23061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
23071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else if (defaultHandler)
2308fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        reportDefault(parser, enc, s, end);
23091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (startTagLevel == 0) {
23101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        *eventPP = end;
2311fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_ELEMENTS;
23121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
23131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (tagLevel != startTagLevel) {
2314fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *eventPP = end;
2315fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_ASYNC_ENTITY;
23161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
23171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NONE;
23181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_DATA_CHARS:
23191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (characterDataHandler) {
2320fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (MUST_CONVERT(enc, s)) {
2321fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          for (;;) {
2322fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            ICHAR *dataPtr = (ICHAR *)dataBuf;
2323fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
2324fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            *eventEndPP = s;
2325fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            characterDataHandler(handlerArg, dataBuf,
2326fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                 dataPtr - (ICHAR *)dataBuf);
2327fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (s == next)
2328fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              break;
2329fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            *eventPP = s;
2330fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
2331fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2332fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else
2333fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          characterDataHandler(handlerArg,
2334fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               (XML_Char *)s,
2335fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               (XML_Char *)next - (XML_Char *)s);
23361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
23371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else if (defaultHandler)
2338fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        reportDefault(parser, enc, s, next);
23391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
23401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_PI:
23411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!reportProcessingInstruction(parser, enc, s, next))
2342fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
23431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
23441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_COMMENT:
23451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!reportComment(parser, enc, s, next))
2346fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
23471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
23481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    default:
23491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (defaultHandler)
2350fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        reportDefault(parser, enc, s, next);
23511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
23521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
23531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *eventPP = s = next;
23541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
23551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* not reached */
23561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
23571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
23581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis/* If tagNamePtr is non-null, build a real list of attributes,
2359fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   otherwise just check the attributes for well-formedness.
2360fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/
2361fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error
2362fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisstoreAtts(XML_Parser parser, const ENCODING *enc,
2363fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const char *attStr, TAG_NAME *tagNamePtr,
2364fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          BINDING **bindingsPtr)
23651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
2366fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD * const dtd = _dtd;  /* save one level of indirection */
2367fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  ELEMENT_TYPE *elementType = NULL;
23681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int nDefaultAtts = 0;
2369fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const XML_Char **appAtts;   /* the attribute list for the application */
23701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int attIndex = 0;
2371fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  int prefixLen;
23721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int i;
23731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int n;
2374fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Char *uri;
23751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int nPrefixes = 0;
23761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  BINDING *binding;
23771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *localPart;
23781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
23791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* lookup the element type name */
23801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (tagNamePtr) {
2381fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, tagNamePtr->str,0);
23821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!elementType) {
2383fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str);
2384fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!name)
2385fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
2386fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, name,
2387fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                           sizeof(ELEMENT_TYPE));
23881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!elementType)
23891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        return XML_ERROR_NO_MEMORY;
23901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (ns && !setElementTypePrefix(parser, elementType))
23911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        return XML_ERROR_NO_MEMORY;
23921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
23931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    nDefaultAtts = elementType->nDefaultAtts;
23941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
23951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* get the attributes from the tokenizer */
23961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  n = XmlGetAttributes(enc, attStr, attsSize, atts);
23971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (n + nDefaultAtts > attsSize) {
23981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int oldAttsSize = attsSize;
2399fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    ATTRIBUTE *temp;
24001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;
2401fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE));
2402fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (temp == NULL)
24031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NO_MEMORY;
2404fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    atts = temp;
24051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (n > oldAttsSize)
24061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      XmlGetAttributes(enc, attStr, n, atts);
24071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
24081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  appAtts = (const XML_Char **)atts;
24091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (i = 0; i < n; i++) {
24101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    /* add the name and value to the attribute list */
24111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name,
2412fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                         atts[i].name
2413fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                         + XmlNameLength(enc, atts[i].name));
24141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!attId)
24151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NO_MEMORY;
24161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    /* detect duplicate attributes */
24171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if ((attId->name)[-1]) {
24181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (enc == encoding)
2419fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        eventPtr = atts[i].name;
24201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_DUPLICATE_ATTRIBUTE;
24211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
24221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    (attId->name)[-1] = 1;
24231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    appAtts[attIndex++] = attId->name;
24241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!atts[i].normalized) {
24251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      enum XML_Error result;
2426fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      XML_Bool isCdata = XML_TRUE;
24271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
24281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      /* figure out whether declared as other than CDATA */
24291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (attId->maybeTokenized) {
2430fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        int j;
2431fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        for (j = 0; j < nDefaultAtts; j++) {
2432fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (attId == elementType->defaultAtts[j].id) {
2433fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            isCdata = elementType->defaultAtts[j].isCdata;
2434fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            break;
2435fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
2436fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
24371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
24381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
24391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      /* normalize the attribute value */
24401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      result = storeAttributeValue(parser, enc, isCdata,
2441fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                   atts[i].valuePtr, atts[i].valueEnd,
2442fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                   &tempPool);
24431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (result)
2444fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return result;
24451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (tagNamePtr) {
2446fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        appAtts[attIndex] = poolStart(&tempPool);
2447fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolFinish(&tempPool);
24481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
24491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else
2450fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolDiscard(&tempPool);
24511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
24521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    else if (tagNamePtr) {
24531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      /* the value did not need normalizing */
2454fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr,
2455fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                          atts[i].valueEnd);
24561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (appAtts[attIndex] == 0)
2457fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
24581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      poolFinish(&tempPool);
24591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
24601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    /* handle prefixed attribute names */
24611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (attId->prefix && tagNamePtr) {
24621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (attId->xmlns) {
2463fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        /* deal with namespace declarations here */
2464fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        enum XML_Error result = addBinding(parser, attId->prefix, attId,
2465fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                           appAtts[attIndex], bindingsPtr);
2466fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (result)
2467fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return result;
24681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        --attIndex;
24691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
24701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else {
2471fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        /* deal with other prefixed names later */
24721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        attIndex++;
24731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        nPrefixes++;
24741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        (attId->name)[-1] = 2;
24751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
24761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
24771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    else
24781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      attIndex++;
24791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
24801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (tagNamePtr) {
24811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int j;
24821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    nSpecifiedAtts = attIndex;
24831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (elementType->idAtt && (elementType->idAtt->name)[-1]) {
24841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      for (i = 0; i < attIndex; i += 2)
2485fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (appAtts[i] == elementType->idAtt->name) {
2486fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          idAttIndex = i;
2487fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          break;
2488fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
24891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
24901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    else
24911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      idAttIndex = -1;
24921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    /* do attribute defaulting */
24931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    for (j = 0; j < nDefaultAtts; j++) {
24941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + j;
24951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!(da->id->name)[-1] && da->value) {
24961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        if (da->id->prefix) {
24971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis          if (da->id->xmlns) {
2498fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            enum XML_Error result = addBinding(parser, da->id->prefix, da->id,
2499fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                               da->value, bindingsPtr);
2500fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (result)
2501fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return result;
2502fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
25031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis          else {
2504fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            (da->id->name)[-1] = 2;
2505fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            nPrefixes++;
2506fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            appAtts[attIndex++] = da->id->name;
2507fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            appAtts[attIndex++] = da->value;
2508fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
2509fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2510fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else {
2511fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          (da->id->name)[-1] = 1;
2512fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          appAtts[attIndex++] = da->id->name;
2513fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          appAtts[attIndex++] = da->value;
2514fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
25151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
25161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
25171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    appAtts[attIndex] = 0;
25181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
25191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  i = 0;
25201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (nPrefixes) {
25211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    /* expand prefixed attribute names */
25221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    for (; i < attIndex; i += 2) {
25231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (appAtts[i][-1] == 2) {
25241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        ATTRIBUTE_ID *id;
25251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        ((XML_Char *)(appAtts[i]))[-1] = 0;
2526fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, appAtts[i], 0);
2527fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (id->prefix->binding) {
2528fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          int j;
2529fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const BINDING *b = id->prefix->binding;
2530fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const XML_Char *s = appAtts[i];
2531fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          for (j = 0; j < b->uriLen; j++) {
2532fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (!poolAppendChar(&tempPool, b->uri[j]))
2533fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_NO_MEMORY;
2534fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
2535fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          while (*s++ != XML_T(':'))
2536fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            ;
2537fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          do {
2538fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (!poolAppendChar(&tempPool, *s))
2539fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_NO_MEMORY;
2540fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          } while (*s++);
2541fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (ns_triplets) {
2542fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            tempPool.ptr[-1] = namespaceSeparator;
2543fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            s = b->prefix->name;
2544fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            do {
2545fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              if (!poolAppendChar(&tempPool, *s))
2546fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                return XML_ERROR_NO_MEMORY;
2547fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            } while (*s++);
2548fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
2549fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
2550fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          appAtts[i] = poolStart(&tempPool);
2551fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          poolFinish(&tempPool);
2552fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2553fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!--nPrefixes)
2554fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          break;
25551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
25561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else
2557fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        ((XML_Char *)(appAtts[i]))[-1] = 0;
25581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
25591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
25601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* clear the flags that say whether attributes were specified */
25611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (; i < attIndex; i += 2)
25621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    ((XML_Char *)(appAtts[i]))[-1] = 0;
25631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!tagNamePtr)
25641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return XML_ERROR_NONE;
25651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding)
25661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    binding->attId->name[-1] = 0;
25671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* expand the element type name */
25681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (elementType->prefix) {
25691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    binding = elementType->prefix->binding;
25701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!binding)
25711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NONE;
25721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    localPart = tagNamePtr->str;
25731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    while (*localPart++ != XML_T(':'))
25741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      ;
25751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
2576fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  else if (dtd->defaultPrefix.binding) {
2577fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    binding = dtd->defaultPrefix.binding;
25781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    localPart = tagNamePtr->str;
25791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
25801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else
25811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return XML_ERROR_NONE;
2582fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  prefixLen = 0;
2583fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (ns && ns_triplets && binding->prefix->name) {
2584fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    for (; binding->prefix->name[prefixLen++];)
2585fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      ;
2586fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
25871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  tagNamePtr->localPart = localPart;
25881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  tagNamePtr->uriLen = binding->uriLen;
2589fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  tagNamePtr->prefix = binding->prefix->name;
2590fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  tagNamePtr->prefixLen = prefixLen;
25911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (i = 0; localPart[i++];)
25921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    ;
2593fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  n = i + binding->uriLen + prefixLen;
25941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (n > binding->uriAlloc) {
25951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    TAG *p;
2596fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char));
25971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!uri)
25981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NO_MEMORY;
25991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    binding->uriAlloc = n + EXPAND_SPARE;
26001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char));
26011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    for (p = tagStack; p; p = p->parent)
26021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (p->name.str == binding->uri)
2603fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        p->name.str = uri;
26041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    FREE(binding->uri);
26051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    binding->uri = uri;
26061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
2607fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  uri = binding->uri + binding->uriLen;
2608fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  memcpy(uri, localPart, i * sizeof(XML_Char));
2609fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (prefixLen) {
2610fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        uri = uri + (i - 1);
2611fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (namespaceSeparator) { *(uri) = namespaceSeparator; }
2612fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char));
2613fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
26141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  tagNamePtr->str = binding->uri;
26151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return XML_ERROR_NONE;
26161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
26171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
2618fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* addBinding() overwrites the value of prefix->binding without checking.
2619fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   Therefore one must keep track of the old value outside of addBinding().
2620fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/
2621fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error
2622fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisaddBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
2623fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           const XML_Char *uri, BINDING **bindingsPtr)
26241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
26251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  BINDING *b;
26261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int len;
2627fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
2628fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* empty string is only valid when there is no prefix per XML NS 1.0 */
2629fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (*uri == XML_T('\0') && prefix->name)
2630fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return XML_ERROR_SYNTAX;
2631fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
26321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (len = 0; uri[len]; len++)
26331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    ;
26341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (namespaceSeparator)
26351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    len++;
26361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (freeBindingList) {
26371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    b = freeBindingList;
26381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (len > b->uriAlloc) {
2639fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      XML_Char *temp = (XML_Char *)REALLOC(b->uri,
2640fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          sizeof(XML_Char) * (len + EXPAND_SPARE));
2641fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (temp == NULL)
2642fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
2643fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      b->uri = temp;
26441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      b->uriAlloc = len + EXPAND_SPARE;
26451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
26461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    freeBindingList = b->nextTagBinding;
26471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
26481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
2649fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    b = (BINDING *)MALLOC(sizeof(BINDING));
26501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!b)
2651fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_ERROR_NO_MEMORY;
2652fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE));
26531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!b->uri) {
26541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      FREE(b);
2655fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_ERROR_NO_MEMORY;
26561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
26571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    b->uriAlloc = len + EXPAND_SPARE;
26581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
26591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  b->uriLen = len;
26601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  memcpy(b->uri, uri, len * sizeof(XML_Char));
26611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (namespaceSeparator)
26621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    b->uri[len - 1] = namespaceSeparator;
26631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  b->prefix = prefix;
26641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  b->attId = attId;
26651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  b->prevPrefixBinding = prefix->binding;
2666fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix)
2667fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    prefix->binding = NULL;
26681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else
26691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    prefix->binding = b;
26701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  b->nextTagBinding = *bindingsPtr;
26711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  *bindingsPtr = b;
26721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (startNamespaceDeclHandler)
26731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    startNamespaceDeclHandler(handlerArg, prefix->name,
2674fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                              prefix->binding ? uri : 0);
2675fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return XML_ERROR_NONE;
26761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
26771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
26781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis/* The idea here is to avoid using stack for each CDATA section when
2679fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   the whole file is parsed with one call.
2680fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/
2681fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
2682fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwiscdataSectionProcessor(XML_Parser parser,
2683fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                      const char *start,
2684fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                      const char *end,
2685fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                      const char **endPtr)
26861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
2687fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  enum XML_Error result = doCdataSection(parser, encoding, &start,
2688fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                         end, endPtr);
26891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (start) {
2690fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (parentParser) {  /* we are parsing an external entity */
2691fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      processor = externalEntityContentProcessor;
2692fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return externalEntityContentProcessor(parser, start, end, endPtr);
2693fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
2694fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    else {
2695fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      processor = contentProcessor;
2696fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return contentProcessor(parser, start, end, endPtr);
2697fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
26981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
26991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return result;
27001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
27011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
27021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis/* startPtr gets set to non-null is the section is closed, and to null if
2703fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   the section is not yet closed.
2704fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/
2705fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error
2706fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdoCdataSection(XML_Parser parser,
2707fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const ENCODING *enc,
2708fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const char **startPtr,
2709fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const char *end,
2710fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const char **nextPtr)
27111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
27121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *s = *startPtr;
27131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char **eventPP;
27141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char **eventEndPP;
27151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (enc == encoding) {
27161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventPP = &eventPtr;
27171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *eventPP = s;
27181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventEndPP = &eventEndPtr;
27191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
27201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
27211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventPP = &(openInternalEntities->internalEventPtr);
27221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventEndPP = &(openInternalEntities->internalEventEndPtr);
27231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
27241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  *eventPP = s;
2725fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  *startPtr = NULL;
27261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
27271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const char *next;
27281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int tok = XmlCdataSectionTok(enc, s, end, &next);
27291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *eventEndPP = next;
27301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    switch (tok) {
27311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_CDATA_SECT_CLOSE:
27321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (endCdataSectionHandler)
2733fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        endCdataSectionHandler(handlerArg);
27341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#if 0
27351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      /* see comment under XML_TOK_CDATA_SECT_OPEN */
27361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else if (characterDataHandler)
2737fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        characterDataHandler(handlerArg, dataBuf, 0);
27381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif
27391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else if (defaultHandler)
2740fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        reportDefault(parser, enc, s, next);
27411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *startPtr = next;
27421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NONE;
27431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_DATA_NEWLINE:
27441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (characterDataHandler) {
2745fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        XML_Char c = 0xA;
2746fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        characterDataHandler(handlerArg, &c, 1);
27471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
27481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else if (defaultHandler)
2749fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        reportDefault(parser, enc, s, next);
27501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
27511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_DATA_CHARS:
27521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (characterDataHandler) {
2753fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (MUST_CONVERT(enc, s)) {
2754fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          for (;;) {
2755fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            ICHAR *dataPtr = (ICHAR *)dataBuf;
2756fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
2757fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            *eventEndPP = next;
2758fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            characterDataHandler(handlerArg, dataBuf,
2759fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                 dataPtr - (ICHAR *)dataBuf);
2760fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (s == next)
2761fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              break;
2762fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            *eventPP = s;
2763fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
2764fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
2765fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else
2766fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          characterDataHandler(handlerArg,
2767fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               (XML_Char *)s,
2768fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               (XML_Char *)next - (XML_Char *)s);
27691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
27701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else if (defaultHandler)
2771fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        reportDefault(parser, enc, s, next);
27721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
27731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_INVALID:
27741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *eventPP = next;
27751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_INVALID_TOKEN;
27761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_PARTIAL_CHAR:
27771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (nextPtr) {
2778fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *nextPtr = s;
2779fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NONE;
27801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
27811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_PARTIAL_CHAR;
27821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_PARTIAL:
27831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_NONE:
27841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (nextPtr) {
2785fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *nextPtr = s;
2786fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NONE;
27871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
27881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_UNCLOSED_CDATA_SECTION;
27891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    default:
27901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *eventPP = next;
27911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_UNEXPECTED_STATE;
27921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
27931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *eventPP = s = next;
27941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
27951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* not reached */
27961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
27971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
27981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
27991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
28001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis/* The idea here is to avoid using stack for each IGNORE section when
2801fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   the whole file is parsed with one call.
2802fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/
2803fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
2804fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisignoreSectionProcessor(XML_Parser parser,
2805fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                       const char *start,
2806fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                       const char *end,
2807fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                       const char **endPtr)
28081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
2809fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  enum XML_Error result = doIgnoreSection(parser, encoding, &start,
2810fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                          end, endPtr);
28111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (start) {
28121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    processor = prologProcessor;
28131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return prologProcessor(parser, start, end, endPtr);
28141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
28151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return result;
28161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
28171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
2818fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* startPtr gets set to non-null is the section is closed, and to null
2819fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   if the section is not yet closed.
2820fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/
2821fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error
2822fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdoIgnoreSection(XML_Parser parser,
2823fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                const ENCODING *enc,
2824fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                const char **startPtr,
2825fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                const char *end,
2826fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                const char **nextPtr)
28271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
28281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *next;
28291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int tok;
28301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *s = *startPtr;
28311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char **eventPP;
28321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char **eventEndPP;
28331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (enc == encoding) {
28341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventPP = &eventPtr;
28351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *eventPP = s;
28361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventEndPP = &eventEndPtr;
28371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
28381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
28391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventPP = &(openInternalEntities->internalEventPtr);
28401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventEndPP = &(openInternalEntities->internalEventEndPtr);
28411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
28421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  *eventPP = s;
2843fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  *startPtr = NULL;
28441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  tok = XmlIgnoreSectionTok(enc, s, end, &next);
28451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  *eventEndPP = next;
28461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  switch (tok) {
28471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  case XML_TOK_IGNORE_SECT:
28481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (defaultHandler)
28491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      reportDefault(parser, enc, s, next);
28501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *startPtr = next;
28511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return XML_ERROR_NONE;
28521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  case XML_TOK_INVALID:
28531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *eventPP = next;
28541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return XML_ERROR_INVALID_TOKEN;
28551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  case XML_TOK_PARTIAL_CHAR:
28561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (nextPtr) {
28571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *nextPtr = s;
28581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NONE;
28591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
28601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return XML_ERROR_PARTIAL_CHAR;
28611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  case XML_TOK_PARTIAL:
28621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  case XML_TOK_NONE:
28631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (nextPtr) {
28641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *nextPtr = s;
28651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NONE;
28661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
28671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */
28681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  default:
28691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *eventPP = next;
28701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return XML_ERROR_UNEXPECTED_STATE;
28711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
28721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* not reached */
28731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
28741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
28751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
28761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
28771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
28781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisinitializeEncoding(XML_Parser parser)
28791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
28801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *s;
28811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_UNICODE
28821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  char encodingBuf[128];
28831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!protocolEncodingName)
2884fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    s = NULL;
28851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
28861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int i;
28871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    for (i = 0; protocolEncodingName[i]; i++) {
28881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (i == sizeof(encodingBuf) - 1
2889fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          || (protocolEncodingName[i] & ~0x7f) != 0) {
2890fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        encodingBuf[0] = '\0';
2891fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        break;
28921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
28931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      encodingBuf[i] = (char)protocolEncodingName[i];
28941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
28951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    encodingBuf[i] = '\0';
28961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    s = encodingBuf;
28971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
28981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else
28991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  s = protocolEncodingName;
29001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif
29011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s))
29021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return XML_ERROR_NONE;
29031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return handleUnknownEncoding(parser, protocolEncodingName);
29041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
29051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
29061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
29071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisprocessXmlDecl(XML_Parser parser, int isGeneralTextEntity,
2908fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const char *s, const char *next)
29091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
2910fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const char *encodingName = NULL;
2911fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const XML_Char *storedEncName = NULL;
2912fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const ENCODING *newEncoding = NULL;
2913fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const char *version = NULL;
29141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *versionend;
2915fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const XML_Char *storedversion = NULL;
29161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int standalone = -1;
29171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!(ns
29181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        ? XmlParseXmlDeclNS
2919fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        : XmlParseXmlDecl)(isGeneralTextEntity,
2920fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           encoding,
2921fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           s,
2922fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           next,
2923fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           &eventPtr,
2924fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           &version,
2925fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           &versionend,
2926fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           &encodingName,
2927fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           &newEncoding,
2928fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           &standalone))
29291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return XML_ERROR_SYNTAX;
29301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!isGeneralTextEntity && standalone == 1) {
2931fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    _dtd->standalone = XML_TRUE;
29321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
29331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE)
29341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
29351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
29361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
29371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (xmlDeclHandler) {
2938fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (encodingName != NULL) {
29391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      storedEncName = poolStoreString(&temp2Pool,
2940fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                      encoding,
2941fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                      encodingName,
2942fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                      encodingName
2943fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                      + XmlNameLength(encoding, encodingName));
2944fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!storedEncName)
2945fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_NO_MEMORY;
29461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      poolFinish(&temp2Pool);
29471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
29481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (version) {
29491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      storedversion = poolStoreString(&temp2Pool,
2950fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                      encoding,
2951fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                      version,
2952fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                      versionend - encoding->minBytesPerChar);
2953fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!storedversion)
2954fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
29551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
29561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone);
29571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
29581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else if (defaultHandler)
29591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    reportDefault(parser, encoding, s, next);
2960fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (protocolEncodingName == NULL) {
29611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (newEncoding) {
29621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) {
2963fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        eventPtr = encodingName;
2964fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_INCORRECT_ENCODING;
29651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
29661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      encoding = newEncoding;
29671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
29681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    else if (encodingName) {
29691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      enum XML_Error result;
2970fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!storedEncName) {
2971fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        storedEncName = poolStoreString(
2972fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          &temp2Pool, encoding, encodingName,
2973fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          encodingName + XmlNameLength(encoding, encodingName));
2974fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!storedEncName)
2975fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
29761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
29771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      result = handleUnknownEncoding(parser, storedEncName);
2978fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      poolClear(&temp2Pool);
29791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (result == XML_ERROR_UNKNOWN_ENCODING)
2980fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        eventPtr = encodingName;
29811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return result;
29821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
29831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
29841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
29851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (storedEncName || storedversion)
29861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    poolClear(&temp2Pool);
29871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
29881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return XML_ERROR_NONE;
29891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
29901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
29911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
29921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwishandleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName)
29931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
29941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (unknownEncodingHandler) {
29951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    XML_Encoding info;
29961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int i;
29971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    for (i = 0; i < 256; i++)
29981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      info.map[i] = -1;
2999fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    info.convert = NULL;
3000fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    info.data = NULL;
3001fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    info.release = NULL;
3002fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName,
3003fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               &info)) {
30041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      ENCODING *enc;
30051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding());
30061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!unknownEncodingMem) {
3007fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (info.release)
3008fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          info.release(info.data);
3009fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
30101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
30111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      enc = (ns
3012fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             ? XmlInitUnknownEncodingNS
3013fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             : XmlInitUnknownEncoding)(unknownEncodingMem,
3014fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                       info.map,
3015fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                       info.convert,
3016fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                       info.data);
30171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (enc) {
3018fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        unknownEncodingData = info.data;
3019fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        unknownEncodingRelease = info.release;
3020fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        encoding = enc;
3021fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NONE;
30221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
30231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
3024fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (info.release != NULL)
3025fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      info.release(info.data);
3026fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
3027fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return XML_ERROR_UNKNOWN_ENCODING;
3028fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
3029fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
3030fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
3031fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisprologInitProcessor(XML_Parser parser,
3032fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                    const char *s,
3033fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                    const char *end,
3034fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                    const char **nextPtr)
3035fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
3036fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  enum XML_Error result = initializeEncoding(parser);
3037fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (result != XML_ERROR_NONE)
3038fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return result;
3039fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  processor = prologProcessor;
3040fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return prologProcessor(parser, s, end, nextPtr);
3041fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
3042fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
3043fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
3044fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
3045fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
3046fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisexternalParEntInitProcessor(XML_Parser parser,
3047fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            const char *s,
3048fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            const char *end,
3049fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            const char **nextPtr)
3050fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
3051fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  enum XML_Error result = initializeEncoding(parser);
3052fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (result != XML_ERROR_NONE)
3053fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return result;
3054fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
3055fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* we know now that XML_Parse(Buffer) has been called,
3056fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     so we consider the external parameter entity read */
3057fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  _dtd->paramEntityRead = XML_TRUE;
3058fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
3059fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (prologState.inEntityValue) {
3060fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    processor = entityValueInitProcessor;
3061fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return entityValueInitProcessor(parser, s, end, nextPtr);
3062fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
3063fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  else {
3064fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    processor = externalParEntProcessor;
3065fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return externalParEntProcessor(parser, s, end, nextPtr);
3066fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
3067fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
3068fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
3069fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
3070fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisentityValueInitProcessor(XML_Parser parser,
3071fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                         const char *s,
3072fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                         const char *end,
3073fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                         const char **nextPtr)
3074fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
3075fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const char *start = s;
3076fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const char *next = s;
3077fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  int tok;
3078fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
3079fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  for (;;) {
3080fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    tok = XmlPrologTok(encoding, start, end, &next);
3081fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (tok <= 0) {
3082fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (nextPtr != 0 && tok != XML_TOK_INVALID) {
3083fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              *nextPtr = s;
3084fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_NONE;
3085fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      }
3086fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      switch (tok) {
3087fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      case XML_TOK_INVALID:
3088fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_INVALID_TOKEN;
3089fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      case XML_TOK_PARTIAL:
3090fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_UNCLOSED_TOKEN;
3091fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      case XML_TOK_PARTIAL_CHAR:
3092fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_PARTIAL_CHAR;
3093fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      case XML_TOK_NONE:   /* start == end */
3094fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      default:
3095fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        break;
3096fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      }
3097fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return storeEntityValue(parser, encoding, s, end);
3098fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
3099fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    else if (tok == XML_TOK_XML_DECL) {
3100fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      enum XML_Error result = processXmlDecl(parser, 0, start, next);
3101fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (result != XML_ERROR_NONE)
3102fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return result;
3103fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (nextPtr) *nextPtr = next;
3104fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      /* stop scanning for text declaration - we found one */
3105fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      processor = entityValueProcessor;
3106fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return entityValueProcessor(parser, next, end, nextPtr);
3107fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
3108fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    /* If we are at the end of the buffer, this would cause XmlPrologTok to
3109fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       return XML_TOK_NONE on the next call, which would then cause the
3110fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       function to exit with *nextPtr set to s - that is what we want for other
3111fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       tokens, but not for the BOM - we would rather like to skip it;
3112fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       then, when this routine is entered the next time, XmlPrologTok will
3113fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis       return XML_TOK_INVALID, since the BOM is still in the buffer
3114fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    */
3115fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    else if (tok == XML_TOK_BOM && next == end && nextPtr) {
3116fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      *nextPtr = next;
3117fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_ERROR_NONE;
3118fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
3119fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    start = next;
3120fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
3121fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
3122fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
3123fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
3124fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisexternalParEntProcessor(XML_Parser parser,
3125fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                        const char *s,
3126fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                        const char *end,
3127fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                        const char **nextPtr)
3128fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
3129fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const char *start = s;
3130fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const char *next = s;
3131fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  int tok;
3132fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
3133fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  tok = XmlPrologTok(encoding, start, end, &next);
3134fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (tok <= 0) {
3135fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (nextPtr != 0 && tok != XML_TOK_INVALID) {
3136fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      *nextPtr = s;
3137fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_ERROR_NONE;
3138fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
3139fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    switch (tok) {
3140fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_TOK_INVALID:
3141fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_ERROR_INVALID_TOKEN;
3142fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_TOK_PARTIAL:
3143fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_ERROR_UNCLOSED_TOKEN;
3144fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_TOK_PARTIAL_CHAR:
3145fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_ERROR_PARTIAL_CHAR;
3146fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_TOK_NONE:   /* start == end */
3147fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    default:
3148fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      break;
3149fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
31501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
3151fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM.
3152fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     However, when parsing an external subset, doProlog will not accept a BOM
3153fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     as valid, and report a syntax error, so we have to skip the BOM
3154fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  */
3155fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  else if (tok == XML_TOK_BOM) {
3156fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    s = next;
3157fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    tok = XmlPrologTok(encoding, s, end, &next);
3158fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
3159fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
3160fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  processor = prologProcessor;
3161fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return doProlog(parser, encoding, s, end, tok, next, nextPtr);
31621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
31631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
3164fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
3165fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisentityValueProcessor(XML_Parser parser,
3166fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                     const char *s,
3167fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                     const char *end,
3168fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                     const char **nextPtr)
31691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
3170fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const char *start = s;
3171fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const char *next = s;
3172fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const ENCODING *enc = encoding;
3173fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  int tok;
3174fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
3175fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  for (;;) {
3176fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    tok = XmlPrologTok(enc, start, end, &next);
3177fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (tok <= 0) {
3178fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (nextPtr != 0 && tok != XML_TOK_INVALID) {
3179fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *nextPtr = s;
3180fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NONE;
3181fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      }
3182fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      switch (tok) {
3183fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      case XML_TOK_INVALID:
3184fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_INVALID_TOKEN;
3185fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      case XML_TOK_PARTIAL:
3186fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_UNCLOSED_TOKEN;
3187fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      case XML_TOK_PARTIAL_CHAR:
3188fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_PARTIAL_CHAR;
3189fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      case XML_TOK_NONE:   /* start == end */
3190fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      default:
3191fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        break;
3192fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      }
3193fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return storeEntityValue(parser, enc, s, end);
3194fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
3195fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    start = next;
3196fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
31971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
31981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
3199fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */
3200fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
3201fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
32021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisprologProcessor(XML_Parser parser,
3203fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                const char *s,
3204fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                const char *end,
3205fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                const char **nextPtr)
32061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
3207fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const char *next = s;
32081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int tok = XmlPrologTok(encoding, s, end, &next);
32091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return doProlog(parser, encoding, s, end, tok, next, nextPtr);
32101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
32111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
32121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
32131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisdoProlog(XML_Parser parser,
3214fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         const ENCODING *enc,
3215fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         const char *s,
3216fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         const char *end,
3217fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         int tok,
3218fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         const char *next,
3219fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         const char **nextPtr)
32201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
32211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
32221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  static const XML_Char externalSubsetName[] = { '#' , '\0' };
32231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
3224fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  static const XML_Char atypeCDATA[] = { 'C', 'D', 'A', 'T', 'A', '\0' };
3225fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  static const XML_Char atypeID[] = { 'I', 'D', '\0' };
3226fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  static const XML_Char atypeIDREF[] = { 'I', 'D', 'R', 'E', 'F', '\0' };
3227fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  static const XML_Char atypeIDREFS[] = { 'I', 'D', 'R', 'E', 'F', 'S', '\0' };
3228fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  static const XML_Char atypeENTITY[] = { 'E', 'N', 'T', 'I', 'T', 'Y', '\0' };
3229fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  static const XML_Char atypeENTITIES[] =
3230fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      { 'E', 'N', 'T', 'I', 'T', 'I', 'E', 'S', '\0' };
3231fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  static const XML_Char atypeNMTOKEN[] = {
3232fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      'N', 'M', 'T', 'O', 'K', 'E', 'N', '\0' };
3233fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  static const XML_Char atypeNMTOKENS[] = {
3234fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      'N', 'M', 'T', 'O', 'K', 'E', 'N', 'S', '\0' };
3235fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  static const XML_Char notationPrefix[] = {
3236fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N', '(', '\0' };
3237fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  static const XML_Char enumValueSep[] = { '|', '\0' };
3238fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  static const XML_Char enumValueStart[] = { '(', '\0' };
3239fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
3240fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD * const dtd = _dtd;  /* save one level of indirection */
32411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
32421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char **eventPP;
32431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char **eventEndPP;
32441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  enum XML_Content_Quant quant;
32451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
32461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (enc == encoding) {
32471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventPP = &eventPtr;
32481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventEndPP = &eventEndPtr;
32491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
32501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
32511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventPP = &(openInternalEntities->internalEventPtr);
32521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventEndPP = &(openInternalEntities->internalEventEndPtr);
32531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
32541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
32551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int role;
3256fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    XML_Bool handleDefault = XML_TRUE;
32571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *eventPP = s;
32581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *eventEndPP = next;
32591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (tok <= 0) {
32601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (nextPtr != 0 && tok != XML_TOK_INVALID) {
3261fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *nextPtr = s;
3262fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NONE;
32631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
32641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      switch (tok) {
32651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      case XML_TOK_INVALID:
3266fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *eventPP = next;
3267fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_INVALID_TOKEN;
32681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      case XML_TOK_PARTIAL:
3269fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_UNCLOSED_TOKEN;
32701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      case XML_TOK_PARTIAL_CHAR:
3271fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_PARTIAL_CHAR;
32721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      case XML_TOK_NONE:
32731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
3274fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (enc != encoding)
3275fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NONE;
3276fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (isParamEntity) {
3277fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc)
3278fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              == XML_ROLE_ERROR)
3279fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_SYNTAX;
3280fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NONE;
3281fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
32821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
3283fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_ELEMENTS;
32841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      default:
3285fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        tok = -tok;
3286fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        next = end;
3287fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        break;
32881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
32891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
32901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    role = XmlTokenRole(&prologState, tok, s, next, enc);
32911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    switch (role) {
32921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_XML_DECL:
32931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      {
3294fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        enum XML_Error result = processXmlDecl(parser, 0, s, next);
3295fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (result != XML_ERROR_NONE)
3296fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return result;
3297fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        enc = encoding;
3298fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
32991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
33001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
33011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_DOCTYPE_NAME:
33021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (startDoctypeDeclHandler) {
3303fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        doctypeName = poolStoreString(&tempPool, enc, s, next);
3304fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!doctypeName)
3305fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3306fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolFinish(&tempPool);
3307fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        doctypePubid = NULL;
3308fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
33091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
3310fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      doctypeSysid = NULL; /* always initialize to NULL */
33111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
33121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_DOCTYPE_INTERNAL_SUBSET:
33131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (startDoctypeDeclHandler) {
3314fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid,
3315fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                doctypePubid, 1);
3316fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        doctypeName = NULL;
3317fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolClear(&tempPool);
3318fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
33191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
33201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
33211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
33221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_TEXT_DECL:
33231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      {
3324fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        enum XML_Error result = processXmlDecl(parser, 1, s, next);
3325fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (result != XML_ERROR_NONE)
3326fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return result;
3327fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        enc = encoding;
3328fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
33291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
33301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
33311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
33321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_DOCTYPE_PUBLIC_ID:
3333fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
3334fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      useForeignDTD = XML_FALSE;
3335fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */
3336fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      dtd->hasParamEntityRefs = XML_TRUE;
33371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (startDoctypeDeclHandler) {
3338fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        doctypePubid = poolStoreString(&tempPool, enc,
3339fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                       s + enc->minBytesPerChar,
3340fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                       next - enc->minBytesPerChar);
3341fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!doctypePubid)
3342fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3343fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolFinish(&tempPool);
3344fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
33451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
33461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
3347fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declEntity = (ENTITY *)lookup(&dtd->paramEntities,
3348fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                    externalSubsetName,
3349fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                    sizeof(ENTITY));
33501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!declEntity)
3351fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
33521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
33531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      /* fall through */
33541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ENTITY_PUBLIC_ID:
33551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!XmlIsPublicId(enc, s, next, eventPP))
3356fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_SYNTAX;
3357fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->keepProcessing && declEntity) {
3358fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        XML_Char *tem = poolStoreString(&dtd->pool,
3359fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        enc,
3360fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        s + enc->minBytesPerChar,
3361fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        next - enc->minBytesPerChar);
3362fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!tem)
3363fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3364fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        normalizePublicId(tem);
3365fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        declEntity->publicId = tem;
3366fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolFinish(&dtd->pool);
3367fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (entityDeclHandler)
3368fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          handleDefault = XML_FALSE;
33691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
33701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
33711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_DOCTYPE_CLOSE:
33721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (doctypeName) {
3373fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        startDoctypeDeclHandler(handlerArg, doctypeName,
3374fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                doctypeSysid, doctypePubid, 0);
3375fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolClear(&tempPool);
3376fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
33771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
3378fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      /* doctypeSysid will be non-NULL in the case of a previous
3379fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler
3380fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         was not set, indicating an external subset
3381fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      */
33821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
3383fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (doctypeSysid || useForeignDTD) {
3384fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->hasParamEntityRefs = XML_TRUE; /* when docTypeSysid == NULL */
3385fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (paramEntityParsing && externalEntityRefHandler) {
3386fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities,
3387fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                            externalSubsetName,
3388fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                            sizeof(ENTITY));
3389fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!entity)
3390fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_NO_MEMORY;
3391fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (useForeignDTD)
3392fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            entity->base = curBase;
3393fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          dtd->paramEntityRead = XML_FALSE;
3394fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!externalEntityRefHandler(externalEntityRefHandlerArg,
3395fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        0,
3396fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        entity->base,
3397fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        entity->systemId,
3398fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        entity->publicId))
3399fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
3400fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (dtd->paramEntityRead &&
3401fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              !dtd->standalone &&
3402fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              notStandaloneHandler &&
3403fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              !notStandaloneHandler(handlerArg))
3404fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_NOT_STANDALONE;
3405fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          /* end of DTD - no need to update dtd->keepProcessing */
3406fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3407fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        useForeignDTD = XML_FALSE;
3408fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      }
34091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
3410fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (endDoctypeDeclHandler) {
3411fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        endDoctypeDeclHandler(handlerArg);
3412fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
34131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
34141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
34151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_INSTANCE_START:
3416fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
3417fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      /* if there is no DOCTYPE declaration then now is the
3418fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         last chance to read the foreign DTD
3419fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      */
3420fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (useForeignDTD) {
3421fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->hasParamEntityRefs = XML_TRUE;
3422fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (paramEntityParsing && externalEntityRefHandler) {
3423fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities,
3424fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                            externalSubsetName,
3425fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                            sizeof(ENTITY));
3426fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!entity)
3427fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_NO_MEMORY;
3428fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          entity->base = curBase;
3429fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          dtd->paramEntityRead = XML_FALSE;
3430fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!externalEntityRefHandler(externalEntityRefHandlerArg,
3431fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        0,
3432fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        entity->base,
3433fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        entity->systemId,
3434fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        entity->publicId))
3435fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
3436fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (dtd->paramEntityRead &&
3437fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              !dtd->standalone &&
3438fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              notStandaloneHandler &&
3439fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              !notStandaloneHandler(handlerArg))
3440fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_NOT_STANDALONE;
3441fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          /* end of DTD - no need to update dtd->keepProcessing */
3442fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3443fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      }
3444fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */
34451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      processor = contentProcessor;
34461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return contentProcessor(parser, s, end, nextPtr);
34471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ATTLIST_ELEMENT_NAME:
34481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      declElementType = getElementType(parser, enc, s, next);
34491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!declElementType)
3450fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
3451fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      goto checkAttListDeclHandler;
34521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ATTRIBUTE_NAME:
34531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      declAttributeId = getAttributeId(parser, enc, s, next);
34541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!declAttributeId)
3455fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
3456fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declAttributeIsCdata = XML_FALSE;
3457fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declAttributeType = NULL;
3458fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declAttributeIsId = XML_FALSE;
3459fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      goto checkAttListDeclHandler;
34601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ATTRIBUTE_TYPE_CDATA:
3461fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declAttributeIsCdata = XML_TRUE;
3462fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declAttributeType = atypeCDATA;
3463fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      goto checkAttListDeclHandler;
34641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ATTRIBUTE_TYPE_ID:
3465fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declAttributeIsId = XML_TRUE;
3466fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declAttributeType = atypeID;
3467fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      goto checkAttListDeclHandler;
34681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ATTRIBUTE_TYPE_IDREF:
3469fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declAttributeType = atypeIDREF;
3470fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      goto checkAttListDeclHandler;
34711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ATTRIBUTE_TYPE_IDREFS:
3472fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declAttributeType = atypeIDREFS;
3473fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      goto checkAttListDeclHandler;
34741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ATTRIBUTE_TYPE_ENTITY:
3475fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declAttributeType = atypeENTITY;
3476fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      goto checkAttListDeclHandler;
34771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES:
3478fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declAttributeType = atypeENTITIES;
3479fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      goto checkAttListDeclHandler;
34801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN:
3481fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declAttributeType = atypeNMTOKEN;
3482fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      goto checkAttListDeclHandler;
34831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS:
3484fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declAttributeType = atypeNMTOKENS;
3485fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    checkAttListDeclHandler:
3486fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->keepProcessing && attlistDeclHandler)
3487fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
34881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
34891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ATTRIBUTE_ENUM_VALUE:
34901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ATTRIBUTE_NOTATION_VALUE:
3491fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->keepProcessing && attlistDeclHandler) {
3492fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        const XML_Char *prefix;
3493fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (declAttributeType) {
3494fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          prefix = enumValueSep;
3495fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3496fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else {
3497fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE
3498fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                    ? notationPrefix
3499fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                    : enumValueStart);
3500fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3501fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!poolAppendString(&tempPool, prefix))
3502fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3503fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!poolAppend(&tempPool, enc, s, next))
3504fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3505fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        declAttributeType = tempPool.start;
3506fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
35071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
35081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
35091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE:
35101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE:
3511fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->keepProcessing) {
3512fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!defineAttribute(declElementType, declAttributeId,
3513fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                              declAttributeIsCdata, declAttributeIsId, 0,
3514fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                              parser))
3515fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3516fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (attlistDeclHandler && declAttributeType) {
3517fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (*declAttributeType == XML_T('(')
3518fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              || (*declAttributeType == XML_T('N')
3519fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                  && declAttributeType[1] == XML_T('O'))) {
3520fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            /* Enumerated or Notation type */
3521fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (!poolAppendChar(&tempPool, XML_T(')'))
3522fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                || !poolAppendChar(&tempPool, XML_T('\0')))
3523fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_NO_MEMORY;
3524fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            declAttributeType = tempPool.start;
3525fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            poolFinish(&tempPool);
3526fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
3527fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          *eventEndPP = s;
3528fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          attlistDeclHandler(handlerArg, declElementType->name,
3529fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             declAttributeId->name, declAttributeType,
3530fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE);
3531fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          poolClear(&tempPool);
3532fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          handleDefault = XML_FALSE;
3533fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
35341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
35351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
35361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE:
35371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_FIXED_ATTRIBUTE_VALUE:
3538fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->keepProcessing) {
3539fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        const XML_Char *attVal;
3540fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        enum XML_Error result
3541fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          = storeAttributeValue(parser, enc, declAttributeIsCdata,
3542fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                s + enc->minBytesPerChar,
3543fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                next - enc->minBytesPerChar,
3544fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                &dtd->pool);
3545fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (result)
3546fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return result;
3547fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        attVal = poolStart(&dtd->pool);
3548fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolFinish(&dtd->pool);
3549fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        /* ID attributes aren't allowed to have a default */
3550fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!defineAttribute(declElementType, declAttributeId,
3551fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             declAttributeIsCdata, XML_FALSE, attVal, parser))
3552fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3553fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (attlistDeclHandler && declAttributeType) {
3554fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (*declAttributeType == XML_T('(')
3555fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              || (*declAttributeType == XML_T('N')
3556fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                  && declAttributeType[1] == XML_T('O'))) {
3557fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            /* Enumerated or Notation type */
3558fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (!poolAppendChar(&tempPool, XML_T(')'))
3559fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                || !poolAppendChar(&tempPool, XML_T('\0')))
3560fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_NO_MEMORY;
3561fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            declAttributeType = tempPool.start;
3562fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            poolFinish(&tempPool);
3563fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
3564fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          *eventEndPP = s;
3565fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          attlistDeclHandler(handlerArg, declElementType->name,
3566fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             declAttributeId->name, declAttributeType,
3567fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             attVal,
3568fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                             role == XML_ROLE_FIXED_ATTRIBUTE_VALUE);
3569fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          poolClear(&tempPool);
3570fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          handleDefault = XML_FALSE;
3571fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
35721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
3573fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      break;
35741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ENTITY_VALUE:
3575fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->keepProcessing) {
3576fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        enum XML_Error result = storeEntityValue(parser, enc,
3577fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                            s + enc->minBytesPerChar,
3578fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                            next - enc->minBytesPerChar);
3579fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (declEntity) {
3580fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          declEntity->textPtr = poolStart(&dtd->entityValuePool);
3581fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          declEntity->textLen = poolLength(&dtd->entityValuePool);
3582fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          poolFinish(&dtd->entityValuePool);
3583fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (entityDeclHandler) {
3584fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            *eventEndPP = s;
3585fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            entityDeclHandler(handlerArg,
3586fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                              declEntity->name,
3587fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                              declEntity->is_param,
3588fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                              declEntity->textPtr,
3589fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                              declEntity->textLen,
3590fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                              curBase, 0, 0, 0);
3591fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            handleDefault = XML_FALSE;
3592fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
3593fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3594fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else
3595fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          poolDiscard(&dtd->entityValuePool);
3596fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (result != XML_ERROR_NONE)
3597fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return result;
35981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
35991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
36001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_DOCTYPE_SYSTEM_ID:
3601fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
3602fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      useForeignDTD = XML_FALSE;
3603fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */
3604fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      dtd->hasParamEntityRefs = XML_TRUE;
36051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (startDoctypeDeclHandler) {
3606fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        doctypeSysid = poolStoreString(&tempPool, enc,
3607fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                       s + enc->minBytesPerChar,
3608fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                       next - enc->minBytesPerChar);
3609fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (doctypeSysid == NULL)
3610fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3611fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolFinish(&tempPool);
3612fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
36131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
36141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
3615fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      else
3616fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        /* use externalSubsetName to make doctypeSysid non-NULL
3617fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           for the case where no startDoctypeDeclHandler is set */
3618fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        doctypeSysid = externalSubsetName;
3619fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */
3620fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!dtd->standalone
3621fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
3622fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          && !paramEntityParsing
36231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
3624fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          && notStandaloneHandler
3625fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          && !notStandaloneHandler(handlerArg))
3626fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NOT_STANDALONE;
36271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifndef XML_DTD
36281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
36291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else /* XML_DTD */
36301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!declEntity) {
3631fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        declEntity = (ENTITY *)lookup(&dtd->paramEntities,
3632fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                      externalSubsetName,
3633fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                      sizeof(ENTITY));
3634fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!declEntity)
3635fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3636fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        declEntity->publicId = NULL;
36371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
36381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      /* fall through */
36391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
36401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ENTITY_SYSTEM_ID:
3641fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->keepProcessing && declEntity) {
3642fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        declEntity->systemId = poolStoreString(&dtd->pool, enc,
3643fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                               s + enc->minBytesPerChar,
3644fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                               next - enc->minBytesPerChar);
3645fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!declEntity->systemId)
3646fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3647fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        declEntity->base = curBase;
3648fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolFinish(&dtd->pool);
3649fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (entityDeclHandler)
3650fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          handleDefault = XML_FALSE;
36511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
36521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
36531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ENTITY_COMPLETE:
3654fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->keepProcessing && declEntity && entityDeclHandler) {
3655fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *eventEndPP = s;
3656fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        entityDeclHandler(handlerArg,
3657fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          declEntity->name,
3658fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          declEntity->is_param,
3659fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          0,0,
3660fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          declEntity->base,
3661fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          declEntity->systemId,
3662fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          declEntity->publicId,
3663fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          0);
3664fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
36651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
36661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
36671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ENTITY_NOTATION_NAME:
3668fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->keepProcessing && declEntity) {
3669fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        declEntity->notation = poolStoreString(&dtd->pool, enc, s, next);
3670fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!declEntity->notation)
3671fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3672fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolFinish(&dtd->pool);
3673fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (unparsedEntityDeclHandler) {
3674fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          *eventEndPP = s;
3675fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          unparsedEntityDeclHandler(handlerArg,
3676fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                    declEntity->name,
3677fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                    declEntity->base,
3678fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                    declEntity->systemId,
3679fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                    declEntity->publicId,
3680fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                    declEntity->notation);
3681fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          handleDefault = XML_FALSE;
3682fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3683fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else if (entityDeclHandler) {
3684fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          *eventEndPP = s;
3685fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          entityDeclHandler(handlerArg,
3686fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            declEntity->name,
3687fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            0,0,0,
3688fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            declEntity->base,
3689fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            declEntity->systemId,
3690fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            declEntity->publicId,
3691fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            declEntity->notation);
3692fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          handleDefault = XML_FALSE;
3693fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
36941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
36951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
36961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_GENERAL_ENTITY_NAME:
36971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      {
3698fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (XmlPredefinedEntityName(enc, s, next)) {
3699fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          declEntity = NULL;
3700fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          break;
3701fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3702fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (dtd->keepProcessing) {
3703fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);
3704fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!name)
3705fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_NO_MEMORY;
3706fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          declEntity = (ENTITY *)lookup(&dtd->generalEntities, name,
3707fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        sizeof(ENTITY));
3708fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!declEntity)
3709fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_NO_MEMORY;
3710fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (declEntity->name != name) {
3711fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            poolDiscard(&dtd->pool);
3712fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            declEntity = NULL;
3713fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
3714fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          else {
3715fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            poolFinish(&dtd->pool);
3716fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            declEntity->publicId = NULL;
3717fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            declEntity->is_param = XML_FALSE;
3718fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            /* if we have a parent parser or are reading an internal parameter
3719fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               entity, then the entity declaration is not considered "internal"
3720fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            */
3721fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            declEntity->is_internal = !(parentParser || openInternalEntities);
3722fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (entityDeclHandler)
3723fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              handleDefault = XML_FALSE;
3724fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
3725fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3726fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else {
3727fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          poolDiscard(&dtd->pool);
3728fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          declEntity = NULL;
3729fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
37301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
37311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
37321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_PARAM_ENTITY_NAME:
37331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
3734fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->keepProcessing) {
3735fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);
3736fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!name)
3737fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3738fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        declEntity = (ENTITY *)lookup(&dtd->paramEntities,
3739fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                           name, sizeof(ENTITY));
3740fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!declEntity)
3741fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3742fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (declEntity->name != name) {
3743fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          poolDiscard(&dtd->pool);
3744fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          declEntity = NULL;
3745fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3746fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else {
3747fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          poolFinish(&dtd->pool);
3748fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          declEntity->publicId = NULL;
3749fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          declEntity->is_param = XML_TRUE;
3750fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          /* if we have a parent parser or are reading an internal parameter
3751fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             entity, then the entity declaration is not considered "internal"
3752fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          */
3753fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          declEntity->is_internal = !(parentParser || openInternalEntities);
3754fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (entityDeclHandler)
3755fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            handleDefault = XML_FALSE;
3756fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3757fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      }
3758fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      else {
3759fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolDiscard(&dtd->pool);
3760fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        declEntity = NULL;
37611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
37621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else /* not XML_DTD */
3763fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declEntity = NULL;
3764fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */
37651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
37661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_NOTATION_NAME:
3767fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declNotationPublicId = NULL;
3768fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      declNotationName = NULL;
37691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (notationDeclHandler) {
3770fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        declNotationName = poolStoreString(&tempPool, enc, s, next);
3771fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!declNotationName)
3772fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3773fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolFinish(&tempPool);
3774fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
37751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
37761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
37771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_NOTATION_PUBLIC_ID:
37781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!XmlIsPublicId(enc, s, next, eventPP))
3779fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_SYNTAX;
3780fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (declNotationName) {  /* means notationDeclHandler != NULL */
3781fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        XML_Char *tem = poolStoreString(&tempPool,
3782fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        enc,
3783fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        s + enc->minBytesPerChar,
3784fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        next - enc->minBytesPerChar);
3785fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!tem)
3786fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3787fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        normalizePublicId(tem);
3788fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        declNotationPublicId = tem;
3789fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolFinish(&tempPool);
3790fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
37911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
37921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
37931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_NOTATION_SYSTEM_ID:
37941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (declNotationName && notationDeclHandler) {
3795fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        const XML_Char *systemId
3796fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          = poolStoreString(&tempPool, enc,
3797fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            s + enc->minBytesPerChar,
3798fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            next - enc->minBytesPerChar);
3799fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!systemId)
3800fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3801fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *eventEndPP = s;
3802fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        notationDeclHandler(handlerArg,
3803fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            declNotationName,
3804fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            curBase,
3805fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            systemId,
3806fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            declNotationPublicId);
3807fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
38081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
38091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      poolClear(&tempPool);
38101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
38111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_NOTATION_NO_SYSTEM_ID:
38121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (declNotationPublicId && notationDeclHandler) {
3813fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *eventEndPP = s;
3814fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        notationDeclHandler(handlerArg,
3815fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            declNotationName,
3816fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            curBase,
3817fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            0,
3818fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            declNotationPublicId);
3819fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
38201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
38211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      poolClear(&tempPool);
38221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
38231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ERROR:
38241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      switch (tok) {
38251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      case XML_TOK_PARAM_ENTITY_REF:
3826fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_PARAM_ENTITY_REF;
38271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      case XML_TOK_XML_DECL:
3828fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_MISPLACED_XML_PI;
38291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      default:
3830fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_SYNTAX;
38311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
38321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
38331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_IGNORE_SECT:
38341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      {
3835fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        enum XML_Error result;
3836fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (defaultHandler)
3837fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          reportDefault(parser, enc, s, next);
3838fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
3839fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        result = doIgnoreSection(parser, enc, &next, end, nextPtr);
3840fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!next) {
3841fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          processor = ignoreSectionProcessor;
3842fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return result;
3843fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
38441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
38451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
38461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
38471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_GROUP_OPEN:
38481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (prologState.level >= groupSize) {
3849fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (groupSize) {
3850fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          char *temp = (char *)REALLOC(groupConnector, groupSize *= 2);
3851fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (temp == NULL)
3852fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_NO_MEMORY;
3853fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          groupConnector = temp;
3854fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (dtd->scaffIndex) {
3855fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            int *temp = (int *)REALLOC(dtd->scaffIndex,
3856fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                          groupSize * sizeof(int));
3857fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (temp == NULL)
3858fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_NO_MEMORY;
3859fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            dtd->scaffIndex = temp;
3860fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
3861fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3862fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else {
3863fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          groupConnector = (char *)MALLOC(groupSize = 32);
3864fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!groupConnector)
3865fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_NO_MEMORY;
3866fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
38671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
38681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      groupConnector[prologState.level] = 0;
3869fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->in_eldecl) {
3870fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        int myindex = nextScaffoldPart(parser);
3871fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (myindex < 0)
3872fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3873fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->scaffIndex[dtd->scaffLevel] = myindex;
3874fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->scaffLevel++;
3875fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->scaffold[myindex].type = XML_CTYPE_SEQ;
3876fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (elementDeclHandler)
3877fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          handleDefault = XML_FALSE;
38781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
38791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
38801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_GROUP_SEQUENCE:
38811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (groupConnector[prologState.level] == '|')
3882fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_SYNTAX;
38831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      groupConnector[prologState.level] = ',';
3884fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->in_eldecl && elementDeclHandler)
3885fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
38861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
38871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_GROUP_CHOICE:
38881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (groupConnector[prologState.level] == ',')
3889fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_SYNTAX;
3890fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->in_eldecl
3891fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          && !groupConnector[prologState.level]
3892fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
3893fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              != XML_CTYPE_MIXED)
3894fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          ) {
3895fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
3896fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            = XML_CTYPE_CHOICE;
3897fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (elementDeclHandler)
3898fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          handleDefault = XML_FALSE;
38991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
39001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      groupConnector[prologState.level] = '|';
39011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
39021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_PARAM_ENTITY_REF:
39031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
39041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_INNER_PARAM_ENTITY_REF:
3905fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      /* PE references in internal subset are
3906fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         not allowed within declarations      */
3907fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (prologState.documentEntity &&
3908fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          role == XML_ROLE_INNER_PARAM_ENTITY_REF)
3909fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_PARAM_ENTITY_REF;
3910fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      dtd->hasParamEntityRefs = XML_TRUE;
3911fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!paramEntityParsing)
3912fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->keepProcessing = dtd->standalone;
3913fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      else {
3914fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        const XML_Char *name;
3915fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        ENTITY *entity;
3916fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        name = poolStoreString(&dtd->pool, enc,
3917fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                s + enc->minBytesPerChar,
3918fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                next - enc->minBytesPerChar);
3919fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!name)
3920fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3921fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0);
3922fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolDiscard(&dtd->pool);
3923fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        /* first, determine if a check for an existing declaration is needed;
3924fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           if yes, check that the entity exists, and that it is internal,
3925fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           otherwise call the skipped entity handler
3926fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        */
3927fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (prologState.documentEntity &&
3928fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            (dtd->standalone
3929fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             ? !openInternalEntities
3930fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             : !dtd->hasParamEntityRefs)) {
3931fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!entity)
3932fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_UNDEFINED_ENTITY;
3933fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          else if (!entity->is_internal)
3934fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_ENTITY_DECLARED_IN_PE;
3935fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3936fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else if (!entity) {
3937fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          dtd->keepProcessing = dtd->standalone;
3938fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          /* cannot report skipped entities in declarations */
3939fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) {
3940fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            skippedEntityHandler(handlerArg, name, 1);
3941fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            handleDefault = XML_FALSE;
3942fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
3943fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          break;
3944fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3945fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (entity->open)
3946fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_RECURSIVE_ENTITY_REF;
3947fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (entity->textPtr) {
3948fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          enum XML_Error result;
3949fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          result = processInternalParamEntity(parser, entity);
3950fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (result != XML_ERROR_NONE)
3951fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return result;
3952fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          handleDefault = XML_FALSE;
3953fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          break;
3954fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3955fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (externalEntityRefHandler) {
3956fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          dtd->paramEntityRead = XML_FALSE;
3957fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          entity->open = XML_TRUE;
3958fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!externalEntityRefHandler(externalEntityRefHandlerArg,
3959fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        0,
3960fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        entity->base,
3961fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        entity->systemId,
3962fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        entity->publicId)) {
3963fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            entity->open = XML_FALSE;
3964fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
3965fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
3966fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          entity->open = XML_FALSE;
3967fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          handleDefault = XML_FALSE;
3968fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!dtd->paramEntityRead) {
3969fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            dtd->keepProcessing = dtd->standalone;
3970fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            break;
3971fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
3972fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
3973fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else {
3974fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          dtd->keepProcessing = dtd->standalone;
3975fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          break;
3976fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
39771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
39781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
3979fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!dtd->standalone &&
3980fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          notStandaloneHandler &&
3981fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          !notStandaloneHandler(handlerArg))
3982fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NOT_STANDALONE;
39831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
39841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
3985fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    /* Element declaration stuff */
39861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
39871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_ELEMENT_NAME:
39881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (elementDeclHandler) {
3989fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        declElementType = getElementType(parser, enc, s, next);
3990fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!declElementType)
3991fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
3992fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->scaffLevel = 0;
3993fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->scaffCount = 0;
3994fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->in_eldecl = XML_TRUE;
3995fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
39961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
39971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
39981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
39991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_CONTENT_ANY:
40001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_CONTENT_EMPTY:
4001fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->in_eldecl) {
4002fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (elementDeclHandler) {
4003fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content));
4004fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!content)
4005fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_NO_MEMORY;
4006fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          content->quant = XML_CQUANT_NONE;
4007fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          content->name = NULL;
4008fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          content->numchildren = 0;
4009fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          content->children = NULL;
4010fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          content->type = ((role == XML_ROLE_CONTENT_ANY) ?
4011fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           XML_CTYPE_ANY :
4012fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           XML_CTYPE_EMPTY);
4013fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          *eventEndPP = s;
4014fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          elementDeclHandler(handlerArg, declElementType->name, content);
4015fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          handleDefault = XML_FALSE;
4016fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4017fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->in_eldecl = XML_FALSE;
40181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
40191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
4020fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
40211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_CONTENT_PCDATA:
4022fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->in_eldecl) {
4023fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
4024fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            = XML_CTYPE_MIXED;
4025fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (elementDeclHandler)
4026fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          handleDefault = XML_FALSE;
40271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
40281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
40291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
40301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_CONTENT_ELEMENT:
40311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      quant = XML_CQUANT_NONE;
40321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      goto elementContent;
40331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_CONTENT_ELEMENT_OPT:
40341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      quant = XML_CQUANT_OPT;
40351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      goto elementContent;
40361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_CONTENT_ELEMENT_REP:
40371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      quant = XML_CQUANT_REP;
40381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      goto elementContent;
40391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_CONTENT_ELEMENT_PLUS:
40401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      quant = XML_CQUANT_PLUS;
40411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    elementContent:
4042fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->in_eldecl) {
4043fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        ELEMENT_TYPE *el;
4044fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        const XML_Char *name;
4045fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        int nameLen;
4046fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        const char *nxt = (quant == XML_CQUANT_NONE
4047fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           ? next
4048fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                           : next - enc->minBytesPerChar);
4049fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        int myindex = nextScaffoldPart(parser);
4050fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (myindex < 0)
4051fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
4052fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->scaffold[myindex].type = XML_CTYPE_NAME;
4053fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->scaffold[myindex].quant = quant;
4054fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        el = getElementType(parser, enc, s, nxt);
4055fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!el)
4056fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
4057fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        name = el->name;
4058fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->scaffold[myindex].name = name;
4059fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        nameLen = 0;
4060fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        for (; name[nameLen++]; );
4061fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->contentStringLen +=  nameLen;
4062fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (elementDeclHandler)
4063fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          handleDefault = XML_FALSE;
4064fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      }
40651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
40661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
40671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_GROUP_CLOSE:
40681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      quant = XML_CQUANT_NONE;
40691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      goto closeGroup;
40701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_GROUP_CLOSE_OPT:
40711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      quant = XML_CQUANT_OPT;
40721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      goto closeGroup;
40731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_GROUP_CLOSE_REP:
40741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      quant = XML_CQUANT_REP;
40751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      goto closeGroup;
40761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_ROLE_GROUP_CLOSE_PLUS:
40771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      quant = XML_CQUANT_PLUS;
40781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    closeGroup:
4079fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->in_eldecl) {
4080fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (elementDeclHandler)
4081fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          handleDefault = XML_FALSE;
4082fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->scaffLevel--;
4083fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant;
4084fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (dtd->scaffLevel == 0) {
4085fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!handleDefault) {
4086fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            XML_Content *model = build_model(parser);
4087fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (!model)
4088fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_NO_MEMORY;
4089fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            *eventEndPP = s;
4090fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            elementDeclHandler(handlerArg, declElementType->name, model);
4091fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
4092fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          dtd->in_eldecl = XML_FALSE;
4093fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          dtd->contentStringLen = 0;
4094fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
40951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
40961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
40971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      /* End element declaration stuff */
40981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4099fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_ROLE_PI:
4100fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!reportProcessingInstruction(parser, enc, s, next))
4101fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
4102fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      handleDefault = XML_FALSE;
41031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
4104fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_ROLE_COMMENT:
4105fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!reportComment(parser, enc, s, next))
4106fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
4107fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      handleDefault = XML_FALSE;
4108fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      break;
4109fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_ROLE_NONE:
41101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      switch (tok) {
41111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      case XML_TOK_BOM:
4112fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
4113fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        break;
41141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
4115fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      break;
4116fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_ROLE_DOCTYPE_NONE:
4117fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (startDoctypeDeclHandler)
4118fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
4119fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      break;
4120fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_ROLE_ENTITY_NONE:
4121fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->keepProcessing && entityDeclHandler)
4122fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
4123fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      break;
4124fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_ROLE_NOTATION_NONE:
4125fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (notationDeclHandler)
4126fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
4127fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      break;
4128fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_ROLE_ATTLIST_NONE:
4129fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (dtd->keepProcessing && attlistDeclHandler)
4130fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
4131fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      break;
4132fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    case XML_ROLE_ELEMENT_NONE:
4133fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (elementDeclHandler)
4134fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        handleDefault = XML_FALSE;
4135fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      break;
4136fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    } /* end of big switch */
4137fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
4138fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (handleDefault && defaultHandler)
4139fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      reportDefault(parser, enc, s, next);
4140fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
41411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    s = next;
41421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    tok = XmlPrologTok(enc, s, end, &next);
41431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
41441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* not reached */
41451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
41461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4147fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
4148fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisepilogProcessor(XML_Parser parser,
4149fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                const char *s,
4150fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                const char *end,
4151fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                const char **nextPtr)
41521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
41531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  processor = epilogProcessor;
41541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  eventPtr = s;
41551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
4156fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    const char *next = NULL;
41571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int tok = XmlPrologTok(encoding, s, end, &next);
41581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventEndPtr = next;
41591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    switch (tok) {
4160fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    /* report partial linebreak - it might be the last token */
41611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case -XML_TOK_PROLOG_S:
41621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (defaultHandler) {
4163fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        eventEndPtr = next;
4164fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        reportDefault(parser, encoding, s, next);
41651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
4166fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (nextPtr)
4167fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *nextPtr = next;
4168fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_ERROR_NONE;
41691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_NONE:
41701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (nextPtr)
4171fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *nextPtr = s;
41721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NONE;
41731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_PROLOG_S:
41741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (defaultHandler)
4175fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        reportDefault(parser, encoding, s, next);
41761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
41771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_PI:
41781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!reportProcessingInstruction(parser, encoding, s, next))
4179fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
41801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
41811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_COMMENT:
41821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!reportComment(parser, encoding, s, next))
4183fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
41841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
41851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_INVALID:
41861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      eventPtr = next;
41871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_INVALID_TOKEN;
41881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_PARTIAL:
41891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (nextPtr) {
4190fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *nextPtr = s;
4191fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NONE;
41921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
41931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_UNCLOSED_TOKEN;
41941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_PARTIAL_CHAR:
41951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (nextPtr) {
4196fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *nextPtr = s;
4197fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NONE;
41981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
41991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_PARTIAL_CHAR;
42001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    default:
42011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_JUNK_AFTER_DOC_ELEMENT;
42021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
42031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    eventPtr = s = next;
42041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
42051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
42061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
42071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
42081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
42091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
42101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisprocessInternalParamEntity(XML_Parser parser, ENTITY *entity)
42111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
42121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *s, *end, *next;
42131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int tok;
42141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  enum XML_Error result;
42151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  OPEN_INTERNAL_ENTITY openEntity;
4216fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  entity->open = XML_TRUE;
42171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  openEntity.next = openInternalEntities;
42181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  openInternalEntities = &openEntity;
42191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  openEntity.entity = entity;
4220fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  openEntity.internalEventPtr = NULL;
4221fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  openEntity.internalEventEndPtr = NULL;
42221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  s = (char *)entity->textPtr;
42231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  end = (char *)(entity->textPtr + entity->textLen);
42241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  tok = XmlPrologTok(internalEncoding, s, end, &next);
42251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  result = doProlog(parser, internalEncoding, s, end, tok, next, 0);
4226fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  entity->open = XML_FALSE;
42271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  openInternalEntities = openEntity.next;
42281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return result;
42291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
42301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
42311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
42321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4233fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL
4234fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwiserrorProcessor(XML_Parser parser,
4235fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const char *s,
4236fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const char *end,
4237fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const char **nextPtr)
42381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
42391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return errorCode;
42401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
42411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
42421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
4243fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisstoreAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
4244fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                    const char *ptr, const char *end,
4245fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                    STRING_POOL *pool)
42461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
4247fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr,
4248fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                               end, pool);
42491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (result)
42501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return result;
42511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20)
42521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    poolChop(pool);
42531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!poolAppendChar(pool, XML_T('\0')))
42541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return XML_ERROR_NO_MEMORY;
42551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return XML_ERROR_NONE;
42561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
42571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
42581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error
4259fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisappendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
4260fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                     const char *ptr, const char *end,
4261fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                     STRING_POOL *pool)
42621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
4263fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD * const dtd = _dtd;  /* save one level of indirection */
42641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
42651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const char *next;
42661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int tok = XmlAttributeValueTok(enc, ptr, end, &next);
42671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    switch (tok) {
42681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_NONE:
42691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_NONE;
42701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_INVALID:
42711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (enc == encoding)
4272fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        eventPtr = next;
42731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_INVALID_TOKEN;
42741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_PARTIAL:
42751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (enc == encoding)
4276fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        eventPtr = ptr;
42771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_INVALID_TOKEN;
42781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_CHAR_REF:
42791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      {
4280fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        XML_Char buf[XML_ENCODE_MAX];
4281fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        int i;
4282fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        int n = XmlCharRefNumber(enc, ptr);
4283fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (n < 0) {
4284fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (enc == encoding)
4285fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            eventPtr = ptr;
4286fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_BAD_CHAR_REF;
4287fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4288fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!isCdata
4289fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            && n == 0x20 /* space */
4290fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20))
4291fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          break;
4292fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        n = XmlEncode(n, (ICHAR *)buf);
4293fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!n) {
4294fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (enc == encoding)
4295fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            eventPtr = ptr;
4296fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_BAD_CHAR_REF;
4297fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4298fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        for (i = 0; i < n; i++) {
4299fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!poolAppendChar(pool, buf[i]))
4300fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_NO_MEMORY;
4301fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
43021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
43031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
43041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_DATA_CHARS:
43051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!poolAppend(pool, enc, ptr, next))
4306fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
43071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
43081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_TRAILING_CR:
43091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      next = ptr + enc->minBytesPerChar;
43101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      /* fall through */
43111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_ATTRIBUTE_VALUE_S:
43121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_DATA_NEWLINE:
43131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20))
4314fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        break;
43151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!poolAppendChar(pool, 0x20))
4316fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_ERROR_NO_MEMORY;
43171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
43181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_ENTITY_REF:
43191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      {
4320fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        const XML_Char *name;
4321fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        ENTITY *entity;
4322fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        char checkEntityDecl;
4323fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc,
4324fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                              ptr + enc->minBytesPerChar,
4325fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                              next - enc->minBytesPerChar);
4326fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (ch) {
4327fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!poolAppendChar(pool, ch))
4328fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                return XML_ERROR_NO_MEMORY;
4329fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          break;
4330fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4331fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        name = poolStoreString(&temp2Pool, enc,
4332fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               ptr + enc->minBytesPerChar,
4333fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               next - enc->minBytesPerChar);
4334fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!name)
4335fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_NO_MEMORY;
4336fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0);
4337fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolDiscard(&temp2Pool);
4338fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        /* first, determine if a check for an existing declaration is needed;
4339fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           if yes, check that the entity exists, and that it is internal,
4340fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           otherwise call the default handler (if called from content)
4341fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        */
4342fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (pool == &dtd->pool)  /* are we called from prolog? */
4343fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          checkEntityDecl =
4344fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
4345fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              prologState.documentEntity &&
4346fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */
4347fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              (dtd->standalone
4348fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               ? !openInternalEntities
4349fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               : !dtd->hasParamEntityRefs);
4350fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else /* if (pool == &tempPool): we are called from content */
4351fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone;
4352fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (checkEntityDecl) {
4353fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!entity)
4354fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_UNDEFINED_ENTITY;
4355fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          else if (!entity->is_internal)
4356fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_ERROR_ENTITY_DECLARED_IN_PE;
4357fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4358fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else if (!entity) {
4359fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          /* cannot report skipped entity here - see comments on
4360fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             skippedEntityHandler
4361fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (skippedEntityHandler)
4362fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            skippedEntityHandler(handlerArg, name, 0);
4363fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          */
4364fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if ((pool == &tempPool) && defaultHandler)
4365fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            reportDefault(parser, enc, ptr, next);
4366fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          break;
4367fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4368fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (entity->open) {
4369fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (enc == encoding)
4370fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            eventPtr = ptr;
4371fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_RECURSIVE_ENTITY_REF;
4372fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4373fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (entity->notation) {
4374fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (enc == encoding)
4375fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            eventPtr = ptr;
4376fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_ERROR_BINARY_ENTITY_REF;
4377fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4378fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!entity->textPtr) {
4379fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (enc == encoding)
4380fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            eventPtr = ptr;
4381fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF;
4382fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4383fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else {
4384fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          enum XML_Error result;
4385fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          const XML_Char *textEnd = entity->textPtr + entity->textLen;
4386fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          entity->open = XML_TRUE;
4387fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          result = appendAttributeValue(parser, internalEncoding, isCdata,
4388fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        (char *)entity->textPtr,
4389fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        (char *)textEnd, pool);
4390fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          entity->open = XML_FALSE;
4391fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (result)
4392fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return result;
4393fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
43941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
43951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
43961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    default:
43971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (enc == encoding)
4398fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        eventPtr = ptr;
43991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return XML_ERROR_UNEXPECTED_STATE;
44001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
44011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    ptr = next;
44021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
44031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* not reached */
44041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
44051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4406fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error
4407fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisstoreEntityValue(XML_Parser parser,
4408fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                 const ENCODING *enc,
4409fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                 const char *entityTextPtr,
4410fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                 const char *entityTextEnd)
44111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
4412fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD * const dtd = _dtd;  /* save one level of indirection */
4413fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  STRING_POOL *pool = &(dtd->entityValuePool);
4414fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  enum XML_Error result = XML_ERROR_NONE;
4415fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
4416fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  int oldInEntityValue = prologState.inEntityValue;
4417fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  prologState.inEntityValue = 1;
4418fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */
4419fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  /* never return Null for the value argument in EntityDeclHandler,
4420fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     since this would indicate an external entity; therefore we
4421fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis     have to make sure that entityValuePool.start is not null */
4422fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (!pool->blocks) {
4423fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (!poolGrow(pool))
4424fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_ERROR_NO_MEMORY;
4425fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
4426fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
44271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
44281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const char *next;
44291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next);
44301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    switch (tok) {
44311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_PARAM_ENTITY_REF:
44321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
4433fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (isParamEntity || enc != encoding) {
4434fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        const XML_Char *name;
4435fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        ENTITY *entity;
4436fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        name = poolStoreString(&tempPool, enc,
4437fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               entityTextPtr + enc->minBytesPerChar,
4438fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                               next - enc->minBytesPerChar);
4439fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!name) {
4440fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          result = XML_ERROR_NO_MEMORY;
4441fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          goto endEntityValue;
4442fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4443fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0);
4444fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolDiscard(&tempPool);
4445fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!entity) {
4446fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          /* not a well-formedness error - see XML 1.0: WFC Entity Declared */
4447fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          /* cannot report skipped entity here - see comments on
4448fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             skippedEntityHandler
4449fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (skippedEntityHandler)
4450fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            skippedEntityHandler(handlerArg, name, 0);
4451fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          */
4452fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          dtd->keepProcessing = dtd->standalone;
4453fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          goto endEntityValue;
4454fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4455fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (entity->open) {
4456fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (enc == encoding)
4457fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            eventPtr = entityTextPtr;
4458fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          result = XML_ERROR_RECURSIVE_ENTITY_REF;
4459fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          goto endEntityValue;
4460fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4461fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (entity->systemId) {
4462fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (externalEntityRefHandler) {
4463fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            dtd->paramEntityRead = XML_FALSE;
4464fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            entity->open = XML_TRUE;
4465fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (!externalEntityRefHandler(externalEntityRefHandlerArg,
4466fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                          0,
4467fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                          entity->base,
4468fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                          entity->systemId,
4469fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                          entity->publicId)) {
4470fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              entity->open = XML_FALSE;
4471fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              result = XML_ERROR_EXTERNAL_ENTITY_HANDLING;
4472fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              goto endEntityValue;
4473fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            }
4474fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            entity->open = XML_FALSE;
4475fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (!dtd->paramEntityRead)
4476fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              dtd->keepProcessing = dtd->standalone;
4477fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
4478fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          else
4479fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            dtd->keepProcessing = dtd->standalone;
4480fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4481fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else {
4482fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          entity->open = XML_TRUE;
4483fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          result = storeEntityValue(parser,
4484fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                    internalEncoding,
4485fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                    (char *)entity->textPtr,
4486fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                    (char *)(entity->textPtr
4487fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                             + entity->textLen));
4488fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          entity->open = XML_FALSE;
4489fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (result)
4490fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            goto endEntityValue;
4491fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4492fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        break;
44931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
44941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
4495fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      /* in the internal subset, PE references are not legal
4496fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         within markup declarations, e.g entity values in this case */
44971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      eventPtr = entityTextPtr;
4498fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      result = XML_ERROR_PARAM_ENTITY_REF;
4499fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      goto endEntityValue;
45001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_NONE:
4501fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      result = XML_ERROR_NONE;
4502fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      goto endEntityValue;
45031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_ENTITY_REF:
45041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_DATA_CHARS:
4505fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!poolAppend(pool, enc, entityTextPtr, next)) {
4506fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        result = XML_ERROR_NO_MEMORY;
4507fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        goto endEntityValue;
4508fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      }
45091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
45101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_TRAILING_CR:
45111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      next = entityTextPtr + enc->minBytesPerChar;
45121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      /* fall through */
45131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_DATA_NEWLINE:
4514fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (pool->end == pool->ptr && !poolGrow(pool)) {
4515fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              result = XML_ERROR_NO_MEMORY;
4516fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        goto endEntityValue;
4517fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      }
45181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *(pool->ptr)++ = 0xA;
45191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
45201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_CHAR_REF:
45211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      {
4522fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        XML_Char buf[XML_ENCODE_MAX];
4523fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        int i;
4524fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        int n = XmlCharRefNumber(enc, entityTextPtr);
4525fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (n < 0) {
4526fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (enc == encoding)
4527fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            eventPtr = entityTextPtr;
4528fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          result = XML_ERROR_BAD_CHAR_REF;
4529fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          goto endEntityValue;
4530fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4531fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        n = XmlEncode(n, (ICHAR *)buf);
4532fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!n) {
4533fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (enc == encoding)
4534fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            eventPtr = entityTextPtr;
4535fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          result = XML_ERROR_BAD_CHAR_REF;
4536fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          goto endEntityValue;
4537fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4538fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        for (i = 0; i < n; i++) {
4539fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (pool->end == pool->ptr && !poolGrow(pool)) {
4540fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            result = XML_ERROR_NO_MEMORY;
4541fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            goto endEntityValue;
4542fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
4543fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          *(pool->ptr)++ = buf[i];
4544fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
45451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
45461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
45471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_PARTIAL:
45481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (enc == encoding)
4549fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        eventPtr = entityTextPtr;
4550fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      result = XML_ERROR_INVALID_TOKEN;
4551fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      goto endEntityValue;
45521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case XML_TOK_INVALID:
45531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (enc == encoding)
4554fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        eventPtr = next;
4555fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      result = XML_ERROR_INVALID_TOKEN;
4556fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      goto endEntityValue;
45571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    default:
45581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (enc == encoding)
4559fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        eventPtr = entityTextPtr;
4560fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      result = XML_ERROR_UNEXPECTED_STATE;
4561fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      goto endEntityValue;
45621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
45631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    entityTextPtr = next;
45641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
4565fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisendEntityValue:
4566fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
4567fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  prologState.inEntityValue = oldInEntityValue;
4568fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */
4569fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return result;
45701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
45711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4572fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL
45731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisnormalizeLines(XML_Char *s)
45741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
45751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Char *p;
45761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;; s++) {
45771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (*s == XML_T('\0'))
45781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return;
45791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (*s == 0xD)
45801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
45811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
45821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  p = s;
45831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  do {
45841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (*s == 0xD) {
45851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *p++ = 0xA;
45861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (*++s == 0xA)
45871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        s++;
45881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
45891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    else
45901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *p++ = *s++;
45911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  } while (*s);
45921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  *p = XML_T('\0');
45931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
45941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
45951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic int
4596fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisreportProcessingInstruction(XML_Parser parser, const ENCODING *enc,
4597fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            const char *start, const char *end)
45981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
45991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *target;
46001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Char *data;
46011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const char *tem;
46021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!processingInstructionHandler) {
46031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (defaultHandler)
46041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      reportDefault(parser, enc, start, end);
46051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return 1;
46061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
46071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  start += enc->minBytesPerChar * 2;
46081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  tem = start + XmlNameLength(enc, start);
46091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  target = poolStoreString(&tempPool, enc, start, tem);
46101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!target)
46111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return 0;
46121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  poolFinish(&tempPool);
46131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  data = poolStoreString(&tempPool, enc,
4614fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                        XmlSkipS(enc, tem),
4615fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                        end - enc->minBytesPerChar*2);
46161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!data)
46171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return 0;
46181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  normalizeLines(data);
46191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  processingInstructionHandler(handlerArg, target, data);
46201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  poolClear(&tempPool);
46211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return 1;
46221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
46231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
46241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic int
4625fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisreportComment(XML_Parser parser, const ENCODING *enc,
4626fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              const char *start, const char *end)
46271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
46281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Char *data;
46291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!commentHandler) {
46301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (defaultHandler)
46311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      reportDefault(parser, enc, start, end);
46321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return 1;
46331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
46341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  data = poolStoreString(&tempPool,
46351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis                         enc,
4636fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                         start + enc->minBytesPerChar * 4,
4637fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                         end - enc->minBytesPerChar * 3);
46381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!data)
46391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    return 0;
46401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  normalizeLines(data);
46411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  commentHandler(handlerArg, data);
46421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  poolClear(&tempPool);
46431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return 1;
46441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
46451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
46461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic void
4647fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisreportDefault(XML_Parser parser, const ENCODING *enc,
4648fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              const char *s, const char *end)
46491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
46501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (MUST_CONVERT(enc, s)) {
46511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const char **eventPP;
46521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const char **eventEndPP;
46531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (enc == encoding) {
46541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      eventPP = &eventPtr;
46551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      eventEndPP = &eventEndPtr;
46561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
46571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    else {
46581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      eventPP = &(openInternalEntities->internalEventPtr);
46591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      eventEndPP = &(openInternalEntities->internalEventEndPtr);
46601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
46611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    do {
46621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      ICHAR *dataPtr = (ICHAR *)dataBuf;
46631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);
46641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *eventEndPP = s;
46651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      defaultHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf);
46661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *eventPP = s;
46671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    } while (s != end);
46681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
46691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else
46701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    defaultHandler(handlerArg, (XML_Char *)s, (XML_Char *)end - (XML_Char *)s);
46711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
46721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
46731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
46741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic int
4675fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdefineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata,
4676fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                XML_Bool isId, const XML_Char *value, XML_Parser parser)
46771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
46781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  DEFAULT_ATTRIBUTE *att;
46791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (value || isId) {
46801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    /* The handling of default attributes gets messed up if we have
46811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis       a default which duplicates a non-default. */
46821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int i;
46831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    for (i = 0; i < type->nDefaultAtts; i++)
46841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (attId == type->defaultAtts[i].id)
4685fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return 1;
46861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (isId && !type->idAtt && !attId->xmlns)
46871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      type->idAtt = attId;
46881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
46891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (type->nDefaultAtts == type->allocDefaultAtts) {
46901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (type->allocDefaultAtts == 0) {
46911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      type->allocDefaultAtts = 8;
4692fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts
4693fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                            * sizeof(DEFAULT_ATTRIBUTE));
4694fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!type->defaultAtts)
4695fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return 0;
46961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
46971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    else {
4698fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      DEFAULT_ATTRIBUTE *temp;
4699fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      int count = type->allocDefaultAtts * 2;
4700fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      temp = (DEFAULT_ATTRIBUTE *)
4701fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE)));
4702fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (temp == NULL)
4703fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return 0;
4704fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      type->allocDefaultAtts = count;
4705fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      type->defaultAtts = temp;
47061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
47071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
47081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  att = type->defaultAtts + type->nDefaultAtts;
47091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  att->id = attId;
47101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  att->value = value;
47111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  att->isCdata = isCdata;
47121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!isCdata)
4713fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    attId->maybeTokenized = XML_TRUE;
47141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  type->nDefaultAtts += 1;
47151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return 1;
47161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
47171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4718fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int
4719fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwissetElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType)
47201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
4721fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD * const dtd = _dtd;  /* save one level of indirection */
47221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *name;
47231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (name = elementType->name; *name; name++) {
47241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (*name == XML_T(':')) {
47251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      PREFIX *prefix;
47261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      const XML_Char *s;
47271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      for (s = elementType->name; s != name; s++) {
4728fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!poolAppendChar(&dtd->pool, *s))
4729fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return 0;
47301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
4731fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!poolAppendChar(&dtd->pool, XML_T('\0')))
4732fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return 0;
4733fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool),
4734fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                sizeof(PREFIX));
47351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!prefix)
4736fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return 0;
4737fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (prefix->name == poolStart(&dtd->pool))
4738fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolFinish(&dtd->pool);
47391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else
4740fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolDiscard(&dtd->pool);
47411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      elementType->prefix = prefix;
47421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
47431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
47441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
47451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return 1;
47461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
47471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
47481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic ATTRIBUTE_ID *
4749fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisgetAttributeId(XML_Parser parser, const ENCODING *enc,
4750fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const char *start, const char *end)
47511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
4752fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD * const dtd = _dtd;  /* save one level of indirection */
47531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  ATTRIBUTE_ID *id;
47541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *name;
4755fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (!poolAppendChar(&dtd->pool, XML_T('\0')))
4756fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
4757fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  name = poolStoreString(&dtd->pool, enc, start, end);
47581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!name)
4759fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
47601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  ++name;
4761fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, name, sizeof(ATTRIBUTE_ID));
47621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!id)
4763fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
47641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (id->name != name)
4765fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    poolDiscard(&dtd->pool);
47661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
4767fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    poolFinish(&dtd->pool);
47681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!ns)
47691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      ;
4770fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    else if (name[0] == XML_T('x')
4771fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        && name[1] == XML_T('m')
4772fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        && name[2] == XML_T('l')
4773fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        && name[3] == XML_T('n')
4774fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        && name[4] == XML_T('s')
4775fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        && (name[5] == XML_T('\0') || name[5] == XML_T(':'))) {
4776fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (name[5] == XML_T('\0'))
4777fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        id->prefix = &dtd->defaultPrefix;
47781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else
4779fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        id->prefix = (PREFIX *)lookup(&dtd->prefixes, name + 6, sizeof(PREFIX));
4780fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      id->xmlns = XML_TRUE;
47811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
47821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    else {
47831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      int i;
47841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      for (i = 0; name[i]; i++) {
4785fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (name[i] == XML_T(':')) {
4786fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          int j;
4787fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          for (j = 0; j < i; j++) {
4788fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            if (!poolAppendChar(&dtd->pool, name[j]))
4789fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis              return NULL;
4790fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          }
4791fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!poolAppendChar(&dtd->pool, XML_T('\0')))
4792fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return NULL;
4793fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          id->prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool),
4794fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        sizeof(PREFIX));
4795fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (id->prefix->name == poolStart(&dtd->pool))
4796fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            poolFinish(&dtd->pool);
4797fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          else
4798fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            poolDiscard(&dtd->pool);
4799fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          break;
4800fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
48011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
48021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
48031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
48041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return id;
48051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
48061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
48071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define CONTEXT_SEP XML_T('\f')
48081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4809fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char *
4810fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisgetContext(XML_Parser parser)
48111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
4812fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD * const dtd = _dtd;  /* save one level of indirection */
48131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  HASH_TABLE_ITER iter;
4814fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Bool needSep = XML_FALSE;
48151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4816fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (dtd->defaultPrefix.binding) {
48171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int i;
48181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int len;
48191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!poolAppendChar(&tempPool, XML_T('=')))
4820fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
4821fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    len = dtd->defaultPrefix.binding->uriLen;
48221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (namespaceSeparator != XML_T('\0'))
48231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      len--;
48241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    for (i = 0; i < len; i++)
4825fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i]))
4826fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return NULL;
4827fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    needSep = XML_TRUE;
48281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
48291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4830fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  hashTableIterInit(&iter, &(dtd->prefixes));
48311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
48321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int i;
48331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int len;
48341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const XML_Char *s;
48351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter);
48361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!prefix)
48371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
48381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!prefix->binding)
48391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      continue;
48401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP))
4841fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
48421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    for (s = prefix->name; *s; s++)
48431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!poolAppendChar(&tempPool, *s))
4844fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return NULL;
48451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!poolAppendChar(&tempPool, XML_T('=')))
4846fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
48471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    len = prefix->binding->uriLen;
48481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (namespaceSeparator != XML_T('\0'))
48491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      len--;
48501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    for (i = 0; i < len; i++)
48511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!poolAppendChar(&tempPool, prefix->binding->uri[i]))
4852fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return NULL;
4853fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    needSep = XML_TRUE;
48541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
48551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
48561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4857fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  hashTableIterInit(&iter, &(dtd->generalEntities));
48581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
48591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const XML_Char *s;
48601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    ENTITY *e = (ENTITY *)hashTableIterNext(&iter);
48611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!e)
48621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
48631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!e->open)
48641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      continue;
48651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP))
4866fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
48671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    for (s = e->name; *s; s++)
48681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!poolAppendChar(&tempPool, *s))
48691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        return 0;
4870fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    needSep = XML_TRUE;
48711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
48721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
48731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!poolAppendChar(&tempPool, XML_T('\0')))
4874fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
48751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return tempPool.start;
48761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
48771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4878fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Bool
4879fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwissetContext(XML_Parser parser, const XML_Char *context)
48801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
4881fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD * const dtd = _dtd;  /* save one level of indirection */
48821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  const XML_Char *s = context;
48831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
48841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  while (*context != XML_T('\0')) {
48851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (*s == CONTEXT_SEP || *s == XML_T('\0')) {
48861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      ENTITY *e;
48871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!poolAppendChar(&tempPool, XML_T('\0')))
4888fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_FALSE;
4889fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      e = (ENTITY *)lookup(&dtd->generalEntities, poolStart(&tempPool), 0);
48901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (e)
4891fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        e->open = XML_TRUE;
48921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (*s != XML_T('\0'))
4893fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        s++;
48941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      context = s;
48951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      poolDiscard(&tempPool);
48961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
4897fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    else if (*s == XML_T('=')) {
48981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      PREFIX *prefix;
48991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (poolLength(&tempPool) == 0)
4900fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        prefix = &dtd->defaultPrefix;
49011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else {
4902fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!poolAppendChar(&tempPool, XML_T('\0')))
4903fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_FALSE;
4904fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&tempPool),
4905fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                  sizeof(PREFIX));
4906fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!prefix)
4907fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_FALSE;
49081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        if (prefix->name == poolStart(&tempPool)) {
4909fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          prefix->name = poolCopyString(&dtd->pool, prefix->name);
4910fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!prefix->name)
4911fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return XML_FALSE;
4912fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
4913fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        poolDiscard(&tempPool);
49141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
4915fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      for (context = s + 1;
4916fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           *context != CONTEXT_SEP && *context != XML_T('\0');
4917fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           context++)
49181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis        if (!poolAppendChar(&tempPool, *context))
4919fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return XML_FALSE;
49201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!poolAppendChar(&tempPool, XML_T('\0')))
4921fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_FALSE;
4922fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (addBinding(parser, prefix, 0, poolStart(&tempPool),
4923fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                     &inheritedBindings) != XML_ERROR_NONE)
4924fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_FALSE;
49251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      poolDiscard(&tempPool);
49261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (*context != XML_T('\0'))
4927fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        ++context;
49281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      s = context;
49291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
49301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    else {
49311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!poolAppendChar(&tempPool, *s))
4932fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return XML_FALSE;
49331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      s++;
49341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
49351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
4936fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return XML_TRUE;
49371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
49381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4939fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL
4940fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisnormalizePublicId(XML_Char *publicId)
49411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
49421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Char *p = publicId;
49431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Char *s;
49441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (s = publicId; *s; s++) {
49451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    switch (*s) {
49461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case 0x20:
49471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case 0xD:
49481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    case 0xA:
49491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (p != publicId && p[-1] != 0x20)
4950fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        *p++ = 0x20;
49511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
49521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    default:
49531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *p++ = *s;
49541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
49551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
49561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (p != publicId && p[-1] == 0x20)
49571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    --p;
49581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  *p = XML_T('\0');
49591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
49601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4961fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic DTD *
4962fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdtdCreate(const XML_Memory_Handling_Suite *ms)
49631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
4964fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD));
4965fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (p == NULL)
4966fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return p;
49671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  poolInit(&(p->pool), ms);
4968fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
4969fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  poolInit(&(p->entityValuePool), ms);
4970fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */
49711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableInit(&(p->generalEntities), ms);
49721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableInit(&(p->elementTypes), ms);
49731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableInit(&(p->attributeIds), ms);
49741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableInit(&(p->prefixes), ms);
49751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
4976fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->paramEntityRead = XML_FALSE;
49771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableInit(&(p->paramEntities), ms);
49781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
4979fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->defaultPrefix.name = NULL;
4980fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->defaultPrefix.binding = NULL;
49811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4982fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->in_eldecl = XML_FALSE;
4983fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->scaffIndex = NULL;
4984fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->scaffold = NULL;
49851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  p->scaffLevel = 0;
49861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  p->scaffSize = 0;
49871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  p->scaffCount = 0;
4988fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->contentStringLen = 0;
49891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4990fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->keepProcessing = XML_TRUE;
4991fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->hasParamEntityRefs = XML_FALSE;
4992fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->standalone = XML_FALSE;
4993fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return p;
49941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
49951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
4996fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void
4997fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdtdReset(DTD *p, const XML_Memory_Handling_Suite *ms)
4998fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
4999fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  HASH_TABLE_ITER iter;
5000fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  hashTableIterInit(&iter, &(p->elementTypes));
5001fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  for (;;) {
5002fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);
5003fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (!e)
5004fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      break;
5005fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (e->allocDefaultAtts != 0)
5006fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      ms->free_fcn(e->defaultAtts);
5007fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
5008fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  hashTableClear(&(p->generalEntities));
50091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
5010fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->paramEntityRead = XML_FALSE;
5011fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  hashTableClear(&(p->paramEntities));
5012fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */
5013fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  hashTableClear(&(p->elementTypes));
5014fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  hashTableClear(&(p->attributeIds));
5015fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  hashTableClear(&(p->prefixes));
5016fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  poolClear(&(p->pool));
5017fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
5018fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  poolClear(&(p->entityValuePool));
5019fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */
5020fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->defaultPrefix.name = NULL;
5021fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->defaultPrefix.binding = NULL;
50221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5023fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->in_eldecl = XML_FALSE;
5024fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (p->scaffIndex) {
5025fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    ms->free_fcn(p->scaffIndex);
5026fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    p->scaffIndex = NULL;
5027fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
5028fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (p->scaffold) {
5029fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    ms->free_fcn(p->scaffold);
5030fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    p->scaffold = NULL;
5031fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
5032fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->scaffLevel = 0;
5033fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->scaffSize = 0;
5034fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->scaffCount = 0;
5035fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->contentStringLen = 0;
50361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5037fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->keepProcessing = XML_TRUE;
5038fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->hasParamEntityRefs = XML_FALSE;
5039fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->standalone = XML_FALSE;
5040fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
50411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5042fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void
5043fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms)
50441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
50451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  HASH_TABLE_ITER iter;
50461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableIterInit(&iter, &(p->elementTypes));
50471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
50481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);
50491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!e)
50501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
50511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (e->allocDefaultAtts != 0)
5052fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      ms->free_fcn(e->defaultAtts);
50531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
50541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableDestroy(&(p->generalEntities));
50551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
50561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableDestroy(&(p->paramEntities));
50571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
50581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableDestroy(&(p->elementTypes));
50591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableDestroy(&(p->attributeIds));
50601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableDestroy(&(p->prefixes));
50611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  poolDestroy(&(p->pool));
5062fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD
5063fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  poolDestroy(&(p->entityValuePool));
5064fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */
5065fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (isDocEntity) {
5066fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (p->scaffIndex)
5067fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      ms->free_fcn(p->scaffIndex);
5068fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (p->scaffold)
5069fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      ms->free_fcn(p->scaffold);
5070fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
5071fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  ms->free_fcn(p);
50721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
50731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5074fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise.
5075fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis   The new DTD has already been initialized.
5076fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/
5077fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int
5078fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
50791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
50801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  HASH_TABLE_ITER iter;
50811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
50821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* Copy the prefix table. */
50831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
50841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableIterInit(&iter, &(oldDtd->prefixes));
50851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
50861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const XML_Char *name;
50871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter);
50881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!oldP)
50891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
50901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    name = poolCopyString(&(newDtd->pool), oldP->name);
50911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!name)
50921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return 0;
50931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!lookup(&(newDtd->prefixes), name, sizeof(PREFIX)))
50941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return 0;
50951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
50961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
50971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableIterInit(&iter, &(oldDtd->attributeIds));
50981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
50991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* Copy the attribute id table. */
51001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
51011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
51021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    ATTRIBUTE_ID *newA;
51031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const XML_Char *name;
51041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter);
51051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
51061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!oldA)
51071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
51081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    /* Remember to allocate the scratch byte before the name. */
51091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!poolAppendChar(&(newDtd->pool), XML_T('\0')))
51101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return 0;
51111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    name = poolCopyString(&(newDtd->pool), oldA->name);
51121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!name)
51131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return 0;
51141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    ++name;
5115fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name,
5116fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                  sizeof(ATTRIBUTE_ID));
51171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!newA)
51181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return 0;
51191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    newA->maybeTokenized = oldA->maybeTokenized;
51201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (oldA->prefix) {
51211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      newA->xmlns = oldA->xmlns;
51221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (oldA->prefix == &oldDtd->defaultPrefix)
5123fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        newA->prefix = &newDtd->defaultPrefix;
51241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else
5125fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes),
5126fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        oldA->prefix->name, 0);
51271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
51281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
51291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
51301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* Copy the element type table. */
51311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
51321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableIterInit(&iter, &(oldDtd->elementTypes));
51331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
51341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
51351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int i;
51361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    ELEMENT_TYPE *newE;
51371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const XML_Char *name;
51381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter);
51391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!oldE)
51401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
51411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    name = poolCopyString(&(newDtd->pool), oldE->name);
51421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!name)
51431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return 0;
5144fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name,
5145fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                  sizeof(ELEMENT_TYPE));
51461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!newE)
51471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return 0;
51481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (oldE->nDefaultAtts) {
5149fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      newE->defaultAtts = (DEFAULT_ATTRIBUTE *)
5150fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));
5151fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!newE->defaultAtts) {
5152fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        ms->free_fcn(newE);
5153fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return 0;
5154fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      }
51551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
51561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (oldE->idAtt)
5157fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      newE->idAtt = (ATTRIBUTE_ID *)
5158fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          lookup(&(newDtd->attributeIds), oldE->idAtt->name, 0);
51591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts;
51601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (oldE->prefix)
5161fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes),
5162fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                      oldE->prefix->name, 0);
51631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    for (i = 0; i < newE->nDefaultAtts; i++) {
5164fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      newE->defaultAtts[i].id = (ATTRIBUTE_ID *)
5165fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0);
51661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata;
51671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (oldE->defaultAtts[i].value) {
5168fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        newE->defaultAtts[i].value
5169fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value);
5170fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!newE->defaultAtts[i].value)
5171fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return 0;
51721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
51731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      else
5174fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        newE->defaultAtts[i].value = NULL;
51751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
51761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
51771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
51781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* Copy the entity tables. */
51791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!copyEntityTable(&(newDtd->generalEntities),
5180fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                       &(newDtd->pool),
5181fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                       &(oldDtd->generalEntities)))
51821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return 0;
51831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
51841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD
51851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!copyEntityTable(&(newDtd->paramEntities),
5186fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                       &(newDtd->pool),
5187fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                       &(oldDtd->paramEntities)))
51881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return 0;
5189fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  newDtd->paramEntityRead = oldDtd->paramEntityRead;
51901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */
51911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5192fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  newDtd->keepProcessing = oldDtd->keepProcessing;
5193fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs;
51941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  newDtd->standalone = oldDtd->standalone;
51951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
51961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  /* Don't want deep copying for scaffolding */
51971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  newDtd->in_eldecl = oldDtd->in_eldecl;
51981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  newDtd->scaffold = oldDtd->scaffold;
51991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  newDtd->contentStringLen = oldDtd->contentStringLen;
52001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  newDtd->scaffSize = oldDtd->scaffSize;
52011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  newDtd->scaffLevel = oldDtd->scaffLevel;
52021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  newDtd->scaffIndex = oldDtd->scaffIndex;
52031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
52041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return 1;
52051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}  /* End dtdCopy */
52061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5207fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int
5208fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwiscopyEntityTable(HASH_TABLE *newTable,
5209fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                STRING_POOL *newPool,
5210fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                const HASH_TABLE *oldTable)
52111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
52121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  HASH_TABLE_ITER iter;
5213fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const XML_Char *cachedOldBase = NULL;
5214fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const XML_Char *cachedNewBase = NULL;
52151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
52161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  hashTableIterInit(&iter, oldTable);
52171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
52181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
52191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    ENTITY *newE;
52201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const XML_Char *name;
52211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter);
52221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!oldE)
52231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
52241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    name = poolCopyString(newPool, oldE->name);
52251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!name)
52261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return 0;
52271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    newE = (ENTITY *)lookup(newTable, name, sizeof(ENTITY));
52281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!newE)
52291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return 0;
52301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (oldE->systemId) {
52311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      const XML_Char *tem = poolCopyString(newPool, oldE->systemId);
52321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!tem)
5233fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return 0;
52341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      newE->systemId = tem;
52351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (oldE->base) {
5236fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (oldE->base == cachedOldBase)
5237fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          newE->base = cachedNewBase;
5238fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        else {
5239fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          cachedOldBase = oldE->base;
5240fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          tem = poolCopyString(newPool, cachedOldBase);
5241fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          if (!tem)
5242fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            return 0;
5243fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          cachedNewBase = newE->base = tem;
5244fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
5245fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      }
5246fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (oldE->publicId) {
5247fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        tem = poolCopyString(newPool, oldE->publicId);
5248fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (!tem)
5249fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          return 0;
5250fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        newE->publicId = tem;
52511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      }
52521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
52531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    else {
5254fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr,
5255fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                            oldE->textLen);
52561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!tem)
5257fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return 0;
52581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      newE->textPtr = tem;
52591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      newE->textLen = oldE->textLen;
52601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
52611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (oldE->notation) {
52621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      const XML_Char *tem = poolCopyString(newPool, oldE->notation);
52631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!tem)
5264fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return 0;
52651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      newE->notation = tem;
52661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
5267fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    newE->is_param = oldE->is_param;
5268fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    newE->is_internal = oldE->is_internal;
52691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
52701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return 1;
52711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
52721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
52731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define INIT_SIZE 64
52741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5275fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int FASTCALL
5276fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwiskeyeq(KEY s1, KEY s2)
52771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
52781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (; *s1 == *s2; s1++, s2++)
52791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (*s1 == 0)
52801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return 1;
52811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return 0;
52821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
52831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5284fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic unsigned long FASTCALL
5285fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwishash(KEY s)
52861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
52871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  unsigned long h = 0;
52881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  while (*s)
52891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    h = (h << 5) + h + (unsigned char)*s++;
52901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return h;
52911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
52921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5293fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic NAMED *
5294fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwislookup(HASH_TABLE *table, KEY name, size_t createSize)
52951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
52961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  size_t i;
52971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (table->size == 0) {
52981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    size_t tsize;
52991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
53001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!createSize)
5301fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
53021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    tsize = INIT_SIZE * sizeof(NAMED *);
5303fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    table->v = (NAMED **)table->mem->malloc_fcn(tsize);
53041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!table->v)
5305fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
53061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    memset(table->v, 0, tsize);
53071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    table->size = INIT_SIZE;
53081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    table->usedLim = INIT_SIZE / 2;
53091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    i = hash(name) & (table->size - 1);
53101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
53111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
53121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    unsigned long h = hash(name);
53131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    for (i = h & (table->size - 1);
53141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis         table->v[i];
53151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis         i == 0 ? i = table->size - 1 : --i) {
53161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (keyeq(name, table->v[i]->name))
5317fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return table->v[i];
53181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
53191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!createSize)
5320fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
53211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (table->used == table->usedLim) {
53221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      /* check for overflow */
53231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      size_t newSize = table->size * 2;
53241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      size_t tsize = newSize * sizeof(NAMED *);
5325fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize);
53261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      if (!newV)
5327fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return NULL;
53281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      memset(newV, 0, tsize);
53291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      for (i = 0; i < table->size; i++)
5330fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        if (table->v[i]) {
5331fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          size_t j;
5332fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          for (j = hash(table->v[i]->name) & (newSize - 1);
5333fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               newV[j];
5334fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               j == 0 ? j = newSize - 1 : --j)
5335fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis            ;
5336fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis          newV[j] = table->v[i];
5337fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        }
53381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      table->mem->free_fcn(table->v);
53391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      table->v = newV;
53401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      table->size = newSize;
53411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      table->usedLim = newSize/2;
53421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      for (i = h & (table->size - 1);
5343fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           table->v[i];
5344fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           i == 0 ? i = table->size - 1 : --i)
5345fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        ;
53461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
53471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
5348fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize);
53491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!table->v[i])
5350fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
53511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  memset(table->v[i], 0, createSize);
53521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  table->v[i]->name = name;
53531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  (table->used)++;
53541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return table->v[i];
53551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
53561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5357fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL
5358fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwishashTableClear(HASH_TABLE *table)
5359fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{
5360fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  size_t i;
5361fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  for (i = 0; i < table->size; i++) {
5362fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    NAMED *p = table->v[i];
5363fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (p) {
5364fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      table->mem->free_fcn(p);
5365fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      table->v[i] = NULL;
5366fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    }
5367fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
5368fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  table->usedLim = table->size / 2;
5369fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  table->used = 0;
5370fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
5371fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
5372fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL
5373fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwishashTableDestroy(HASH_TABLE *table)
53741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
53751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  size_t i;
53761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (i = 0; i < table->size; i++) {
53771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    NAMED *p = table->v[i];
53781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (p)
53791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      table->mem->free_fcn(p);
53801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
53811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (table->v)
53821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    table->mem->free_fcn(table->v);
53831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
53841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5385fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL
5386fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwishashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms)
53871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
53881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  p->size = 0;
53891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  p->usedLim = 0;
53901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  p->used = 0;
5391fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  p->v = NULL;
53921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  p->mem = ms;
53931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
53941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5395fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL
5396fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwishashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table)
53971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
53981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  iter->p = table->v;
53991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  iter->end = iter->p + table->size;
54001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
54011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5402fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic NAMED * FASTCALL
5403fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwishashTableIterNext(HASH_TABLE_ITER *iter)
54041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
54051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  while (iter->p != iter->end) {
54061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    NAMED *tem = *(iter->p)++;
54071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (tem)
54081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return tem;
54091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
5410fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return NULL;
54111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
54121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5413fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL
5414fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms)
54151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
5416fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  pool->blocks = NULL;
5417fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  pool->freeBlocks = NULL;
5418fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  pool->start = NULL;
5419fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  pool->ptr = NULL;
5420fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  pool->end = NULL;
54211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  pool->mem = ms;
54221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
54231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5424fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL
5425fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolClear(STRING_POOL *pool)
54261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
54271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!pool->freeBlocks)
54281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    pool->freeBlocks = pool->blocks;
54291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
54301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    BLOCK *p = pool->blocks;
54311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    while (p) {
54321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      BLOCK *tem = p->next;
54331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      p->next = pool->freeBlocks;
54341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      pool->freeBlocks = p;
54351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      p = tem;
54361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
54371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
5438fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  pool->blocks = NULL;
5439fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  pool->start = NULL;
5440fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  pool->ptr = NULL;
5441fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  pool->end = NULL;
54421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
54431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5444fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL
5445fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolDestroy(STRING_POOL *pool)
54461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
54471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  BLOCK *p = pool->blocks;
54481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  while (p) {
54491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    BLOCK *tem = p->next;
54501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    pool->mem->free_fcn(p);
54511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    p = tem;
54521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
54531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  p = pool->freeBlocks;
54541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  while (p) {
54551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    BLOCK *tem = p->next;
54561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    pool->mem->free_fcn(p);
54571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    p = tem;
54581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
54591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
54601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5461fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Char *
5462fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolAppend(STRING_POOL *pool, const ENCODING *enc,
5463fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           const char *ptr, const char *end)
54641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
54651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!pool->ptr && !poolGrow(pool))
5466fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
54671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (;;) {
54681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end);
54691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (ptr == end)
54701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      break;
54711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!poolGrow(pool))
5472fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
54731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
54741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return pool->start;
54751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
54761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5477fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char * FASTCALL
5478fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolCopyString(STRING_POOL *pool, const XML_Char *s)
54791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
54801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  do {
54811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!poolAppendChar(pool, *s))
5482fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
54831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  } while (*s++);
54841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  s = pool->start;
54851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  poolFinish(pool);
54861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return s;
54871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
54881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5489fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char *
5490fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n)
54911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
54921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!pool->ptr && !poolGrow(pool))
5493fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
54941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  for (; n > 0; --n, s++) {
54951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!poolAppendChar(pool, *s))
5496fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
54971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
54981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  s = pool->start;
54991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  poolFinish(pool);
55001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return s;
55011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
55021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5503fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char * FASTCALL
5504fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolAppendString(STRING_POOL *pool, const XML_Char *s)
55051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
55061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  while (*s) {
55071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!poolAppendChar(pool, *s))
5508fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
55091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    s++;
5510fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  }
55111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return pool->start;
5512fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
55131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5514fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Char *
5515fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolStoreString(STRING_POOL *pool, const ENCODING *enc,
5516fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                const char *ptr, const char *end)
55171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
55181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (!poolAppend(pool, enc, ptr, end))
5519fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
55201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (pool->ptr == pool->end && !poolGrow(pool))
5521fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
55221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  *(pool->ptr)++ = 0;
55231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return pool->start;
55241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
55251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5526fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Bool FASTCALL
5527fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolGrow(STRING_POOL *pool)
55281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
55291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (pool->freeBlocks) {
55301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (pool->start == 0) {
55311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      pool->blocks = pool->freeBlocks;
55321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      pool->freeBlocks = pool->freeBlocks->next;
5533fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      pool->blocks->next = NULL;
55341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      pool->start = pool->blocks->s;
55351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      pool->end = pool->start + pool->blocks->size;
55361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      pool->ptr = pool->start;
5537fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_TRUE;
55381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
55391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (pool->end - pool->start < pool->freeBlocks->size) {
55401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      BLOCK *tem = pool->freeBlocks->next;
55411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      pool->freeBlocks->next = pool->blocks;
55421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      pool->blocks = pool->freeBlocks;
55431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      pool->freeBlocks = tem;
5544fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      memcpy(pool->blocks->s, pool->start,
5545fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             (pool->end - pool->start) * sizeof(XML_Char));
55461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      pool->ptr = pool->blocks->s + (pool->ptr - pool->start);
55471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      pool->start = pool->blocks->s;
55481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      pool->end = pool->start + pool->blocks->size;
5549fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_TRUE;
55501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
55511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
55521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (pool->blocks && pool->start == pool->blocks->s) {
55531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int blockSize = (pool->end - pool->start)*2;
5554fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    pool->blocks = (BLOCK *)
5555fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      pool->mem->realloc_fcn(pool->blocks,
5556fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis			     (offsetof(BLOCK, s)
5557fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis			      + blockSize * sizeof(XML_Char)));
5558fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (pool->blocks == NULL)
5559fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_FALSE;
55601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    pool->blocks->size = blockSize;
55611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    pool->ptr = pool->blocks->s + (pool->ptr - pool->start);
55621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    pool->start = pool->blocks->s;
55631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    pool->end = pool->start + blockSize;
55641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
55651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
55661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    BLOCK *tem;
55671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int blockSize = pool->end - pool->start;
55681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (blockSize < INIT_BLOCK_SIZE)
55691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      blockSize = INIT_BLOCK_SIZE;
55701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    else
55711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      blockSize *= 2;
5572fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s)
5573fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis					+ blockSize * sizeof(XML_Char));
55741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!tem)
5575fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return XML_FALSE;
55761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    tem->size = blockSize;
55771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    tem->next = pool->blocks;
55781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    pool->blocks = tem;
55791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (pool->ptr != pool->start)
5580fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      memcpy(tem->s, pool->start,
5581fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis             (pool->ptr - pool->start) * sizeof(XML_Char));
55821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    pool->ptr = tem->s + (pool->ptr - pool->start);
55831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    pool->start = tem->s;
55841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    pool->end = tem->s + blockSize;
55851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
5586fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  return XML_TRUE;
55871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis}
55881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5589fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int FASTCALL
55901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisnextScaffoldPart(XML_Parser parser)
55911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
5592fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD * const dtd = _dtd;  /* save one level of indirection */
55931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  CONTENT_SCAFFOLD * me;
55941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  int next;
55951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5596fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (!dtd->scaffIndex) {
5597fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int));
5598fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (!dtd->scaffIndex)
55991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      return -1;
5600fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    dtd->scaffIndex[0] = 0;
56011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
56021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5603fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (dtd->scaffCount >= dtd->scaffSize) {
5604fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    CONTENT_SCAFFOLD *temp;
5605fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (dtd->scaffold) {
5606fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      temp = (CONTENT_SCAFFOLD *)
5607fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD));
5608fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (temp == NULL)
5609fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return -1;
5610fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      dtd->scaffSize *= 2;
56111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
56121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    else {
5613fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS
5614fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                                        * sizeof(CONTENT_SCAFFOLD));
5615fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (temp == NULL)
5616fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        return -1;
5617fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS;
56181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
5619fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    dtd->scaffold = temp;
56201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
5621fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  next = dtd->scaffCount++;
5622fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  me = &dtd->scaffold[next];
5623fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (dtd->scaffLevel) {
5624fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]];
56251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (parent->lastchild) {
5626fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      dtd->scaffold[parent->lastchild].nextsib = next;
56271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
5628fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    if (!parent->childcnt)
56291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      parent->firstchild = next;
56301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    parent->lastchild = next;
56311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    parent->childcnt++;
56321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
56331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0;
56341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return next;
5635fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
56361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
56371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic void
5638fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisbuild_node(XML_Parser parser,
5639fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           int src_node,
5640fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           XML_Content *dest,
5641fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           XML_Content **contpos,
5642fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis           XML_Char **strpos)
56431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
5644fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD * const dtd = _dtd;  /* save one level of indirection */
5645fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  dest->type = dtd->scaffold[src_node].type;
5646fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  dest->quant = dtd->scaffold[src_node].quant;
56471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (dest->type == XML_CTYPE_NAME) {
5648fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    const XML_Char *src;
56491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    dest->name = *strpos;
5650fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    src = dtd->scaffold[src_node].name;
56511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    for (;;) {
56521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      *(*strpos)++ = *src;
5653fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      if (!*src)
5654fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis        break;
56551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      src++;
56561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
56571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    dest->numchildren = 0;
5658fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    dest->children = NULL;
56591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
56601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
56611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    unsigned int i;
56621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    int cn;
5663fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    dest->numchildren = dtd->scaffold[src_node].childcnt;
56641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    dest->children = *contpos;
56651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    *contpos += dest->numchildren;
5666fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    for (i = 0, cn = dtd->scaffold[src_node].firstchild;
5667fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         i < dest->numchildren;
5668fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis         i++, cn = dtd->scaffold[cn].nextsib) {
56691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis      build_node(parser, cn, &(dest->children[i]), contpos, strpos);
56701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    }
5671fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    dest->name = NULL;
56721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
5673fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
56741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
56751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic XML_Content *
56761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisbuild_model (XML_Parser parser)
56771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
5678fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD * const dtd = _dtd;  /* save one level of indirection */
56791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Content *ret;
56801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  XML_Content *cpos;
5681fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  XML_Char * str;
5682fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  int allocsize = (dtd->scaffCount * sizeof(XML_Content)
5683fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis                   + (dtd->contentStringLen * sizeof(XML_Char)));
5684fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis
5685fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  ret = (XML_Content *)MALLOC(allocsize);
5686fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (!ret)
5687fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
56881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5689fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  str =  (XML_Char *) (&ret[dtd->scaffCount]);
56901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  cpos = &ret[1];
56911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
56921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  build_node(parser, 0, ret, &cpos, &str);
56931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return ret;
5694fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
56951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
56961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic ELEMENT_TYPE *
56971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisgetElementType(XML_Parser parser,
5698fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const ENCODING *enc,
5699fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const char *ptr,
5700fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis               const char *end)
57011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{
5702fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  DTD * const dtd = _dtd;  /* save one level of indirection */
5703fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end);
57041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  ELEMENT_TYPE *ret;
57051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis
5706fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (!name)
5707fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
5708fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  ret = (ELEMENT_TYPE *) lookup(&dtd->elementTypes, name, sizeof(ELEMENT_TYPE));
5709fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis  if (!ret)
5710fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    return NULL;
57111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  if (ret->name != name)
5712fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    poolDiscard(&dtd->pool);
57131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  else {
5714fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis    poolFinish(&dtd->pool);
57151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis    if (!setElementTypePrefix(parser, ret))
5716fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis      return NULL;
57171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  }
57181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis  return ret;
5719fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}
5720