1b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
2b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   See the file COPYING for copying permission.
3b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
4b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <stddef.h>
6b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <string.h>                     /* memset(), memcpy() */
7b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <assert.h>
835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#include <limits.h>                     /* UINT_MAX */
935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#include <time.h>                       /* time() */
10b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
11b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_BUILDING_EXPAT 1
12b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
13b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef COMPILED_FROM_DSP
14b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "winconfig.h"
15b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#elif defined(MACOS_CLASSIC)
16b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "macconfig.h"
1735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#elif defined(__amigaos__)
18b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "amigaconfig.h"
19d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#elif defined(__WATCOMC__)
20d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#include "watcomconfig.h"
21b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#elif defined(HAVE_EXPAT_CONFIG_H)
22b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <expat_config.h>
23b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* ndef COMPILED_FROM_DSP */
24b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
25d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#include "ascii.h"
26b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "expat.h"
27b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
28b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_UNICODE
29b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX
30b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XmlConvert XmlUtf16Convert
31b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding
32b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS
33b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XmlEncode XmlUtf16Encode
34d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes/* Using pointer subtraction to convert to integer type. */
35d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1))
36b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef unsigned short ICHAR;
37b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
38b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX
39b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XmlConvert XmlUtf8Convert
40b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding
41b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS
42b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XmlEncode XmlUtf8Encode
43b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define MUST_CONVERT(enc, s) (!(enc)->isUtf8)
44b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef char ICHAR;
45b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
46b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
47b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
48b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifndef XML_NS
49b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
50b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XmlInitEncodingNS XmlInitEncoding
51b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding
52b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef XmlGetInternalEncodingNS
53b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XmlGetInternalEncodingNS XmlGetInternalEncoding
54b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XmlParseXmlDeclNS XmlParseXmlDecl
55b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
56b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
57b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
58b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_UNICODE
59b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
60b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_UNICODE_WCHAR_T
61b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_T(x) (const wchar_t)x
62b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_L(x) L ## x
63b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
64b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_T(x) (const unsigned short)x
65b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_L(x) x
66b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
67b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
68b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
69b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
70b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_T(x) x
71b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_L(x) x
72b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
73b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
74b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
75b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Round up n to be a multiple of sz, where sz is a power of 2. */
76b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1))
77b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
78b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Handle the case where memmove() doesn't exist. */
79b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifndef HAVE_MEMMOVE
80b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef HAVE_BCOPY
81b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define memmove(d,s,l) bcopy((s),(d),(l))
82b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
83b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#error memmove does not exist on this platform, nor is a substitute available
84b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* HAVE_BCOPY */
85b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* HAVE_MEMMOVE */
86b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
87b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "internal.h"
88b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "xmltok.h"
89b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "xmlrole.h"
90b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
91b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef const XML_Char *KEY;
92b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
93b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct {
94b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  KEY name;
95b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} NAMED;
96b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
97b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct {
98b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  NAMED **v;
99b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unsigned char power;
100b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  size_t size;
101b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  size_t used;
102b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Memory_Handling_Suite *mem;
103b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} HASH_TABLE;
104b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
105b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Basic character hash algorithm, taken from Python's string hash:
106b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   h = h * 1000003 ^ character, the constant being a prime number.
107b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
108b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
109b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_UNICODE
110b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define CHAR_HASH(h, c) \
111b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  (((h) * 0xF4243) ^ (unsigned short)(c))
112b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
113b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define CHAR_HASH(h, c) \
114b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  (((h) * 0xF4243) ^ (unsigned char)(c))
115b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
116b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
117b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* For probing (after a collision) we need a step size relative prime
118b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   to the hash table size, which is a power of 2. We use double-hashing,
119b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   since we can calculate a second hash value cheaply by taking those bits
120b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   of the first hash value that were discarded (masked out) when the table
121b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   index was calculated: index = hash & mask, where mask = table->size - 1.
122b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   We limit the maximum step size to table->size / 4 (mask >> 2) and make
123b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   it odd, since odd numbers are always relative prime to a power of 2.
124b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
125b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define SECOND_HASH(hash, mask, power) \
126b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2))
127b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define PROBE_STEP(hash, mask, power) \
128b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1))
129b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
130b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct {
131b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  NAMED **p;
132b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  NAMED **end;
133b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} HASH_TABLE_ITER;
134b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
135b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define INIT_TAG_BUF_SIZE 32  /* must be a multiple of sizeof(XML_Char) */
136b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define INIT_DATA_BUF_SIZE 1024
137b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define INIT_ATTS_SIZE 16
138b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define INIT_ATTS_VERSION 0xFFFFFFFF
139b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define INIT_BLOCK_SIZE 1024
140b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define INIT_BUFFER_SIZE 1024
141b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
142b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define EXPAND_SPARE 24
143b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
144b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct binding {
145b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  struct prefix *prefix;
146b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  struct binding *nextTagBinding;
147b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  struct binding *prevPrefixBinding;
148b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const struct attribute_id *attId;
149b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char *uri;
150b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int uriLen;
151b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int uriAlloc;
152b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} BINDING;
153b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
154b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct prefix {
155b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *name;
156b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  BINDING *binding;
157b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} PREFIX;
158b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
159b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct {
160b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *str;
161b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *localPart;
162b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *prefix;
163b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int strLen;
164b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int uriLen;
165b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int prefixLen;
166b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} TAG_NAME;
167b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
168b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* TAG represents an open element.
169b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   The name of the element is stored in both the document and API
170b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   encodings.  The memory buffer 'buf' is a separately-allocated
171b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   memory area which stores the name.  During the XML_Parse()/
172b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   XMLParseBuffer() when the element is open, the memory for the 'raw'
173b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   version of the name (in the document encoding) is shared with the
174b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   document buffer.  If the element is open across calls to
175b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to
176b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   contain the 'raw' name as well.
177b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
178b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   A parser re-uses these structures, maintaining a list of allocated
179b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   TAG objects in a free list.
180b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
181b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct tag {
182b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  struct tag *parent;           /* parent of this element */
183b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *rawName;          /* tagName in the original encoding */
184b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int rawNameLength;
185b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  TAG_NAME name;                /* tagName in the API encoding */
186b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  char *buf;                    /* buffer for name components */
187b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  char *bufEnd;                 /* end of the buffer */
188b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  BINDING *bindings;
189b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} TAG;
190b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
191b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct {
192b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *name;
193b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *textPtr;
194b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int textLen;                  /* length in XML_Chars */
195b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int processed;                /* # of processed bytes - when suspended */
196b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *systemId;
197b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *base;
198b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *publicId;
199b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *notation;
200b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool open;
201b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool is_param;
202b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool is_internal; /* true if declared in internal subset outside PE */
203b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} ENTITY;
204b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
205b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct {
206b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_Content_Type         type;
207b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_Content_Quant        quant;
208b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *              name;
209b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int                           firstchild;
210b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int                           lastchild;
211b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int                           childcnt;
212b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int                           nextsib;
213b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} CONTENT_SCAFFOLD;
214b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
215b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define INIT_SCAFFOLD_ELEMENTS 32
216b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
217b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct block {
218b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  struct block *next;
219b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int size;
220b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char s[1];
221b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} BLOCK;
222b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
223b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct {
224b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  BLOCK *blocks;
225b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  BLOCK *freeBlocks;
226b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *end;
227b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char *ptr;
228b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char *start;
229b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Memory_Handling_Suite *mem;
230b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} STRING_POOL;
231b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
232b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* The XML_Char before the name is used to determine whether
233b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   an attribute has been specified. */
234b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct attribute_id {
235b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char *name;
236b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  PREFIX *prefix;
237b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool maybeTokenized;
238b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool xmlns;
239b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} ATTRIBUTE_ID;
240b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
241b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct {
242b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const ATTRIBUTE_ID *id;
243b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool isCdata;
244b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *value;
245b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} DEFAULT_ATTRIBUTE;
246b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
247b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct {
248b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unsigned long version;
249b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unsigned long hash;
250b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *uriName;
251b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} NS_ATT;
252b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
253b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct {
254b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *name;
255b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  PREFIX *prefix;
256b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const ATTRIBUTE_ID *idAtt;
257b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int nDefaultAtts;
258b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int allocDefaultAtts;
259b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DEFAULT_ATTRIBUTE *defaultAtts;
260b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} ELEMENT_TYPE;
261b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
262b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct {
263b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  HASH_TABLE generalEntities;
264b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  HASH_TABLE elementTypes;
265b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  HASH_TABLE attributeIds;
266b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  HASH_TABLE prefixes;
267b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  STRING_POOL pool;
268b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  STRING_POOL entityValuePool;
269b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* false once a parameter entity reference has been skipped */
270b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool keepProcessing;
271b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* true once an internal or external PE reference has been encountered;
272b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     this includes the reference to an external subset */
273b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool hasParamEntityRefs;
274b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool standalone;
275b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
276b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* indicates if external PE has been read */
277b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool paramEntityRead;
278b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  HASH_TABLE paramEntities;
279b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
280b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  PREFIX defaultPrefix;
281b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* === scaffolding for building content model === */
282b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool in_eldecl;
283b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  CONTENT_SCAFFOLD *scaffold;
284b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unsigned contentStringLen;
285b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unsigned scaffSize;
286b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unsigned scaffCount;
287b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int scaffLevel;
288b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int *scaffIndex;
289b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} DTD;
290b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
291b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef struct open_internal_entity {
292b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *internalEventPtr;
293b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *internalEventEndPtr;
294b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  struct open_internal_entity *next;
295b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ENTITY *entity;
296b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int startTagLevel;
297b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool betweenDecl; /* WFC: PE Between Declarations */
298b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} OPEN_INTERNAL_ENTITY;
299b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
300b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttypedef enum XML_Error PTRCALL Processor(XML_Parser parser,
301b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                         const char *start,
302b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                         const char *end,
303b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                         const char **endPtr);
304b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
305b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor prologProcessor;
306b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor prologInitProcessor;
307b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor contentProcessor;
308b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor cdataSectionProcessor;
309b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
310b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor ignoreSectionProcessor;
311b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor externalParEntProcessor;
312b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor externalParEntInitProcessor;
313b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor entityValueProcessor;
314b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor entityValueInitProcessor;
315b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
316b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor epilogProcessor;
317b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor errorProcessor;
318b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor externalEntityInitProcessor;
319b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor externalEntityInitProcessor2;
320b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor externalEntityInitProcessor3;
321b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor externalEntityContentProcessor;
322b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Processor internalEntityProcessor;
323b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
324b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
325b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjecthandleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName);
326b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
327b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectprocessXmlDecl(XML_Parser parser, int isGeneralTextEntity,
328b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char *s, const char *next);
329b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
330b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectinitializeEncoding(XML_Parser parser);
331b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
33235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott HughesdoProlog(XML_Parser parser, const ENCODING *enc, const char *s,
33335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes         const char *end, int tok, const char *next, const char **nextPtr,
334b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         XML_Bool haveMore);
335b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
33635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott HughesprocessInternalEntity(XML_Parser parser, ENTITY *entity,
337b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      XML_Bool betweenDecl);
338b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
339b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectdoContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
34035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes          const char *start, const char *end, const char **endPtr,
341b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          XML_Bool haveMore);
342b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
343b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectdoCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr,
344b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char *end, const char **nextPtr, XML_Bool haveMore);
345b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
346b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
347b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectdoIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr,
348b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const char *end, const char **nextPtr, XML_Bool haveMore);
349b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
350b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
351b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
352b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectstoreAtts(XML_Parser parser, const ENCODING *, const char *s,
353b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          TAG_NAME *tagNamePtr, BINDING **bindingsPtr);
354b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
355b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectaddBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
356b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           const XML_Char *uri, BINDING **bindingsPtr);
357b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
35835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott HughesdefineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata,
359b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser);
360b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
361b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectstoreAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata,
362b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    const char *, const char *, STRING_POOL *);
363b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
364b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectappendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata,
365b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     const char *, const char *, STRING_POOL *);
366b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic ATTRIBUTE_ID *
367b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectgetAttributeId(XML_Parser parser, const ENCODING *enc, const char *start,
368b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char *end);
369b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
370b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectsetElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *);
371b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
372b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectstoreEntityValue(XML_Parser parser, const ENCODING *enc, const char *start,
373b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                 const char *end);
374b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
375b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectreportProcessingInstruction(XML_Parser parser, const ENCODING *enc,
376b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const char *start, const char *end);
377b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
378b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectreportComment(XML_Parser parser, const ENCODING *enc, const char *start,
379b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              const char *end);
380b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
381b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectreportDefault(XML_Parser parser, const ENCODING *enc, const char *start,
382b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              const char *end);
383b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
384b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const XML_Char * getContext(XML_Parser parser);
385b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Bool
386b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectsetContext(XML_Parser parser, const XML_Char *context);
387b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
388b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL normalizePublicId(XML_Char *s);
389b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
390b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic DTD * dtdCreate(const XML_Memory_Handling_Suite *ms);
391b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* do not call if parentParser != NULL */
392b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms);
393b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
394b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectdtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms);
395b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
39635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott HughesdtdCopy(XML_Parser oldParser,
39735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms);
398b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
39935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott HughescopyEntityTable(XML_Parser oldParser,
40035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                HASH_TABLE *, STRING_POOL *, const HASH_TABLE *);
401b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic NAMED *
40235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hugheslookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize);
403b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL
404b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjecthashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms);
405b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL hashTableClear(HASH_TABLE *);
406b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL hashTableDestroy(HASH_TABLE *);
407b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL
408b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjecthashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *);
409b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *);
410b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
411b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL
412b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms);
413b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL poolClear(STRING_POOL *);
414b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL poolDestroy(STRING_POOL *);
415b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Char *
416b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolAppend(STRING_POOL *pool, const ENCODING *enc,
417b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           const char *ptr, const char *end);
418b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Char *
419b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolStoreString(STRING_POOL *pool, const ENCODING *enc,
420b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const char *ptr, const char *end);
421b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Bool FASTCALL poolGrow(STRING_POOL *pool);
422b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const XML_Char * FASTCALL
423b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolCopyString(STRING_POOL *pool, const XML_Char *s);
424b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const XML_Char *
425b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n);
426b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const XML_Char * FASTCALL
427b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolAppendString(STRING_POOL *pool, const XML_Char *s);
428b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
429b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int FASTCALL nextScaffoldPart(XML_Parser parser);
430b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Content * build_model(XML_Parser parser);
431b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic ELEMENT_TYPE *
432b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectgetElementType(XML_Parser parser, const ENCODING *enc,
433b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char *ptr, const char *end);
434b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
43535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughesstatic unsigned long generate_hash_secret_salt(void);
43635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughesstatic XML_Bool startParsing(XML_Parser parser);
43735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes
438b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Parser
439b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectparserCreate(const XML_Char *encodingName,
440b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             const XML_Memory_Handling_Suite *memsuite,
441b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             const XML_Char *nameSep,
442b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             DTD *dtd);
44335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes
444b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
445b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectparserInit(XML_Parser parser, const XML_Char *encodingName);
446b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
447b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define poolStart(pool) ((pool)->start)
448b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define poolEnd(pool) ((pool)->ptr)
449b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define poolLength(pool) ((pool)->ptr - (pool)->start)
450b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define poolChop(pool) ((void)--(pool->ptr))
451b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define poolLastChar(pool) (((pool)->ptr)[-1])
452b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define poolDiscard(pool) ((pool)->ptr = (pool)->start)
453b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define poolFinish(pool) ((pool)->start = (pool)->ptr)
454b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define poolAppendChar(pool, c) \
455b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  (((pool)->ptr == (pool)->end && !poolGrow(pool)) \
456b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   ? 0 \
457b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   : ((*((pool)->ptr)++ = c), 1))
458b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
459b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstruct XML_ParserStruct {
460b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* The first member must be userData so that the XML_GetUserData
461b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     macro works. */
462b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  void *m_userData;
463b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  void *m_handlerArg;
464b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  char *m_buffer;
465b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Memory_Handling_Suite m_mem;
466b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* first character to be parsed */
467b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *m_bufferPtr;
468b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* past last character to be parsed */
469b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  char *m_bufferEnd;
470b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* allocated end of buffer */
471b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *m_bufferLim;
472b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Index m_parseEndByteIndex;
473b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *m_parseEndPtr;
474b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char *m_dataBuf;
475b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char *m_dataBufEnd;
476b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_StartElementHandler m_startElementHandler;
477b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_EndElementHandler m_endElementHandler;
478b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_CharacterDataHandler m_characterDataHandler;
479b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_ProcessingInstructionHandler m_processingInstructionHandler;
480b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_CommentHandler m_commentHandler;
481b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_StartCdataSectionHandler m_startCdataSectionHandler;
482b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_EndCdataSectionHandler m_endCdataSectionHandler;
483b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_DefaultHandler m_defaultHandler;
484b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler;
485b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler;
486b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler;
487b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_NotationDeclHandler m_notationDeclHandler;
488b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler;
489b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler;
490b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_NotStandaloneHandler m_notStandaloneHandler;
491b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_ExternalEntityRefHandler m_externalEntityRefHandler;
492b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Parser m_externalEntityRefHandlerArg;
493b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_SkippedEntityHandler m_skippedEntityHandler;
494b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_UnknownEncodingHandler m_unknownEncodingHandler;
495b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_ElementDeclHandler m_elementDeclHandler;
496b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_AttlistDeclHandler m_attlistDeclHandler;
497b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_EntityDeclHandler m_entityDeclHandler;
498b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_XmlDeclHandler m_xmlDeclHandler;
499b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const ENCODING *m_encoding;
500b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  INIT_ENCODING m_initEncoding;
501b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const ENCODING *m_internalEncoding;
502b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *m_protocolEncodingName;
503b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool m_ns;
504b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool m_ns_triplets;
505b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  void *m_unknownEncodingMem;
506b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  void *m_unknownEncodingData;
507b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  void *m_unknownEncodingHandlerData;
508b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  void (XMLCALL *m_unknownEncodingRelease)(void *);
509b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  PROLOG_STATE m_prologState;
510b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  Processor *m_processor;
511b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_Error m_errorCode;
512b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *m_eventPtr;
513b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *m_eventEndPtr;
514b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *m_positionPtr;
515b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  OPEN_INTERNAL_ENTITY *m_openInternalEntities;
516b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  OPEN_INTERNAL_ENTITY *m_freeInternalEntities;
517b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool m_defaultExpandInternalEntities;
518b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int m_tagLevel;
519b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ENTITY *m_declEntity;
520b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *m_doctypeName;
521b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *m_doctypeSysid;
522b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *m_doctypePubid;
523b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *m_declAttributeType;
524b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *m_declNotationName;
525b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *m_declNotationPublicId;
526b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ELEMENT_TYPE *m_declElementType;
527b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ATTRIBUTE_ID *m_declAttributeId;
528b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool m_declAttributeIsCdata;
529b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool m_declAttributeIsId;
530b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD *m_dtd;
531b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *m_curBase;
532b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  TAG *m_tagStack;
533b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  TAG *m_freeTagList;
534b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  BINDING *m_inheritedBindings;
535b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  BINDING *m_freeBindingList;
536b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int m_attsSize;
537b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int m_nSpecifiedAtts;
538b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int m_idAttIndex;
539b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ATTRIBUTE *m_atts;
540b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  NS_ATT *m_nsAtts;
541b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unsigned long m_nsAttsVersion;
542b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unsigned char m_nsAttsPower;
54335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#ifdef XML_ATTR_INFO
54435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  XML_AttrInfo *m_attInfo;
54535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#endif
546b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  POSITION m_position;
547b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  STRING_POOL m_tempPool;
548b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  STRING_POOL m_temp2Pool;
549b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  char *m_groupConnector;
550b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unsigned int m_groupSize;
551b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char m_namespaceSeparator;
552b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Parser m_parentParser;
553b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_ParsingStatus m_parsingStatus;
554b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
555b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool m_isParamEntity;
556b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool m_useForeignDTD;
557b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_ParamEntityParsing m_paramEntityParsing;
558b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
55935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  unsigned long m_hash_secret_salt;
560b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
561b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
562b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define MALLOC(s) (parser->m_mem.malloc_fcn((s)))
563b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s)))
564b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define FREE(p) (parser->m_mem.free_fcn((p)))
565b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
566b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define userData (parser->m_userData)
567b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define handlerArg (parser->m_handlerArg)
568b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define startElementHandler (parser->m_startElementHandler)
569b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define endElementHandler (parser->m_endElementHandler)
570b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define characterDataHandler (parser->m_characterDataHandler)
571b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define processingInstructionHandler \
572b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        (parser->m_processingInstructionHandler)
573b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define commentHandler (parser->m_commentHandler)
574b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define startCdataSectionHandler \
575b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        (parser->m_startCdataSectionHandler)
576b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define endCdataSectionHandler (parser->m_endCdataSectionHandler)
577b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define defaultHandler (parser->m_defaultHandler)
578b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler)
579b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler)
580b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define unparsedEntityDeclHandler \
581b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        (parser->m_unparsedEntityDeclHandler)
582b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define notationDeclHandler (parser->m_notationDeclHandler)
583b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define startNamespaceDeclHandler \
584b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        (parser->m_startNamespaceDeclHandler)
585b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler)
586b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define notStandaloneHandler (parser->m_notStandaloneHandler)
587b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define externalEntityRefHandler \
588b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        (parser->m_externalEntityRefHandler)
589b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define externalEntityRefHandlerArg \
590b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        (parser->m_externalEntityRefHandlerArg)
591b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define internalEntityRefHandler \
592b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        (parser->m_internalEntityRefHandler)
593b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define skippedEntityHandler (parser->m_skippedEntityHandler)
594b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define unknownEncodingHandler (parser->m_unknownEncodingHandler)
595b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define elementDeclHandler (parser->m_elementDeclHandler)
596b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define attlistDeclHandler (parser->m_attlistDeclHandler)
597b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define entityDeclHandler (parser->m_entityDeclHandler)
598b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define xmlDeclHandler (parser->m_xmlDeclHandler)
599b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define encoding (parser->m_encoding)
600b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define initEncoding (parser->m_initEncoding)
601b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define internalEncoding (parser->m_internalEncoding)
602b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define unknownEncodingMem (parser->m_unknownEncodingMem)
603b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define unknownEncodingData (parser->m_unknownEncodingData)
604b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define unknownEncodingHandlerData \
605b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  (parser->m_unknownEncodingHandlerData)
606b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define unknownEncodingRelease (parser->m_unknownEncodingRelease)
607b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define protocolEncodingName (parser->m_protocolEncodingName)
608b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define ns (parser->m_ns)
609b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define ns_triplets (parser->m_ns_triplets)
610b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define prologState (parser->m_prologState)
611b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define processor (parser->m_processor)
612b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define errorCode (parser->m_errorCode)
613b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define eventPtr (parser->m_eventPtr)
614b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define eventEndPtr (parser->m_eventEndPtr)
615b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define positionPtr (parser->m_positionPtr)
616b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define position (parser->m_position)
617b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define openInternalEntities (parser->m_openInternalEntities)
618b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define freeInternalEntities (parser->m_freeInternalEntities)
619b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define defaultExpandInternalEntities \
620b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        (parser->m_defaultExpandInternalEntities)
621b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define tagLevel (parser->m_tagLevel)
622b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define buffer (parser->m_buffer)
623b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define bufferPtr (parser->m_bufferPtr)
624b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define bufferEnd (parser->m_bufferEnd)
625b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define parseEndByteIndex (parser->m_parseEndByteIndex)
626b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define parseEndPtr (parser->m_parseEndPtr)
627b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define bufferLim (parser->m_bufferLim)
628b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define dataBuf (parser->m_dataBuf)
629b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define dataBufEnd (parser->m_dataBufEnd)
630b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define _dtd (parser->m_dtd)
631b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define curBase (parser->m_curBase)
632b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define declEntity (parser->m_declEntity)
633b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define doctypeName (parser->m_doctypeName)
634b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define doctypeSysid (parser->m_doctypeSysid)
635b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define doctypePubid (parser->m_doctypePubid)
636b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define declAttributeType (parser->m_declAttributeType)
637b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define declNotationName (parser->m_declNotationName)
638b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define declNotationPublicId (parser->m_declNotationPublicId)
639b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define declElementType (parser->m_declElementType)
640b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define declAttributeId (parser->m_declAttributeId)
641b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define declAttributeIsCdata (parser->m_declAttributeIsCdata)
642b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define declAttributeIsId (parser->m_declAttributeIsId)
643b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define freeTagList (parser->m_freeTagList)
644b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define freeBindingList (parser->m_freeBindingList)
645b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define inheritedBindings (parser->m_inheritedBindings)
646b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define tagStack (parser->m_tagStack)
647b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define atts (parser->m_atts)
648b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define attsSize (parser->m_attsSize)
649b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define nSpecifiedAtts (parser->m_nSpecifiedAtts)
650b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define idAttIndex (parser->m_idAttIndex)
651b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define nsAtts (parser->m_nsAtts)
652b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define nsAttsVersion (parser->m_nsAttsVersion)
653b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define nsAttsPower (parser->m_nsAttsPower)
65435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#define attInfo (parser->m_attInfo)
655b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define tempPool (parser->m_tempPool)
656b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define temp2Pool (parser->m_temp2Pool)
657b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define groupConnector (parser->m_groupConnector)
658b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define groupSize (parser->m_groupSize)
659b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define namespaceSeparator (parser->m_namespaceSeparator)
660b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define parentParser (parser->m_parentParser)
661b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define ps_parsing (parser->m_parsingStatus.parsing)
662b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define ps_finalBuffer (parser->m_parsingStatus.finalBuffer)
663b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
664b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define isParamEntity (parser->m_isParamEntity)
665b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define useForeignDTD (parser->m_useForeignDTD)
666b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define paramEntityParsing (parser->m_paramEntityParsing)
667b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
66835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#define hash_secret_salt (parser->m_hash_secret_salt)
669b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
670b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_Parser XMLCALL
671b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_ParserCreate(const XML_Char *encodingName)
672b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
673b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_ParserCreate_MM(encodingName, NULL, NULL);
674b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
675b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
676b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_Parser XMLCALL
677b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep)
678b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
679b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char tmp[2];
680b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *tmp = nsSep;
681b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_ParserCreate_MM(encodingName, NULL, tmp);
682b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
683b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
684b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const XML_Char implicitContext[] = {
685d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p,
68635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w,
687d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g,
688d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9,
689d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e,
690d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0'
691b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
692b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
69335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughesstatic unsigned long
69435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughesgenerate_hash_secret_salt(void)
69535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes{
69635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  unsigned int seed = time(NULL) % UINT_MAX;
69735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  srand(seed);
69835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  return rand();
69935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes}
70035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes
70135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughesstatic XML_Bool  /* only valid for root parser */
70235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott HughesstartParsing(XML_Parser parser)
70335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes{
70435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    /* hash functions must be initialized before setContext() is called */
70535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    if (hash_secret_salt == 0)
70635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      hash_secret_salt = generate_hash_secret_salt();
70735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    if (ns) {
70835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      /* implicit context only set for root parser, since child
70935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes         parsers (i.e. external entity parsers) will inherit it
71035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      */
71135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      return setContext(parser, implicitContext);
71235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    }
71335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    return XML_TRUE;
71435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes}
71535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes
716b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_Parser XMLCALL
717b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_ParserCreate_MM(const XML_Char *encodingName,
718b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    const XML_Memory_Handling_Suite *memsuite,
719b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    const XML_Char *nameSep)
720b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
72135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  return parserCreate(encodingName, memsuite, nameSep, NULL);
722b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
723b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
724b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Parser
725b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectparserCreate(const XML_Char *encodingName,
726b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             const XML_Memory_Handling_Suite *memsuite,
727b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             const XML_Char *nameSep,
728b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             DTD *dtd)
729b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
730b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Parser parser;
731b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
732b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (memsuite) {
733b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_Memory_Handling_Suite *mtemp;
734b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    parser = (XML_Parser)
735b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      memsuite->malloc_fcn(sizeof(struct XML_ParserStruct));
736b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (parser != NULL) {
737b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
738b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      mtemp->malloc_fcn = memsuite->malloc_fcn;
739b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      mtemp->realloc_fcn = memsuite->realloc_fcn;
740b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      mtemp->free_fcn = memsuite->free_fcn;
741b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
742b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
743b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
744b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_Memory_Handling_Suite *mtemp;
745b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct));
746b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (parser != NULL) {
747b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
748b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      mtemp->malloc_fcn = malloc;
749b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      mtemp->realloc_fcn = realloc;
750b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      mtemp->free_fcn = free;
751b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
752b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
753b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
754b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!parser)
755b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return parser;
756b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
757b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  buffer = NULL;
758b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  bufferLim = NULL;
759b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
760b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  attsSize = INIT_ATTS_SIZE;
761b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE));
762b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (atts == NULL) {
763b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    FREE(parser);
764b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
765b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
76635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#ifdef XML_ATTR_INFO
76735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  attInfo = (XML_AttrInfo*)MALLOC(attsSize * sizeof(XML_AttrInfo));
76835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  if (attInfo == NULL) {
76935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    FREE(atts);
77035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    FREE(parser);
77135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    return NULL;
77235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  }
77335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#endif
774b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char));
775b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (dataBuf == NULL) {
776b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    FREE(atts);
77735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#ifdef XML_ATTR_INFO
77835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    FREE(attInfo);
77935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#endif
780b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    FREE(parser);
781b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
782b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
783b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE;
784b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
785b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (dtd)
786b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    _dtd = dtd;
787b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
788b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    _dtd = dtdCreate(&parser->m_mem);
789b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (_dtd == NULL) {
790b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      FREE(dataBuf);
791b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      FREE(atts);
79235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#ifdef XML_ATTR_INFO
79335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      FREE(attInfo);
79435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#endif
795b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      FREE(parser);
796b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return NULL;
797b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
798b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
799b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
800b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  freeBindingList = NULL;
801b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  freeTagList = NULL;
802b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  freeInternalEntities = NULL;
803b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
804b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  groupSize = 0;
805b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  groupConnector = NULL;
806b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
807b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unknownEncodingHandler = NULL;
808b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unknownEncodingHandlerData = NULL;
809b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
810d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  namespaceSeparator = ASCII_EXCL;
811b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ns = XML_FALSE;
812b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ns_triplets = XML_FALSE;
813b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
814b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  nsAtts = NULL;
815b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  nsAttsVersion = 0;
816b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  nsAttsPower = 0;
817b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
818b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolInit(&tempPool, &(parser->m_mem));
819b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolInit(&temp2Pool, &(parser->m_mem));
820b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  parserInit(parser, encodingName);
821b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
822b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (encodingName && !protocolEncodingName) {
823b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_ParserFree(parser);
824b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
825b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
826b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
827b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (nameSep) {
828b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ns = XML_TRUE;
829b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    internalEncoding = XmlGetInternalEncodingNS();
830b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    namespaceSeparator = *nameSep;
831b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
832b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
833b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    internalEncoding = XmlGetInternalEncoding();
834b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
835b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
836b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return parser;
837b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
838b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
839b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
840b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectparserInit(XML_Parser parser, const XML_Char *encodingName)
841b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
842b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  processor = prologInitProcessor;
843b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XmlPrologStateInit(&prologState);
844b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  protocolEncodingName = (encodingName != NULL
845b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          ? poolCopyString(&tempPool, encodingName)
846b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          : NULL);
847b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  curBase = NULL;
848b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XmlInitEncoding(&initEncoding, &encoding, 0);
849b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  userData = NULL;
850b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  handlerArg = NULL;
851b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startElementHandler = NULL;
852b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endElementHandler = NULL;
853b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  characterDataHandler = NULL;
854b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  processingInstructionHandler = NULL;
855b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  commentHandler = NULL;
856b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startCdataSectionHandler = NULL;
857b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endCdataSectionHandler = NULL;
858b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  defaultHandler = NULL;
859b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startDoctypeDeclHandler = NULL;
860b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endDoctypeDeclHandler = NULL;
861b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unparsedEntityDeclHandler = NULL;
862b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  notationDeclHandler = NULL;
863b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startNamespaceDeclHandler = NULL;
864b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endNamespaceDeclHandler = NULL;
865b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  notStandaloneHandler = NULL;
866b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  externalEntityRefHandler = NULL;
867b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  externalEntityRefHandlerArg = parser;
868b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  skippedEntityHandler = NULL;
869b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  elementDeclHandler = NULL;
870b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  attlistDeclHandler = NULL;
871b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  entityDeclHandler = NULL;
872b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  xmlDeclHandler = NULL;
873b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  bufferPtr = buffer;
874b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  bufferEnd = buffer;
875b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  parseEndByteIndex = 0;
876b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  parseEndPtr = NULL;
877b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  declElementType = NULL;
878b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  declAttributeId = NULL;
879b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  declEntity = NULL;
880b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  doctypeName = NULL;
881b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  doctypeSysid = NULL;
882b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  doctypePubid = NULL;
883b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  declAttributeType = NULL;
884b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  declNotationName = NULL;
885b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  declNotationPublicId = NULL;
886b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  declAttributeIsCdata = XML_FALSE;
887b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  declAttributeIsId = XML_FALSE;
888b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  memset(&position, 0, sizeof(POSITION));
889b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  errorCode = XML_ERROR_NONE;
890b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  eventPtr = NULL;
891b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  eventEndPtr = NULL;
892b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  positionPtr = NULL;
893b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  openInternalEntities = NULL;
894b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  defaultExpandInternalEntities = XML_TRUE;
895b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  tagLevel = 0;
896b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  tagStack = NULL;
897b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  inheritedBindings = NULL;
898b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  nSpecifiedAtts = 0;
899b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unknownEncodingMem = NULL;
900b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unknownEncodingRelease = NULL;
901b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unknownEncodingData = NULL;
902b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  parentParser = NULL;
903b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ps_parsing = XML_INITIALIZED;
904b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
905b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  isParamEntity = XML_FALSE;
906b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  useForeignDTD = XML_FALSE;
907b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
908b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
90935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  hash_secret_salt = 0;
910b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
911b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
912b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* moves list of bindings to freeBindingList */
913b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL
914b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectmoveToFreeBindingList(XML_Parser parser, BINDING *bindings)
915b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
916b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  while (bindings) {
917b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    BINDING *b = bindings;
918b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    bindings = bindings->nextTagBinding;
919b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    b->nextTagBinding = freeBindingList;
920b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    freeBindingList = b;
921b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
922b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
923b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
924b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_Bool XMLCALL
925b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_ParserReset(XML_Parser parser, const XML_Char *encodingName)
926b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
927b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  TAG *tStk;
928b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  OPEN_INTERNAL_ENTITY *openEntityList;
929b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (parentParser)
930b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_FALSE;
931b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* move tagStack to freeTagList */
932b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  tStk = tagStack;
933b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  while (tStk) {
934b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    TAG *tag = tStk;
935b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tStk = tStk->parent;
936b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tag->parent = freeTagList;
937b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    moveToFreeBindingList(parser, tag->bindings);
938b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tag->bindings = NULL;
939b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    freeTagList = tag;
940b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
941b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* move openInternalEntities to freeInternalEntities */
942b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  openEntityList = openInternalEntities;
943b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  while (openEntityList) {
944b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    OPEN_INTERNAL_ENTITY *openEntity = openEntityList;
945b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    openEntityList = openEntity->next;
946b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    openEntity->next = freeInternalEntities;
947b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    freeInternalEntities = openEntity;
948b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
949b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  moveToFreeBindingList(parser, inheritedBindings);
950b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  FREE(unknownEncodingMem);
951b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (unknownEncodingRelease)
952b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    unknownEncodingRelease(unknownEncodingData);
953b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolClear(&tempPool);
954b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolClear(&temp2Pool);
955b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  parserInit(parser, encodingName);
956b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  dtdReset(_dtd, &parser->m_mem);
95735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  return XML_TRUE;
958b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
959b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
960b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectenum XML_Status XMLCALL
961b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetEncoding(XML_Parser parser, const XML_Char *encodingName)
962b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
963b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* Block after XML_Parse()/XML_ParseBuffer() has been called.
964b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     XXX There's no way for the caller to determine which of the
965b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     XXX possible error cases caused the XML_STATUS_ERROR return.
966b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  */
967b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
968b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_STATUS_ERROR;
969b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (encodingName == NULL)
970b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    protocolEncodingName = NULL;
971b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
972b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    protocolEncodingName = poolCopyString(&tempPool, encodingName);
973b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!protocolEncodingName)
974b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_STATUS_ERROR;
975b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
976b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_STATUS_OK;
977b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
978b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
979b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_Parser XMLCALL
980b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_ExternalEntityParserCreate(XML_Parser oldParser,
981b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               const XML_Char *context,
982b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               const XML_Char *encodingName)
983b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
984b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Parser parser = oldParser;
985b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD *newDtd = NULL;
986b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD *oldDtd = _dtd;
987b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_StartElementHandler oldStartElementHandler = startElementHandler;
988b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_EndElementHandler oldEndElementHandler = endElementHandler;
989b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler;
990b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_ProcessingInstructionHandler oldProcessingInstructionHandler
991b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      = processingInstructionHandler;
992b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_CommentHandler oldCommentHandler = commentHandler;
993b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_StartCdataSectionHandler oldStartCdataSectionHandler
994b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      = startCdataSectionHandler;
995b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_EndCdataSectionHandler oldEndCdataSectionHandler
996b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      = endCdataSectionHandler;
997b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_DefaultHandler oldDefaultHandler = defaultHandler;
998b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler
999b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      = unparsedEntityDeclHandler;
1000b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler;
1001b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler
1002b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      = startNamespaceDeclHandler;
1003b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler
1004b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      = endNamespaceDeclHandler;
1005b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler;
1006b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_ExternalEntityRefHandler oldExternalEntityRefHandler
1007b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      = externalEntityRefHandler;
1008b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler;
1009b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_UnknownEncodingHandler oldUnknownEncodingHandler
1010b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      = unknownEncodingHandler;
1011b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler;
1012b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler;
1013b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler;
1014b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler;
1015b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ELEMENT_TYPE * oldDeclElementType = declElementType;
1016b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1017b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  void *oldUserData = userData;
1018b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  void *oldHandlerArg = handlerArg;
1019b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities;
1020b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg;
1021b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
1022b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing;
1023b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int oldInEntityValue = prologState.inEntityValue;
1024b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
1025b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool oldns_triplets = ns_triplets;
102635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  /* Note that the new parser shares the same hash secret as the old
102735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes     parser, so that dtdCopy and copyEntityTable can lookup values
102835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes     from hash tables associated with either parser without us having
102935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes     to worry which hash secrets each table has.
103035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  */
103135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  unsigned long oldhash_secret_salt = hash_secret_salt;
1032b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1033b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
1034b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!context)
1035b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    newDtd = oldDtd;
1036b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
1037b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1038b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* Note that the magical uses of the pre-processor to make field
1039b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     access look more like C++ require that `parser' be overwritten
1040b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     here.  This makes this function more painful to follow than it
1041b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     would be otherwise.
1042b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  */
1043b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (ns) {
1044b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_Char tmp[2];
1045b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *tmp = namespaceSeparator;
1046b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd);
1047b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1048b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
1049b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd);
1050b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1051b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1052b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!parser)
1053b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
1054b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1055b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startElementHandler = oldStartElementHandler;
1056b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endElementHandler = oldEndElementHandler;
1057b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  characterDataHandler = oldCharacterDataHandler;
1058b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  processingInstructionHandler = oldProcessingInstructionHandler;
1059b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  commentHandler = oldCommentHandler;
1060b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startCdataSectionHandler = oldStartCdataSectionHandler;
1061b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endCdataSectionHandler = oldEndCdataSectionHandler;
1062b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  defaultHandler = oldDefaultHandler;
1063b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler;
1064b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  notationDeclHandler = oldNotationDeclHandler;
1065b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startNamespaceDeclHandler = oldStartNamespaceDeclHandler;
1066b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endNamespaceDeclHandler = oldEndNamespaceDeclHandler;
1067b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  notStandaloneHandler = oldNotStandaloneHandler;
1068b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  externalEntityRefHandler = oldExternalEntityRefHandler;
1069b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  skippedEntityHandler = oldSkippedEntityHandler;
1070b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unknownEncodingHandler = oldUnknownEncodingHandler;
1071b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  elementDeclHandler = oldElementDeclHandler;
1072b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  attlistDeclHandler = oldAttlistDeclHandler;
1073b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  entityDeclHandler = oldEntityDeclHandler;
1074b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  xmlDeclHandler = oldXmlDeclHandler;
1075b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  declElementType = oldDeclElementType;
1076b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  userData = oldUserData;
1077b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (oldUserData == oldHandlerArg)
1078b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    handlerArg = userData;
1079b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else
1080b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    handlerArg = parser;
1081b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (oldExternalEntityRefHandlerArg != oldParser)
1082b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg;
1083b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  defaultExpandInternalEntities = oldDefaultExpandInternalEntities;
1084b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ns_triplets = oldns_triplets;
108535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  hash_secret_salt = oldhash_secret_salt;
1086b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  parentParser = oldParser;
1087b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
1088b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  paramEntityParsing = oldParamEntityParsing;
1089b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  prologState.inEntityValue = oldInEntityValue;
1090b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (context) {
1091b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
109235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    if (!dtdCopy(oldParser, _dtd, oldDtd, &parser->m_mem)
1093b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      || !setContext(parser, context)) {
1094b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      XML_ParserFree(parser);
1095b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return NULL;
1096b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1097b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    processor = externalEntityInitProcessor;
1098b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
1099b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1100b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
1101b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* The DTD instance referenced by _dtd is shared between the document's
1102b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       root parser and external PE parsers, therefore one does not need to
1103b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       call setContext. In addition, one also *must* not call setContext,
1104b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       because this would overwrite existing prefix->binding pointers in
1105b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       _dtd with ones that get destroyed with the external PE parser.
1106b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       This would leave those prefixes with dangling pointers.
1107b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    */
1108b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    isParamEntity = XML_TRUE;
1109b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XmlPrologStateInitExternalEntity(&prologState);
1110b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    processor = externalParEntInitProcessor;
1111b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1112b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
1113b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return parser;
1114b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1115b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1116b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL
1117b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectdestroyBindings(BINDING *bindings, XML_Parser parser)
1118b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1119b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
1120b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    BINDING *b = bindings;
1121b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!b)
1122b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
1123b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    bindings = b->nextTagBinding;
1124b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    FREE(b->uri);
1125b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    FREE(b);
1126b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1127b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1128b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1129b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1130b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_ParserFree(XML_Parser parser)
1131b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1132b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  TAG *tagList;
1133b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  OPEN_INTERNAL_ENTITY *entityList;
1134b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (parser == NULL)
1135b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return;
1136b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* free tagStack and freeTagList */
1137b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  tagList = tagStack;
1138b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
1139b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    TAG *p;
1140b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (tagList == NULL) {
1141b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (freeTagList == NULL)
1142b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
1143b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      tagList = freeTagList;
1144b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      freeTagList = NULL;
1145b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1146b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    p = tagList;
1147b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tagList = tagList->parent;
1148b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    FREE(p->buf);
1149b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    destroyBindings(p->bindings, parser);
1150b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    FREE(p);
1151b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1152b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* free openInternalEntities and freeInternalEntities */
1153b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  entityList = openInternalEntities;
1154b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
1155b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    OPEN_INTERNAL_ENTITY *openEntity;
1156b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (entityList == NULL) {
1157b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (freeInternalEntities == NULL)
1158b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
1159b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      entityList = freeInternalEntities;
1160b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      freeInternalEntities = NULL;
1161b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1162b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    openEntity = entityList;
1163b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    entityList = entityList->next;
1164b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    FREE(openEntity);
1165b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1166b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1167b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  destroyBindings(freeBindingList, parser);
1168b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  destroyBindings(inheritedBindings, parser);
1169b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolDestroy(&tempPool);
1170b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolDestroy(&temp2Pool);
1171b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
1172b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* external parameter entity parsers share the DTD structure
1173b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     parser->m_dtd with the root parser, so we must not destroy it
1174b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  */
1175b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!isParamEntity && _dtd)
1176b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
1177b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (_dtd)
1178b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
1179b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem);
1180b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  FREE((void *)atts);
118135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#ifdef XML_ATTR_INFO
118235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  FREE((void *)attInfo);
118335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#endif
1184b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  FREE(groupConnector);
1185b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  FREE(buffer);
1186b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  FREE(dataBuf);
1187b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  FREE(nsAtts);
1188b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  FREE(unknownEncodingMem);
1189b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (unknownEncodingRelease)
1190b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    unknownEncodingRelease(unknownEncodingData);
1191b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  FREE(parser);
1192b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1193b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1194b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1195b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_UseParserAsHandlerArg(XML_Parser parser)
1196b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1197b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  handlerArg = parser;
1198b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1199b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1200b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectenum XML_Error XMLCALL
1201b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD)
1202b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1203b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
1204b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* block after XML_Parse()/XML_ParseBuffer() has been called */
1205b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
1206b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING;
1207b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  useForeignDTD = useDTD;
1208b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_ERROR_NONE;
1209b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
1210b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_ERROR_FEATURE_REQUIRES_XML_DTD;
1211b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
1212b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1213b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1214b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1215b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetReturnNSTriplet(XML_Parser parser, int do_nst)
1216b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1217b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* block after XML_Parse()/XML_ParseBuffer() has been called */
1218b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
1219b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return;
1220b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ns_triplets = do_nst ? XML_TRUE : XML_FALSE;
1221b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1222b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1223b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1224b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetUserData(XML_Parser parser, void *p)
1225b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1226b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (handlerArg == userData)
1227b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    handlerArg = userData = p;
1228b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else
1229b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    userData = p;
1230b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1231b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1232b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectenum XML_Status XMLCALL
1233b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetBase(XML_Parser parser, const XML_Char *p)
1234b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1235b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (p) {
1236b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    p = poolCopyString(&_dtd->pool, p);
1237b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!p)
1238b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_STATUS_ERROR;
1239b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    curBase = p;
1240b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1241b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else
1242b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    curBase = NULL;
1243b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_STATUS_OK;
1244b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1245b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1246b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectconst XML_Char * XMLCALL
1247b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_GetBase(XML_Parser parser)
1248b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1249b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return curBase;
1250b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1251b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1252b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectint XMLCALL
1253b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_GetSpecifiedAttributeCount(XML_Parser parser)
1254b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1255b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return nSpecifiedAtts;
1256b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1257b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1258b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectint XMLCALL
1259b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_GetIdAttributeIndex(XML_Parser parser)
1260b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1261b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return idAttIndex;
1262b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1263b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
126435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#ifdef XML_ATTR_INFO
126535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughesconst XML_AttrInfo * XMLCALL
126635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott HughesXML_GetAttributeInfo(XML_Parser parser)
126735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes{
126835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  return attInfo;
126935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes}
127035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#endif
127135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes
1272b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1273b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetElementHandler(XML_Parser parser,
1274b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      XML_StartElementHandler start,
1275b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      XML_EndElementHandler end)
1276b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1277b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startElementHandler = start;
1278b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endElementHandler = end;
1279b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1280b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1281b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1282b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetStartElementHandler(XML_Parser parser,
1283b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           XML_StartElementHandler start) {
1284b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startElementHandler = start;
1285b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1286b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1287b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1288b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetEndElementHandler(XML_Parser parser,
1289b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                         XML_EndElementHandler end) {
1290b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endElementHandler = end;
1291b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1292b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1293b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1294b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetCharacterDataHandler(XML_Parser parser,
1295b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            XML_CharacterDataHandler handler)
1296b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1297b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  characterDataHandler = handler;
1298b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1299b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1300b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1301b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetProcessingInstructionHandler(XML_Parser parser,
1302b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    XML_ProcessingInstructionHandler handler)
1303b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1304b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  processingInstructionHandler = handler;
1305b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1306b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1307b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1308b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetCommentHandler(XML_Parser parser,
1309b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      XML_CommentHandler handler)
1310b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1311b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  commentHandler = handler;
1312b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1313b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1314b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1315b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetCdataSectionHandler(XML_Parser parser,
1316b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           XML_StartCdataSectionHandler start,
1317b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           XML_EndCdataSectionHandler end)
1318b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1319b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startCdataSectionHandler = start;
1320b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endCdataSectionHandler = end;
1321b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1322b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1323b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1324b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetStartCdataSectionHandler(XML_Parser parser,
1325b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                XML_StartCdataSectionHandler start) {
1326b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startCdataSectionHandler = start;
1327b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1328b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1329b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1330b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetEndCdataSectionHandler(XML_Parser parser,
1331b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              XML_EndCdataSectionHandler end) {
1332b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endCdataSectionHandler = end;
1333b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1334b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1335b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1336b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetDefaultHandler(XML_Parser parser,
1337b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      XML_DefaultHandler handler)
1338b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1339b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  defaultHandler = handler;
1340b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  defaultExpandInternalEntities = XML_FALSE;
1341b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1342b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1343b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1344b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetDefaultHandlerExpand(XML_Parser parser,
1345b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            XML_DefaultHandler handler)
1346b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1347b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  defaultHandler = handler;
1348b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  defaultExpandInternalEntities = XML_TRUE;
1349b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1350b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1351b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1352b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetDoctypeDeclHandler(XML_Parser parser,
1353b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          XML_StartDoctypeDeclHandler start,
1354b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          XML_EndDoctypeDeclHandler end)
1355b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1356b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startDoctypeDeclHandler = start;
1357b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endDoctypeDeclHandler = end;
1358b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1359b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1360b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1361b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetStartDoctypeDeclHandler(XML_Parser parser,
1362b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               XML_StartDoctypeDeclHandler start) {
1363b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startDoctypeDeclHandler = start;
1364b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1365b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1366b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1367b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetEndDoctypeDeclHandler(XML_Parser parser,
1368b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             XML_EndDoctypeDeclHandler end) {
1369b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endDoctypeDeclHandler = end;
1370b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1371b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1372b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1373b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetUnparsedEntityDeclHandler(XML_Parser parser,
1374b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                 XML_UnparsedEntityDeclHandler handler)
1375b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1376b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unparsedEntityDeclHandler = handler;
1377b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1378b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1379b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1380b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetNotationDeclHandler(XML_Parser parser,
1381b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           XML_NotationDeclHandler handler)
1382b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1383b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  notationDeclHandler = handler;
1384b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1385b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1386b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1387b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetNamespaceDeclHandler(XML_Parser parser,
1388b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            XML_StartNamespaceDeclHandler start,
1389b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            XML_EndNamespaceDeclHandler end)
1390b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1391b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startNamespaceDeclHandler = start;
1392b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endNamespaceDeclHandler = end;
1393b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1394b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1395b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1396b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetStartNamespaceDeclHandler(XML_Parser parser,
1397b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                 XML_StartNamespaceDeclHandler start) {
1398b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  startNamespaceDeclHandler = start;
1399b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1400b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1401b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1402b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetEndNamespaceDeclHandler(XML_Parser parser,
1403b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               XML_EndNamespaceDeclHandler end) {
1404b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  endNamespaceDeclHandler = end;
1405b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1406b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1407b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1408b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetNotStandaloneHandler(XML_Parser parser,
1409b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            XML_NotStandaloneHandler handler)
1410b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1411b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  notStandaloneHandler = handler;
1412b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1413b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1414b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1415b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetExternalEntityRefHandler(XML_Parser parser,
1416b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                XML_ExternalEntityRefHandler handler)
1417b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1418b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  externalEntityRefHandler = handler;
1419b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1420b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1421b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1422b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg)
1423b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1424b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (arg)
1425b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    externalEntityRefHandlerArg = (XML_Parser)arg;
1426b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else
1427b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    externalEntityRefHandlerArg = parser;
1428b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1429b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1430b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1431b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetSkippedEntityHandler(XML_Parser parser,
1432b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            XML_SkippedEntityHandler handler)
1433b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1434b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  skippedEntityHandler = handler;
1435b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1436b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1437b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1438b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetUnknownEncodingHandler(XML_Parser parser,
1439b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              XML_UnknownEncodingHandler handler,
1440b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              void *data)
1441b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1442b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unknownEncodingHandler = handler;
1443b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unknownEncodingHandlerData = data;
1444b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1445b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1446b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1447b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetElementDeclHandler(XML_Parser parser,
1448b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          XML_ElementDeclHandler eldecl)
1449b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1450b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  elementDeclHandler = eldecl;
1451b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1452b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1453b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1454b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetAttlistDeclHandler(XML_Parser parser,
1455b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          XML_AttlistDeclHandler attdecl)
1456b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1457b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  attlistDeclHandler = attdecl;
1458b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1459b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1460b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1461b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetEntityDeclHandler(XML_Parser parser,
1462b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                         XML_EntityDeclHandler handler)
1463b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1464b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  entityDeclHandler = handler;
1465b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1466b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1467b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1468b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetXmlDeclHandler(XML_Parser parser,
1469b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      XML_XmlDeclHandler handler) {
1470b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  xmlDeclHandler = handler;
1471b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1472b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1473b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectint XMLCALL
1474b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_SetParamEntityParsing(XML_Parser parser,
1475b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          enum XML_ParamEntityParsing peParsing)
1476b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1477b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* block after XML_Parse()/XML_ParseBuffer() has been called */
1478b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
1479b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
1480b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
1481b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  paramEntityParsing = peParsing;
1482b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 1;
1483b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
1484b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return peParsing == XML_PARAM_ENTITY_PARSING_NEVER;
1485b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
1486b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1487b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
148835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughesint XMLCALL
148935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott HughesXML_SetHashSalt(XML_Parser parser,
149035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                unsigned long hash_salt)
149135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes{
149235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  /* block after XML_Parse()/XML_ParseBuffer() has been called */
149335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
149435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    return 0;
149535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  hash_secret_salt = hash_salt;
149635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  return 1;
149735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes}
149835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes
1499b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectenum XML_Status XMLCALL
1500b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
1501b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1502b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  switch (ps_parsing) {
1503b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_SUSPENDED:
1504b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    errorCode = XML_ERROR_SUSPENDED;
1505b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_STATUS_ERROR;
1506b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_FINISHED:
1507b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    errorCode = XML_ERROR_FINISHED;
1508b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_STATUS_ERROR;
150935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  case XML_INITIALIZED:
151035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    if (parentParser == NULL && !startParsing(parser)) {
151135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      errorCode = XML_ERROR_NO_MEMORY;
151235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      return XML_STATUS_ERROR;
151335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    }
1514b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  default:
1515b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ps_parsing = XML_PARSING;
1516b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1517b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1518b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (len == 0) {
1519b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ps_finalBuffer = (XML_Bool)isFinal;
1520b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!isFinal)
1521b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_STATUS_OK;
1522b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    positionPtr = bufferPtr;
1523b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    parseEndPtr = bufferEnd;
1524b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1525b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* If data are left over from last buffer, and we now know that these
1526b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       data are the final chunk of input, then we have to check them again
1527b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       to detect errors based on that fact.
1528b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    */
1529b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr);
1530b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1531b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (errorCode == XML_ERROR_NONE) {
1532b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      switch (ps_parsing) {
1533b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_SUSPENDED:
1534b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
1535b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        positionPtr = bufferPtr;
1536b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_STATUS_SUSPENDED;
153735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      case XML_INITIALIZED:
1538b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_PARSING:
1539b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ps_parsing = XML_FINISHED;
1540b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* fall through */
1541b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      default:
1542b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_STATUS_OK;
1543b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1544b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1545b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventEndPtr = eventPtr;
1546b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    processor = errorProcessor;
1547b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_STATUS_ERROR;
1548b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1549b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifndef XML_CONTEXT_BYTES
1550b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else if (bufferPtr == bufferEnd) {
1551b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const char *end;
1552b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int nLeftOver;
1553b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    enum XML_Error result;
1554b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    parseEndByteIndex += len;
1555b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    positionPtr = s;
1556b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ps_finalBuffer = (XML_Bool)isFinal;
1557b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1558b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    errorCode = processor(parser, s, parseEndPtr = s + len, &end);
1559b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1560b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (errorCode != XML_ERROR_NONE) {
1561b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      eventEndPtr = eventPtr;
1562b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      processor = errorProcessor;
1563b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_STATUS_ERROR;
1564b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1565b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
1566b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      switch (ps_parsing) {
1567b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_SUSPENDED:
1568b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        result = XML_STATUS_SUSPENDED;
1569b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
1570b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_INITIALIZED:
1571b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_PARSING:
1572b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (isFinal) {
1573b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          ps_parsing = XML_FINISHED;
157435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes          return XML_STATUS_OK;
1575b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
157635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      /* fall through */
157735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      default:
157835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        result = XML_STATUS_OK;
1579b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1580b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1581b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1582b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XmlUpdatePosition(encoding, positionPtr, end, &position);
1583b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    nLeftOver = s + len - end;
1584b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (nLeftOver) {
1585b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (buffer == NULL || nLeftOver > bufferLim - buffer) {
1586b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* FIXME avoid integer overflow */
1587b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        char *temp;
1588b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        temp = (buffer == NULL
1589b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                ? (char *)MALLOC(len * 2)
1590b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                : (char *)REALLOC(buffer, len * 2));
1591b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (temp == NULL) {
1592b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          errorCode = XML_ERROR_NO_MEMORY;
1593b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          eventPtr = eventEndPtr = NULL;
1594b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          processor = errorProcessor;
1595b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_STATUS_ERROR;
1596b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
159735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        buffer = temp;
1598b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        bufferLim = buffer + len * 2;
1599b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1600b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      memcpy(buffer, end, nLeftOver);
1601b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1602b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    bufferPtr = buffer;
1603b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    bufferEnd = buffer + nLeftOver;
1604b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    positionPtr = bufferPtr;
1605b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    parseEndPtr = bufferEnd;
1606b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventPtr = bufferPtr;
1607b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventEndPtr = bufferPtr;
1608b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return result;
1609b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1610b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif  /* not defined XML_CONTEXT_BYTES */
1611b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
1612b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    void *buff = XML_GetBuffer(parser, len);
1613b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (buff == NULL)
1614b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_STATUS_ERROR;
1615b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
1616b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      memcpy(buff, s, len);
1617b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ParseBuffer(parser, len, isFinal);
1618b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1619b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1620b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1621b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1622b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectenum XML_Status XMLCALL
1623b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_ParseBuffer(XML_Parser parser, int len, int isFinal)
1624b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1625b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *start;
1626b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_Status result = XML_STATUS_OK;
1627b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1628b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  switch (ps_parsing) {
1629b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_SUSPENDED:
1630b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    errorCode = XML_ERROR_SUSPENDED;
1631b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_STATUS_ERROR;
1632b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_FINISHED:
1633b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    errorCode = XML_ERROR_FINISHED;
1634b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_STATUS_ERROR;
163535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  case XML_INITIALIZED:
163635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    if (parentParser == NULL && !startParsing(parser)) {
163735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      errorCode = XML_ERROR_NO_MEMORY;
163835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      return XML_STATUS_ERROR;
163935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    }
1640b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  default:
1641b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ps_parsing = XML_PARSING;
1642b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1643b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1644b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  start = bufferPtr;
1645b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  positionPtr = start;
1646b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  bufferEnd += len;
1647b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  parseEndPtr = bufferEnd;
1648b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  parseEndByteIndex += len;
1649b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ps_finalBuffer = (XML_Bool)isFinal;
1650b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1651b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  errorCode = processor(parser, start, parseEndPtr, &bufferPtr);
1652b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1653b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (errorCode != XML_ERROR_NONE) {
1654b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventEndPtr = eventPtr;
1655b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    processor = errorProcessor;
1656b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_STATUS_ERROR;
1657b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1658b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
1659b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (ps_parsing) {
1660b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_SUSPENDED:
1661b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      result = XML_STATUS_SUSPENDED;
1662b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
166335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    case XML_INITIALIZED:
1664b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_PARSING:
1665b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (isFinal) {
1666b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ps_parsing = XML_FINISHED;
1667b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return result;
1668b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1669b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default: ;  /* should not happen */
1670b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1671b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1672b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1673b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
1674b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  positionPtr = bufferPtr;
1675b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return result;
1676b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1677b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1678b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid * XMLCALL
1679b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_GetBuffer(XML_Parser parser, int len)
1680b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1681b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  switch (ps_parsing) {
1682b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_SUSPENDED:
1683b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    errorCode = XML_ERROR_SUSPENDED;
1684b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
1685b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_FINISHED:
1686b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    errorCode = XML_ERROR_FINISHED;
1687b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
1688b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  default: ;
1689b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1690b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1691b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (len > bufferLim - bufferEnd) {
1692b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* FIXME avoid integer overflow */
1693b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int neededSize = len + (int)(bufferEnd - bufferPtr);
1694b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_CONTEXT_BYTES
1695b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int keep = (int)(bufferPtr - buffer);
1696b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1697b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (keep > XML_CONTEXT_BYTES)
1698b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      keep = XML_CONTEXT_BYTES;
1699b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    neededSize += keep;
1700b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif  /* defined XML_CONTEXT_BYTES */
1701b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (neededSize  <= bufferLim - buffer) {
1702b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_CONTEXT_BYTES
1703b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (keep < bufferPtr - buffer) {
1704b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        int offset = (int)(bufferPtr - buffer) - keep;
1705b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep);
1706b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        bufferEnd -= offset;
1707b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        bufferPtr -= offset;
1708b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1709b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
1710b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      memmove(buffer, bufferPtr, bufferEnd - bufferPtr);
1711b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      bufferEnd = buffer + (bufferEnd - bufferPtr);
1712b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      bufferPtr = buffer;
1713b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif  /* not defined XML_CONTEXT_BYTES */
1714b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1715b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
1716b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      char *newBuf;
1717b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      int bufferSize = (int)(bufferLim - bufferPtr);
1718b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (bufferSize == 0)
1719b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        bufferSize = INIT_BUFFER_SIZE;
1720b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      do {
1721b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        bufferSize *= 2;
1722b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      } while (bufferSize < neededSize);
1723b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      newBuf = (char *)MALLOC(bufferSize);
1724b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (newBuf == 0) {
1725b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        errorCode = XML_ERROR_NO_MEMORY;
1726b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return NULL;
1727b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1728b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      bufferLim = newBuf + bufferSize;
1729b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_CONTEXT_BYTES
1730b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (bufferPtr) {
1731b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        int keep = (int)(bufferPtr - buffer);
1732b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (keep > XML_CONTEXT_BYTES)
1733b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          keep = XML_CONTEXT_BYTES;
1734b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep);
1735b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        FREE(buffer);
1736b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        buffer = newBuf;
1737b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        bufferEnd = buffer + (bufferEnd - bufferPtr) + keep;
1738b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        bufferPtr = buffer + keep;
1739b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1740b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else {
1741b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        bufferEnd = newBuf + (bufferEnd - bufferPtr);
1742b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        bufferPtr = buffer = newBuf;
1743b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1744b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
1745b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (bufferPtr) {
1746b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr);
1747b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        FREE(buffer);
1748b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1749b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      bufferEnd = newBuf + (bufferEnd - bufferPtr);
1750b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      bufferPtr = buffer = newBuf;
1751b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif  /* not defined XML_CONTEXT_BYTES */
1752b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
175335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    eventPtr = eventEndPtr = NULL;
175435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    positionPtr = NULL;
1755b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1756b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return bufferEnd;
1757b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1758b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1759b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectenum XML_Status XMLCALL
1760b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_StopParser(XML_Parser parser, XML_Bool resumable)
1761b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1762b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  switch (ps_parsing) {
1763b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_SUSPENDED:
1764b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (resumable) {
1765b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      errorCode = XML_ERROR_SUSPENDED;
1766b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_STATUS_ERROR;
1767b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1768b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ps_parsing = XML_FINISHED;
1769b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    break;
1770b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_FINISHED:
1771b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    errorCode = XML_ERROR_FINISHED;
1772b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_STATUS_ERROR;
1773b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  default:
1774b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (resumable) {
1775b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
1776b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (isParamEntity) {
1777b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        errorCode = XML_ERROR_SUSPEND_PE;
1778b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_STATUS_ERROR;
1779b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1780b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
1781b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      ps_parsing = XML_SUSPENDED;
1782b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1783b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else
1784b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      ps_parsing = XML_FINISHED;
1785b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1786b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_STATUS_OK;
1787b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1788b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1789b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectenum XML_Status XMLCALL
1790b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_ResumeParser(XML_Parser parser)
1791b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1792b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_Status result = XML_STATUS_OK;
1793b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1794b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (ps_parsing != XML_SUSPENDED) {
1795b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    errorCode = XML_ERROR_NOT_SUSPENDED;
1796b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_STATUS_ERROR;
1797b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1798b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ps_parsing = XML_PARSING;
1799b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1800b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr);
1801b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1802b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (errorCode != XML_ERROR_NONE) {
1803b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventEndPtr = eventPtr;
1804b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    processor = errorProcessor;
1805b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_STATUS_ERROR;
1806b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1807b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
1808b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (ps_parsing) {
1809b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_SUSPENDED:
1810b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      result = XML_STATUS_SUSPENDED;
1811b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
181235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    case XML_INITIALIZED:
1813b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_PARSING:
1814b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (ps_finalBuffer) {
1815b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ps_parsing = XML_FINISHED;
1816b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return result;
1817b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1818b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default: ;
1819b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1820b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1821b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1822b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
1823b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  positionPtr = bufferPtr;
1824b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return result;
1825b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1826b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1827b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1828b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status)
1829b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1830b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  assert(status != NULL);
1831b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *status = parser->m_parsingStatus;
1832b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1833b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1834b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectenum XML_Error XMLCALL
1835b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_GetErrorCode(XML_Parser parser)
1836b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1837b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return errorCode;
1838b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1839b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1840b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_Index XMLCALL
1841b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_GetCurrentByteIndex(XML_Parser parser)
1842b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1843b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (eventPtr)
1844b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return parseEndByteIndex - (parseEndPtr - eventPtr);
1845b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return -1;
1846b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1847b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1848b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectint XMLCALL
1849b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_GetCurrentByteCount(XML_Parser parser)
1850b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1851b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (eventEndPtr && eventPtr)
1852b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return (int)(eventEndPtr - eventPtr);
1853b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 0;
1854b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1855b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1856b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectconst char * XMLCALL
1857b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_GetInputContext(XML_Parser parser, int *offset, int *size)
1858b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1859b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_CONTEXT_BYTES
1860b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (eventPtr && buffer) {
1861b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *offset = (int)(eventPtr - buffer);
1862b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *size   = (int)(bufferEnd - buffer);
1863b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return buffer;
1864b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1865b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* defined XML_CONTEXT_BYTES */
1866b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return (char *) 0;
1867b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1868b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1869b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_Size XMLCALL
1870b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_GetCurrentLineNumber(XML_Parser parser)
1871b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1872b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (eventPtr && eventPtr >= positionPtr) {
1873b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
1874b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    positionPtr = eventPtr;
1875b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1876b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return position.lineNumber + 1;
1877b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1878b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1879b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_Size XMLCALL
1880b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_GetCurrentColumnNumber(XML_Parser parser)
1881b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1882b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (eventPtr && eventPtr >= positionPtr) {
1883b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
1884b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    positionPtr = eventPtr;
1885b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1886b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return position.columnNumber;
1887b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1888b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1889b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1890b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_FreeContentModel(XML_Parser parser, XML_Content *model)
1891b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1892b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  FREE(model);
1893b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1894b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1895b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid * XMLCALL
1896b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_MemMalloc(XML_Parser parser, size_t size)
1897b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1898b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return MALLOC(size);
1899b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1900b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1901b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid * XMLCALL
1902b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_MemRealloc(XML_Parser parser, void *ptr, size_t size)
1903b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1904b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return REALLOC(ptr, size);
1905b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1906b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1907b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1908b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_MemFree(XML_Parser parser, void *ptr)
1909b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1910b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  FREE(ptr);
1911b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1912b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1913b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid XMLCALL
1914b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_DefaultCurrent(XML_Parser parser)
1915b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1916b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (defaultHandler) {
1917b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (openInternalEntities)
1918b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      reportDefault(parser,
1919b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    internalEncoding,
1920b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    openInternalEntities->internalEventPtr,
1921b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    openInternalEntities->internalEventEndPtr);
1922b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else
1923b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      reportDefault(parser, encoding, eventPtr, eventEndPtr);
1924b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1925b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1926b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1927b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectconst XML_LChar * XMLCALL
1928b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_ErrorString(enum XML_Error code)
1929b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1930b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  static const XML_LChar* const message[] = {
1931b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    0,
1932b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("out of memory"),
1933b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("syntax error"),
1934b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("no element found"),
1935b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("not well-formed (invalid token)"),
1936b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("unclosed token"),
1937b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("partial character"),
1938b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("mismatched tag"),
1939b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("duplicate attribute"),
1940b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("junk after document element"),
1941b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("illegal parameter entity reference"),
1942b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("undefined entity"),
1943b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("recursive entity reference"),
1944b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("asynchronous entity"),
1945b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("reference to invalid character number"),
1946b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("reference to binary entity"),
1947b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("reference to external entity in attribute"),
1948b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("XML or text declaration not at start of entity"),
1949b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("unknown encoding"),
1950b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("encoding specified in XML declaration is incorrect"),
1951b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("unclosed CDATA section"),
1952b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("error in processing external entity reference"),
1953b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("document is not standalone"),
1954b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("unexpected parser state - please send a bug report"),
1955b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("entity declared in parameter entity"),
1956b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("requested feature requires XML_DTD support in Expat"),
1957b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("cannot change setting once parsing has begun"),
1958b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("unbound prefix"),
1959b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("must not undeclare prefix"),
1960b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("incomplete markup in parameter entity"),
1961b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("XML declaration not well-formed"),
1962b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("text declaration not well-formed"),
1963b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("illegal character(s) in public id"),
1964b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("parser suspended"),
1965b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("parser not suspended"),
1966b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("parsing aborted"),
1967b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("parsing finished"),
1968b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("cannot suspend in external parameter entity"),
1969b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("reserved prefix (xml) must not be undeclared or bound to another namespace name"),
1970b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("reserved prefix (xmlns) must not be declared or undeclared"),
1971b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_L("prefix must not be bound to one of the reserved namespace names")
1972b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  };
1973b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (code > 0 && code < sizeof(message)/sizeof(message[0]))
1974b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return message[code];
1975b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return NULL;
1976b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1977b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1978b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectconst XML_LChar * XMLCALL
1979b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_ExpatVersion(void) {
1980b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1981b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* V1 is used to string-ize the version number. However, it would
1982b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     string-ize the actual version macro *names* unless we get them
1983b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     substituted before being passed to V1. CPP is defined to expand
1984b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     a macro, then rescan for more expansions. Thus, we use V2 to expand
1985b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     the version macros, then CPP will expand the resulting V1() macro
1986b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     with the correct numerals. */
1987b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* ### I'm assuming cpp is portable in this respect... */
1988b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1989b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c)
1990b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define V2(a,b,c) XML_L("expat_")V1(a,b,c)
1991b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1992b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION);
1993b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1994b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef V1
1995b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef V2
1996b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1997b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1998b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_Expat_Version XMLCALL
1999b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_ExpatVersionInfo(void)
2000b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
2001b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Expat_Version version;
2002b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2003b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  version.major = XML_MAJOR_VERSION;
2004b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  version.minor = XML_MINOR_VERSION;
2005b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  version.micro = XML_MICRO_VERSION;
2006b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2007b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return version;
2008b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
2009b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2010b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectconst XML_Feature * XMLCALL
2011b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXML_GetFeatureList(void)
2012b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
2013b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  static const XML_Feature features[] = {
2014b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    {XML_FEATURE_SIZEOF_XML_CHAR,  XML_L("sizeof(XML_Char)"),
2015b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     sizeof(XML_Char)},
2016b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"),
2017b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     sizeof(XML_LChar)},
2018b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_UNICODE
2019b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    {XML_FEATURE_UNICODE,          XML_L("XML_UNICODE"), 0},
2020b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
2021b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_UNICODE_WCHAR_T
2022b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    {XML_FEATURE_UNICODE_WCHAR_T,  XML_L("XML_UNICODE_WCHAR_T"), 0},
2023b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
2024b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
2025b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    {XML_FEATURE_DTD,              XML_L("XML_DTD"), 0},
2026b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
2027b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_CONTEXT_BYTES
2028b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    {XML_FEATURE_CONTEXT_BYTES,    XML_L("XML_CONTEXT_BYTES"),
2029b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     XML_CONTEXT_BYTES},
2030b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
2031b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_MIN_SIZE
2032b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    {XML_FEATURE_MIN_SIZE,         XML_L("XML_MIN_SIZE"), 0},
2033b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
2034b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_NS
2035b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    {XML_FEATURE_NS,               XML_L("XML_NS"), 0},
2036b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
2037d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#ifdef XML_LARGE_SIZE
2038d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    {XML_FEATURE_LARGE_SIZE,       XML_L("XML_LARGE_SIZE"), 0},
203935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#endif
204035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#ifdef XML_ATTR_INFO
204135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    {XML_FEATURE_ATTR_INFO,        XML_L("XML_ATTR_INFO"), 0},
204235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#endif
2043b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    {XML_FEATURE_END,              NULL, 0}
2044b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  };
2045b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2046b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return features;
2047b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
2048b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2049b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Initially tag->rawName always points into the parse buffer;
2050b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   for those TAG instances opened while the current parse buffer was
2051b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   processed, and not yet closed, we need to store tag->rawName in a more
2052b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   permanent location, since the parse buffer is about to be discarded.
2053b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
2054b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Bool
2055b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectstoreRawNames(XML_Parser parser)
2056b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
2057b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  TAG *tag = tagStack;
2058b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  while (tag) {
2059b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int bufSize;
2060b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1);
2061b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *rawNameBuf = tag->buf + nameLen;
2062b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* Stop if already stored.  Since tagStack is a stack, we can stop
2063b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       at the first entry that has already been copied; everything
2064b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       below it in the stack is already been accounted for in a
2065b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       previous call to this function.
2066b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    */
2067b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (tag->rawName == rawNameBuf)
2068b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
2069b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* For re-use purposes we need to ensure that the
2070b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       size of tag->buf is a multiple of sizeof(XML_Char).
2071b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    */
2072b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char));
2073b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (bufSize > tag->bufEnd - tag->buf) {
2074b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      char *temp = (char *)REALLOC(tag->buf, bufSize);
2075b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (temp == NULL)
2076b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_FALSE;
2077b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* if tag->name.str points to tag->buf (only when namespace
2078b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         processing is off) then we have to update it
2079b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      */
2080b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (tag->name.str == (XML_Char *)tag->buf)
2081b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        tag->name.str = (XML_Char *)temp;
2082b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* if tag->name.localPart is set (when namespace processing is on)
2083b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         then update it as well, since it will always point into tag->buf
2084b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      */
2085b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (tag->name.localPart)
2086b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        tag->name.localPart = (XML_Char *)temp + (tag->name.localPart -
2087b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                                  (XML_Char *)tag->buf);
2088b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      tag->buf = temp;
2089b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      tag->bufEnd = temp + bufSize;
2090b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      rawNameBuf = temp + nameLen;
2091b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2092b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    memcpy(rawNameBuf, tag->rawName, tag->rawNameLength);
2093b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tag->rawName = rawNameBuf;
2094b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tag = tag->parent;
2095b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
2096b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_TRUE;
2097b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
2098b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2099b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
2100b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectcontentProcessor(XML_Parser parser,
2101b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                 const char *start,
2102b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                 const char *end,
2103b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                 const char **endPtr)
2104b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
210535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  enum XML_Error result = doContent(parser, 0, encoding, start, end,
2106b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    endPtr, (XML_Bool)!ps_finalBuffer);
2107b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (result == XML_ERROR_NONE) {
2108b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!storeRawNames(parser))
2109b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NO_MEMORY;
2110b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
2111b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return result;
2112b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
2113b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2114b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
2115b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectexternalEntityInitProcessor(XML_Parser parser,
2116b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const char *start,
2117b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const char *end,
2118b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const char **endPtr)
2119b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
2120b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_Error result = initializeEncoding(parser);
2121b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (result != XML_ERROR_NONE)
2122b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return result;
2123b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  processor = externalEntityInitProcessor2;
2124b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return externalEntityInitProcessor2(parser, start, end, endPtr);
2125b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
2126b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2127b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
2128b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectexternalEntityInitProcessor2(XML_Parser parser,
2129b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             const char *start,
2130b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             const char *end,
2131b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             const char **endPtr)
2132b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
2133b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *next = start; /* XmlContentTok doesn't always set the last arg */
2134b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int tok = XmlContentTok(encoding, start, end, &next);
2135b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  switch (tok) {
2136b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_TOK_BOM:
2137b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* If we are at the end of the buffer, this would cause the next stage,
2138b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       i.e. externalEntityInitProcessor3, to pass control directly to
2139b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       doContent (by detecting XML_TOK_NONE) without processing any xml text
2140b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent.
2141b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    */
2142b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (next == end && !ps_finalBuffer) {
2143b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *endPtr = next;
2144b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
2145b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2146b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    start = next;
2147b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    break;
2148b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_TOK_PARTIAL:
2149b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!ps_finalBuffer) {
2150b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *endPtr = start;
2151b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
2152b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2153b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventPtr = start;
2154b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_UNCLOSED_TOKEN;
2155b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_TOK_PARTIAL_CHAR:
2156b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!ps_finalBuffer) {
2157b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *endPtr = start;
2158b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
2159b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2160b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventPtr = start;
2161b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_PARTIAL_CHAR;
2162b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
2163b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  processor = externalEntityInitProcessor3;
2164b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return externalEntityInitProcessor3(parser, start, end, endPtr);
2165b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
2166b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2167b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
2168b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectexternalEntityInitProcessor3(XML_Parser parser,
2169b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             const char *start,
2170b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             const char *end,
2171b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             const char **endPtr)
2172b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
2173b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int tok;
2174b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *next = start; /* XmlContentTok doesn't always set the last arg */
2175b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  eventPtr = start;
2176b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  tok = XmlContentTok(encoding, start, end, &next);
2177b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  eventEndPtr = next;
2178b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2179b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  switch (tok) {
2180b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_TOK_XML_DECL:
2181b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    {
2182b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      enum XML_Error result;
2183b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      result = processXmlDecl(parser, 1, start, next);
2184b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (result != XML_ERROR_NONE)
2185b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return result;
2186b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      switch (ps_parsing) {
218735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      case XML_SUSPENDED:
2188b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *endPtr = next;
2189b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
2190b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_FINISHED:
2191b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_ABORTED;
2192b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      default:
2193b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        start = next;
2194b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2195b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2196b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    break;
2197b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_TOK_PARTIAL:
2198b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!ps_finalBuffer) {
2199b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *endPtr = start;
2200b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
2201b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2202b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_UNCLOSED_TOKEN;
2203b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_TOK_PARTIAL_CHAR:
2204b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!ps_finalBuffer) {
2205b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *endPtr = start;
2206b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
2207b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2208b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_PARTIAL_CHAR;
2209b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
2210b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  processor = externalEntityContentProcessor;
2211b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  tagLevel = 1;
2212b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return externalEntityContentProcessor(parser, start, end, endPtr);
2213b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
2214b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2215b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
2216b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectexternalEntityContentProcessor(XML_Parser parser,
2217b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               const char *start,
2218b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               const char *end,
2219b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               const char **endPtr)
2220b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
222135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  enum XML_Error result = doContent(parser, 1, encoding, start, end,
2222b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    endPtr, (XML_Bool)!ps_finalBuffer);
2223b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (result == XML_ERROR_NONE) {
2224b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!storeRawNames(parser))
2225b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NO_MEMORY;
2226b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
2227b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return result;
2228b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
2229b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2230b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
2231b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectdoContent(XML_Parser parser,
2232b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          int startTagLevel,
2233b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          const ENCODING *enc,
2234b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          const char *s,
2235b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          const char *end,
2236b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          const char **nextPtr,
2237b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          XML_Bool haveMore)
2238b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
2239b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* save one level of indirection */
224035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  DTD * const dtd = _dtd;
2241b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2242b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char **eventPP;
2243b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char **eventEndPP;
2244b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (enc == encoding) {
2245b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventPP = &eventPtr;
2246b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventEndPP = &eventEndPtr;
2247b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
2248b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
2249b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventPP = &(openInternalEntities->internalEventPtr);
2250b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventEndPP = &(openInternalEntities->internalEventEndPtr);
2251b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
2252b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *eventPP = s;
2253b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2254b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
2255b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const char *next = s; /* XmlContentTok doesn't always set the last arg */
2256b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int tok = XmlContentTok(enc, s, end, &next);
2257b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *eventEndPP = next;
2258b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (tok) {
2259b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_TRAILING_CR:
2260b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (haveMore) {
2261b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = s;
2262b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
2263b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2264b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *eventEndPP = end;
2265b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (characterDataHandler) {
2266b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_Char c = 0xA;
2267b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        characterDataHandler(handlerArg, &c, 1);
2268b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2269b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else if (defaultHandler)
2270b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        reportDefault(parser, enc, s, end);
227135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      /* We are at the end of the final buffer, should we check for
227235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes         XML_SUSPENDED, XML_FINISHED?
2273b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      */
2274b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (startTagLevel == 0)
2275b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_ELEMENTS;
2276b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (tagLevel != startTagLevel)
2277b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_ASYNC_ENTITY;
2278b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextPtr = end;
2279b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
2280b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_NONE:
2281b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (haveMore) {
2282b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = s;
2283b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
2284b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2285b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (startTagLevel > 0) {
2286b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (tagLevel != startTagLevel)
2287b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_ASYNC_ENTITY;
2288b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = s;
2289b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
2290b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2291b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NO_ELEMENTS;
2292b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_INVALID:
2293b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *eventPP = next;
2294b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_INVALID_TOKEN;
2295b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_PARTIAL:
2296b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (haveMore) {
2297b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = s;
2298b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
2299b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2300b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_UNCLOSED_TOKEN;
2301b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_PARTIAL_CHAR:
2302b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (haveMore) {
2303b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = s;
2304b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
2305b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2306b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_PARTIAL_CHAR;
2307b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_ENTITY_REF:
2308b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      {
2309b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const XML_Char *name;
2310b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ENTITY *entity;
2311b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc,
2312b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                              s + enc->minBytesPerChar,
2313b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                              next - enc->minBytesPerChar);
2314b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (ch) {
2315b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (characterDataHandler)
2316b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            characterDataHandler(handlerArg, &ch, 1);
2317b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          else if (defaultHandler)
2318b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            reportDefault(parser, enc, s, next);
2319b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          break;
2320b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2321b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        name = poolStoreString(&dtd->pool, enc,
2322b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                s + enc->minBytesPerChar,
2323b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                next - enc->minBytesPerChar);
2324b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!name)
2325b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
232635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0);
2327b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolDiscard(&dtd->pool);
2328b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* First, determine if a check for an existing declaration is needed;
2329b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           if yes, check that the entity exists, and that it is internal,
2330b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           otherwise call the skipped entity or default handler.
2331b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        */
2332b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!dtd->hasParamEntityRefs || dtd->standalone) {
2333b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!entity)
2334b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_UNDEFINED_ENTITY;
2335b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          else if (!entity->is_internal)
2336b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_ENTITY_DECLARED_IN_PE;
2337b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2338b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (!entity) {
2339b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (skippedEntityHandler)
2340b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            skippedEntityHandler(handlerArg, name, 0);
2341b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          else if (defaultHandler)
2342b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            reportDefault(parser, enc, s, next);
2343b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          break;
2344b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2345b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (entity->open)
2346b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_RECURSIVE_ENTITY_REF;
2347b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (entity->notation)
2348b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_BINARY_ENTITY_REF;
2349b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (entity->textPtr) {
2350b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          enum XML_Error result;
2351b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!defaultExpandInternalEntities) {
2352b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (skippedEntityHandler)
2353b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              skippedEntityHandler(handlerArg, entity->name, 0);
2354b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            else if (defaultHandler)
2355b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              reportDefault(parser, enc, s, next);
2356b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            break;
2357b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
2358b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          result = processInternalEntity(parser, entity, XML_FALSE);
2359b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (result != XML_ERROR_NONE)
2360b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return result;
2361b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2362b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (externalEntityRefHandler) {
2363b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          const XML_Char *context;
2364b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          entity->open = XML_TRUE;
2365b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          context = getContext(parser);
2366b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          entity->open = XML_FALSE;
2367b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!context)
2368b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_NO_MEMORY;
2369b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!externalEntityRefHandler(externalEntityRefHandlerArg,
2370b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        context,
2371b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        entity->base,
2372b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        entity->systemId,
2373b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        entity->publicId))
2374b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
2375b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          poolDiscard(&tempPool);
2376b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2377b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (defaultHandler)
2378b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          reportDefault(parser, enc, s, next);
2379b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
2380b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2381b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_START_TAG_NO_ATTS:
2382b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* fall through */
2383b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_START_TAG_WITH_ATTS:
2384b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      {
2385b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        TAG *tag;
2386b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        enum XML_Error result;
2387b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_Char *toPtr;
2388b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (freeTagList) {
2389b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          tag = freeTagList;
2390b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          freeTagList = freeTagList->parent;
2391b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2392b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else {
2393b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          tag = (TAG *)MALLOC(sizeof(TAG));
2394b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!tag)
2395b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_NO_MEMORY;
2396b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE);
2397b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!tag->buf) {
2398b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            FREE(tag);
2399b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_NO_MEMORY;
2400b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
2401b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE;
2402b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2403b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        tag->bindings = NULL;
2404b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        tag->parent = tagStack;
2405b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        tagStack = tag;
2406b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        tag->name.localPart = NULL;
2407b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        tag->name.prefix = NULL;
2408b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        tag->rawName = s + enc->minBytesPerChar;
2409b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        tag->rawNameLength = XmlNameLength(enc, tag->rawName);
2410b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ++tagLevel;
2411b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        {
2412b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          const char *rawNameEnd = tag->rawName + tag->rawNameLength;
2413b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          const char *fromPtr = tag->rawName;
2414b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          toPtr = (XML_Char *)tag->buf;
2415b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          for (;;) {
2416b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            int bufSize;
2417b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            int convLen;
2418b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            XmlConvert(enc,
2419b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       &fromPtr, rawNameEnd,
2420b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1);
2421b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            convLen = (int)(toPtr - (XML_Char *)tag->buf);
2422b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (fromPtr == rawNameEnd) {
2423b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              tag->name.strLen = convLen;
2424b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              break;
2425b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            }
2426b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            bufSize = (int)(tag->bufEnd - tag->buf) << 1;
2427b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            {
2428b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              char *temp = (char *)REALLOC(tag->buf, bufSize);
2429b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              if (temp == NULL)
2430b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                return XML_ERROR_NO_MEMORY;
2431b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              tag->buf = temp;
2432b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              tag->bufEnd = temp + bufSize;
2433b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              toPtr = (XML_Char *)temp + convLen;
2434b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            }
2435b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
2436b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2437b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        tag->name.str = (XML_Char *)tag->buf;
2438b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *toPtr = XML_T('\0');
2439b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings));
2440b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (result)
2441b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return result;
2442b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (startElementHandler)
2443b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          startElementHandler(handlerArg, tag->name.str,
2444b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              (const XML_Char **)atts);
2445b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (defaultHandler)
2446b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          reportDefault(parser, enc, s, next);
2447b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolClear(&tempPool);
2448b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
2449b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2450b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_EMPTY_ELEMENT_NO_ATTS:
2451b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* fall through */
2452b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_EMPTY_ELEMENT_WITH_ATTS:
2453b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      {
2454b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const char *rawName = s + enc->minBytesPerChar;
2455b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        enum XML_Error result;
2456b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        BINDING *bindings = NULL;
2457b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_Bool noElmHandlers = XML_TRUE;
2458b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        TAG_NAME name;
2459b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        name.str = poolStoreString(&tempPool, enc, rawName,
2460b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                   rawName + XmlNameLength(enc, rawName));
2461b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!name.str)
2462b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
2463b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolFinish(&tempPool);
2464b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        result = storeAtts(parser, enc, s, &name, &bindings);
2465b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (result)
2466b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return result;
2467b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolFinish(&tempPool);
2468b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (startElementHandler) {
2469b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          startElementHandler(handlerArg, name.str, (const XML_Char **)atts);
2470b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          noElmHandlers = XML_FALSE;
2471b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2472b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (endElementHandler) {
2473b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (startElementHandler)
2474b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            *eventPP = *eventEndPP;
2475b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          endElementHandler(handlerArg, name.str);
2476b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          noElmHandlers = XML_FALSE;
2477b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2478b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (noElmHandlers && defaultHandler)
2479b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          reportDefault(parser, enc, s, next);
2480b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolClear(&tempPool);
2481b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        while (bindings) {
2482b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          BINDING *b = bindings;
2483b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (endNamespaceDeclHandler)
2484b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            endNamespaceDeclHandler(handlerArg, b->prefix->name);
2485b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          bindings = bindings->nextTagBinding;
2486b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          b->nextTagBinding = freeBindingList;
2487b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          freeBindingList = b;
2488b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          b->prefix->binding = b->prevPrefixBinding;
2489b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2490b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2491b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (tagLevel == 0)
2492b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return epilogProcessor(parser, next, end, nextPtr);
2493b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
2494b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_END_TAG:
2495b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (tagLevel == startTagLevel)
2496b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_ASYNC_ENTITY;
2497b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else {
2498b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        int len;
2499b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const char *rawName;
2500b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        TAG *tag = tagStack;
2501b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        tagStack = tag->parent;
2502b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        tag->parent = freeTagList;
2503b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        freeTagList = tag;
2504b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        rawName = s + enc->minBytesPerChar*2;
2505b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        len = XmlNameLength(enc, rawName);
2506b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (len != tag->rawNameLength
2507b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            || memcmp(tag->rawName, rawName, len) != 0) {
2508b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          *eventPP = rawName;
2509b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_TAG_MISMATCH;
2510b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2511b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        --tagLevel;
2512b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (endElementHandler) {
2513b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          const XML_Char *localPart;
2514b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          const XML_Char *prefix;
2515b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          XML_Char *uri;
2516b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          localPart = tag->name.localPart;
2517b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (ns && localPart) {
2518b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            /* localPart and prefix may have been overwritten in
2519b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               tag->name.str, since this points to the binding->uri
2520b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               buffer which gets re-used; so we have to add them again
2521b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            */
2522b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            uri = (XML_Char *)tag->name.str + tag->name.uriLen;
2523b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            /* don't need to check for space - already done in storeAtts() */
2524b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            while (*localPart) *uri++ = *localPart++;
2525b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            prefix = (XML_Char *)tag->name.prefix;
2526b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (ns_triplets && prefix) {
2527b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              *uri++ = namespaceSeparator;
2528b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              while (*prefix) *uri++ = *prefix++;
2529b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             }
2530b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            *uri = XML_T('\0');
2531b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
2532b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          endElementHandler(handlerArg, tag->name.str);
2533b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2534b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (defaultHandler)
2535b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          reportDefault(parser, enc, s, next);
2536b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        while (tag->bindings) {
2537b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          BINDING *b = tag->bindings;
2538b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (endNamespaceDeclHandler)
2539b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            endNamespaceDeclHandler(handlerArg, b->prefix->name);
2540b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          tag->bindings = tag->bindings->nextTagBinding;
2541b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          b->nextTagBinding = freeBindingList;
2542b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          freeBindingList = b;
2543b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          b->prefix->binding = b->prevPrefixBinding;
2544b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2545b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (tagLevel == 0)
2546b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return epilogProcessor(parser, next, end, nextPtr);
2547b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2548b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
2549b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_CHAR_REF:
2550b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      {
2551b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        int n = XmlCharRefNumber(enc, s);
2552b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (n < 0)
2553b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_BAD_CHAR_REF;
2554b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (characterDataHandler) {
2555b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          XML_Char buf[XML_ENCODE_MAX];
2556b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf));
2557b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2558b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (defaultHandler)
2559b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          reportDefault(parser, enc, s, next);
2560b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2561b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
2562b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_XML_DECL:
2563b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_MISPLACED_XML_PI;
2564b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_DATA_NEWLINE:
2565b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (characterDataHandler) {
2566b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_Char c = 0xA;
2567b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        characterDataHandler(handlerArg, &c, 1);
2568b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2569b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else if (defaultHandler)
2570b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        reportDefault(parser, enc, s, next);
2571b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
2572b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_CDATA_SECT_OPEN:
2573b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      {
2574b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        enum XML_Error result;
2575b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (startCdataSectionHandler)
2576b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          startCdataSectionHandler(handlerArg);
2577b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#if 0
2578b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* Suppose you doing a transformation on a document that involves
2579b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           changing only the character data.  You set up a defaultHandler
2580b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           and a characterDataHandler.  The defaultHandler simply copies
2581b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           characters through.  The characterDataHandler does the
2582b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           transformation and writes the characters out escaping them as
2583b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           necessary.  This case will fail to work if we leave out the
2584b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           following two lines (because & and < inside CDATA sections will
2585b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           be incorrectly escaped).
2586b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2587b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           However, now we have a start/endCdataSectionHandler, so it seems
2588b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           easier to let the user deal with this.
2589b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        */
2590b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (characterDataHandler)
2591b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          characterDataHandler(handlerArg, dataBuf, 0);
2592b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
2593b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (defaultHandler)
2594b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          reportDefault(parser, enc, s, next);
2595b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore);
2596b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (result != XML_ERROR_NONE)
2597b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return result;
2598b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (!next) {
2599b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          processor = cdataSectionProcessor;
2600b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return result;
2601b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2602b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2603b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
2604b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_TRAILING_RSQB:
2605b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (haveMore) {
2606b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = s;
2607b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
2608b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2609b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (characterDataHandler) {
2610b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (MUST_CONVERT(enc, s)) {
2611b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          ICHAR *dataPtr = (ICHAR *)dataBuf;
2612b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);
2613b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          characterDataHandler(handlerArg, dataBuf,
2614b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               (int)(dataPtr - (ICHAR *)dataBuf));
2615b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2616b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else
2617b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          characterDataHandler(handlerArg,
2618b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               (XML_Char *)s,
2619b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               (int)((XML_Char *)end - (XML_Char *)s));
2620b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2621b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else if (defaultHandler)
2622b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        reportDefault(parser, enc, s, end);
262335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      /* We are at the end of the final buffer, should we check for
262435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes         XML_SUSPENDED, XML_FINISHED?
2625b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      */
2626b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (startTagLevel == 0) {
2627b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *eventPP = end;
2628b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_ELEMENTS;
2629b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2630b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (tagLevel != startTagLevel) {
2631b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *eventPP = end;
2632b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_ASYNC_ENTITY;
2633b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2634b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextPtr = end;
2635b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
263635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    case XML_TOK_DATA_CHARS:
2637d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      {
2638d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        XML_CharacterDataHandler charDataHandler = characterDataHandler;
2639d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        if (charDataHandler) {
2640d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes          if (MUST_CONVERT(enc, s)) {
2641d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes            for (;;) {
2642d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes              ICHAR *dataPtr = (ICHAR *)dataBuf;
2643d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes              XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
2644d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes              *eventEndPP = s;
2645d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes              charDataHandler(handlerArg, dataBuf,
2646d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes                              (int)(dataPtr - (ICHAR *)dataBuf));
2647d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes              if (s == next)
2648d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes                break;
2649d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes              *eventPP = s;
2650d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes            }
2651b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
2652d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes          else
2653d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes            charDataHandler(handlerArg,
2654d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes                            (XML_Char *)s,
2655d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes                            (int)((XML_Char *)next - (XML_Char *)s));
2656b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2657d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        else if (defaultHandler)
2658d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes          reportDefault(parser, enc, s, next);
2659b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2660b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
2661b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_PI:
2662b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!reportProcessingInstruction(parser, enc, s, next))
2663b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
2664b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
2665b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_COMMENT:
2666b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!reportComment(parser, enc, s, next))
2667b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
2668b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
2669b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default:
2670b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (defaultHandler)
2671b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        reportDefault(parser, enc, s, next);
2672b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
2673b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2674b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *eventPP = s = next;
2675b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (ps_parsing) {
267635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    case XML_SUSPENDED:
2677b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextPtr = next;
2678b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
2679b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_FINISHED:
2680b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_ABORTED;
2681b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default: ;
2682b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2683b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
2684b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* not reached */
2685b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
2686b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2687b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Precondition: all arguments must be non-NULL;
2688b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   Purpose:
2689b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   - normalize attributes
2690b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   - check attributes for well-formedness
2691b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   - generate namespace aware attribute names (URI, prefix)
2692b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   - build list of attributes for startElementHandler
2693b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   - default attributes
2694b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   - process namespace declarations (check and report them)
2695b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   - generate namespace aware element name (URI, prefix)
2696b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
2697b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
2698b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectstoreAtts(XML_Parser parser, const ENCODING *enc,
2699b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          const char *attStr, TAG_NAME *tagNamePtr,
2700b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          BINDING **bindingsPtr)
2701b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
2702b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD * const dtd = _dtd;  /* save one level of indirection */
2703b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ELEMENT_TYPE *elementType;
2704b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int nDefaultAtts;
2705b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char **appAtts;   /* the attribute list for the application */
2706b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int attIndex = 0;
2707b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int prefixLen;
2708b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int i;
2709b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int n;
2710b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char *uri;
2711b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int nPrefixes = 0;
2712b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  BINDING *binding;
2713b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *localPart;
2714b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2715b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* lookup the element type name */
271635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str,0);
2717b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!elementType) {
2718b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str);
2719b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!name)
2720b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NO_MEMORY;
272135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name,
2722b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                         sizeof(ELEMENT_TYPE));
2723b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!elementType)
2724b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NO_MEMORY;
2725b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (ns && !setElementTypePrefix(parser, elementType))
2726b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NO_MEMORY;
2727b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
2728b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  nDefaultAtts = elementType->nDefaultAtts;
2729b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2730b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* get the attributes from the tokenizer */
2731b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  n = XmlGetAttributes(enc, attStr, attsSize, atts);
2732b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (n + nDefaultAtts > attsSize) {
2733b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int oldAttsSize = attsSize;
2734b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ATTRIBUTE *temp;
273535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#ifdef XML_ATTR_INFO
273635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    XML_AttrInfo *temp2;
273735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#endif
2738b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;
2739b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE));
2740b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (temp == NULL)
2741b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NO_MEMORY;
2742b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    atts = temp;
274335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#ifdef XML_ATTR_INFO
274435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    temp2 = (XML_AttrInfo *)REALLOC((void *)attInfo, attsSize * sizeof(XML_AttrInfo));
274535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    if (temp2 == NULL)
274635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      return XML_ERROR_NO_MEMORY;
274735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    attInfo = temp2;
274835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#endif
2749b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (n > oldAttsSize)
2750b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      XmlGetAttributes(enc, attStr, n, atts);
2751b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
2752b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2753b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  appAtts = (const XML_Char **)atts;
2754b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (i = 0; i < n; i++) {
275535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    ATTRIBUTE *currAtt = &atts[i];
275635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#ifdef XML_ATTR_INFO
275735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    XML_AttrInfo *currAttInfo = &attInfo[i];
275835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#endif
2759b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* add the name and value to the attribute list */
276035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name,
276135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                                         currAtt->name
276235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                                         + XmlNameLength(enc, currAtt->name));
2763b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!attId)
2764b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NO_MEMORY;
276535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#ifdef XML_ATTR_INFO
276635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    currAttInfo->nameStart = parseEndByteIndex - (parseEndPtr - currAtt->name);
276735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    currAttInfo->nameEnd = currAttInfo->nameStart +
276835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                           XmlNameLength(enc, currAtt->name);
276935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    currAttInfo->valueStart = parseEndByteIndex -
277035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                            (parseEndPtr - currAtt->valuePtr);
277135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    currAttInfo->valueEnd = parseEndByteIndex - (parseEndPtr - currAtt->valueEnd);
277235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#endif
2773b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* Detect duplicate attributes by their QNames. This does not work when
2774b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       namespace processing is turned on and different prefixes for the same
2775b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       namespace are used. For this case we have a check further down.
2776b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    */
2777b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if ((attId->name)[-1]) {
2778b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (enc == encoding)
2779b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        eventPtr = atts[i].name;
2780b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_DUPLICATE_ATTRIBUTE;
2781b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2782b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    (attId->name)[-1] = 1;
2783b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    appAtts[attIndex++] = attId->name;
2784b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!atts[i].normalized) {
2785b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      enum XML_Error result;
2786b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      XML_Bool isCdata = XML_TRUE;
2787b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2788b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* figure out whether declared as other than CDATA */
2789b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (attId->maybeTokenized) {
2790b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        int j;
2791b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        for (j = 0; j < nDefaultAtts; j++) {
2792b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (attId == elementType->defaultAtts[j].id) {
2793b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            isCdata = elementType->defaultAtts[j].isCdata;
2794b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            break;
2795b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
2796b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2797b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2798b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2799b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* normalize the attribute value */
2800b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      result = storeAttributeValue(parser, enc, isCdata,
2801b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                   atts[i].valuePtr, atts[i].valueEnd,
2802b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                   &tempPool);
2803b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (result)
2804b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return result;
2805b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      appAtts[attIndex] = poolStart(&tempPool);
2806b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      poolFinish(&tempPool);
2807b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2808b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
2809b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* the value did not need normalizing */
2810b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr,
2811b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                          atts[i].valueEnd);
2812b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (appAtts[attIndex] == 0)
2813b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
2814b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      poolFinish(&tempPool);
2815b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2816b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* handle prefixed attribute names */
2817b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (attId->prefix) {
2818b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (attId->xmlns) {
2819b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* deal with namespace declarations here */
2820b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        enum XML_Error result = addBinding(parser, attId->prefix, attId,
2821b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                           appAtts[attIndex], bindingsPtr);
2822b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (result)
2823b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return result;
2824b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        --attIndex;
2825b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2826b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else {
2827b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* deal with other prefixed names later */
2828b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        attIndex++;
2829b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        nPrefixes++;
2830b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        (attId->name)[-1] = 2;
2831b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2832b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2833b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else
2834b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      attIndex++;
2835b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
2836b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2837b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* set-up for XML_GetSpecifiedAttributeCount and XML_GetIdAttributeIndex */
2838b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  nSpecifiedAtts = attIndex;
2839b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (elementType->idAtt && (elementType->idAtt->name)[-1]) {
2840b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (i = 0; i < attIndex; i += 2)
2841b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (appAtts[i] == elementType->idAtt->name) {
2842b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        idAttIndex = i;
2843b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
2844b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2845b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
2846b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else
2847b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    idAttIndex = -1;
2848b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2849b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* do attribute defaulting */
2850b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (i = 0; i < nDefaultAtts; i++) {
2851b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i;
2852b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!(da->id->name)[-1] && da->value) {
2853b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (da->id->prefix) {
2854b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (da->id->xmlns) {
2855b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          enum XML_Error result = addBinding(parser, da->id->prefix, da->id,
2856b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                             da->value, bindingsPtr);
2857b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (result)
2858b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return result;
2859b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2860b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else {
2861b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          (da->id->name)[-1] = 2;
2862b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          nPrefixes++;
2863b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          appAtts[attIndex++] = da->id->name;
2864b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          appAtts[attIndex++] = da->value;
2865b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2866b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2867b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else {
2868b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        (da->id->name)[-1] = 1;
2869b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        appAtts[attIndex++] = da->id->name;
2870b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        appAtts[attIndex++] = da->value;
2871b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2872b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2873b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
2874b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  appAtts[attIndex] = 0;
2875b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2876b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* expand prefixed attribute names, check for duplicates,
2877b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     and clear flags that say whether attributes were specified */
2878b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  i = 0;
2879b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (nPrefixes) {
2880b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int j;  /* hash table index */
2881b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    unsigned long version = nsAttsVersion;
2882b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int nsAttsSize = (int)1 << nsAttsPower;
2883b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* size of hash table must be at least 2 * (# of prefixed attributes) */
2884b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if ((nPrefixes << 1) >> nsAttsPower) {  /* true for nsAttsPower = 0 */
2885b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      NS_ATT *temp;
2886b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* hash table size must also be a power of 2 and >= 8 */
2887b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      while (nPrefixes >> nsAttsPower++);
2888b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (nsAttsPower < 3)
2889b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        nsAttsPower = 3;
2890b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      nsAttsSize = (int)1 << nsAttsPower;
2891b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      temp = (NS_ATT *)REALLOC(nsAtts, nsAttsSize * sizeof(NS_ATT));
2892b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!temp)
2893b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
2894b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      nsAtts = temp;
2895b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      version = 0;  /* force re-initialization of nsAtts hash table */
2896b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2897b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* using a version flag saves us from initializing nsAtts every time */
2898b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!version) {  /* initialize version flags when version wraps around */
2899b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      version = INIT_ATTS_VERSION;
2900b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      for (j = nsAttsSize; j != 0; )
2901b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        nsAtts[--j].version = version;
2902b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2903b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    nsAttsVersion = --version;
2904b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2905b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* expand prefixed names and check for duplicates */
2906b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (; i < attIndex; i += 2) {
2907b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      const XML_Char *s = appAtts[i];
2908b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (s[-1] == 2) {  /* prefixed */
2909b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ATTRIBUTE_ID *id;
2910b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const BINDING *b;
291135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        unsigned long uriHash = hash_secret_salt;
2912b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ((XML_Char *)s)[-1] = 0;  /* clear flag */
291335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0);
2914b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        b = id->prefix->binding;
2915b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!b)
2916b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_UNBOUND_PREFIX;
2917b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2918b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* as we expand the name we also calculate its hash value */
2919b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        for (j = 0; j < b->uriLen; j++) {
2920b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          const XML_Char c = b->uri[j];
2921b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!poolAppendChar(&tempPool, c))
2922b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_NO_MEMORY;
2923b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          uriHash = CHAR_HASH(uriHash, c);
2924b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2925d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        while (*s++ != XML_T(ASCII_COLON))
2926b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          ;
2927b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        do {  /* copies null terminator */
2928b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          const XML_Char c = *s;
2929b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!poolAppendChar(&tempPool, *s))
2930b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_NO_MEMORY;
2931b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          uriHash = CHAR_HASH(uriHash, c);
2932b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        } while (*s++);
2933b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2934b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        { /* Check hash table for duplicate of expanded name (uriName).
293535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes             Derived from code in lookup(parser, HASH_TABLE *table, ...).
2936b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          */
2937b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          unsigned char step = 0;
2938b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          unsigned long mask = nsAttsSize - 1;
2939b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          j = uriHash & mask;  /* index into hash table */
2940b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          while (nsAtts[j].version == version) {
2941b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            /* for speed we compare stored hash values first */
2942b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (uriHash == nsAtts[j].hash) {
2943b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              const XML_Char *s1 = poolStart(&tempPool);
2944b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              const XML_Char *s2 = nsAtts[j].uriName;
2945b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              /* s1 is null terminated, but not s2 */
2946b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              for (; *s1 == *s2 && *s1 != 0; s1++, s2++);
2947b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              if (*s1 == 0)
2948b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                return XML_ERROR_DUPLICATE_ATTRIBUTE;
2949b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            }
2950b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (!step)
2951b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              step = PROBE_STEP(uriHash, mask, nsAttsPower);
2952b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            j < step ? (j += nsAttsSize - step) : (j -= step);
2953b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
2954b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2955b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2956b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (ns_triplets) {  /* append namespace separator and prefix */
2957b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          tempPool.ptr[-1] = namespaceSeparator;
2958b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          s = b->prefix->name;
2959b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          do {
2960b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (!poolAppendChar(&tempPool, *s))
2961b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              return XML_ERROR_NO_MEMORY;
2962b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          } while (*s++);
2963b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2964b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2965b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* store expanded name in attribute list */
2966b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        s = poolStart(&tempPool);
2967b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolFinish(&tempPool);
2968b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        appAtts[i] = s;
2969b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2970b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* fill empty slot with new version, uriName and hash value */
2971b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        nsAtts[j].version = version;
2972b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        nsAtts[j].hash = uriHash;
2973b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        nsAtts[j].uriName = s;
2974b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2975b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!--nPrefixes) {
2976b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          i += 2;
2977b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          break;
2978b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
2979b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
2980b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else  /* not prefixed */
2981b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ((XML_Char *)s)[-1] = 0;  /* clear flag */
2982b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
2983b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
2984b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* clear flags for the remaining attributes */
2985b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (; i < attIndex; i += 2)
2986b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ((XML_Char *)(appAtts[i]))[-1] = 0;
2987b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding)
2988b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    binding->attId->name[-1] = 0;
2989b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2990b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!ns)
2991b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_NONE;
2992b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
2993b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* expand the element type name */
2994b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (elementType->prefix) {
2995b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    binding = elementType->prefix->binding;
2996b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!binding)
2997b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_UNBOUND_PREFIX;
2998b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    localPart = tagNamePtr->str;
2999d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    while (*localPart++ != XML_T(ASCII_COLON))
3000b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      ;
3001b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3002b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else if (dtd->defaultPrefix.binding) {
3003b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    binding = dtd->defaultPrefix.binding;
3004b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    localPart = tagNamePtr->str;
3005b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3006b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else
3007b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_NONE;
3008b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  prefixLen = 0;
3009b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (ns_triplets && binding->prefix->name) {
3010b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (; binding->prefix->name[prefixLen++];)
3011b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      ;  /* prefixLen includes null terminator */
3012b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3013b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  tagNamePtr->localPart = localPart;
3014b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  tagNamePtr->uriLen = binding->uriLen;
3015b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  tagNamePtr->prefix = binding->prefix->name;
3016b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  tagNamePtr->prefixLen = prefixLen;
3017b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (i = 0; localPart[i++];)
3018b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ;  /* i includes null terminator */
3019b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  n = i + binding->uriLen + prefixLen;
3020b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (n > binding->uriAlloc) {
3021b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    TAG *p;
3022b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char));
3023b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!uri)
3024b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NO_MEMORY;
3025b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    binding->uriAlloc = n + EXPAND_SPARE;
3026b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char));
3027b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (p = tagStack; p; p = p->parent)
3028b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (p->name.str == binding->uri)
3029b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        p->name.str = uri;
3030b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    FREE(binding->uri);
3031b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    binding->uri = uri;
3032b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3033b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* if namespaceSeparator != '\0' then uri includes it already */
3034b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  uri = binding->uri + binding->uriLen;
3035b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  memcpy(uri, localPart, i * sizeof(XML_Char));
3036b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* we always have a namespace separator between localPart and prefix */
3037b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (prefixLen) {
3038b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    uri += i - 1;
3039b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *uri = namespaceSeparator;  /* replace null terminator */
3040b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char));
3041b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3042b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  tagNamePtr->str = binding->uri;
3043b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_ERROR_NONE;
3044b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3045b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3046b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* addBinding() overwrites the value of prefix->binding without checking.
3047b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   Therefore one must keep track of the old value outside of addBinding().
3048b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
3049b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
3050b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectaddBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
3051b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           const XML_Char *uri, BINDING **bindingsPtr)
3052b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3053b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  static const XML_Char xmlNamespace[] = {
3054d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH,
3055d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD,
305635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L,
3057d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH,
3058d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c,
3059d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    ASCII_e, '\0'
3060b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  };
306135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  static const int xmlLen =
3062b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    (int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1;
3063b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  static const XML_Char xmlnsNamespace[] = {
3064d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH,
3065d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD,
306635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0,
306735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s,
3068d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    ASCII_SLASH, '\0'
3069b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  };
307035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  static const int xmlnsLen =
3071b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    (int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1;
3072b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3073b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool mustBeXML = XML_FALSE;
3074b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool isXML = XML_TRUE;
3075b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool isXMLNS = XML_TRUE;
307635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes
3077b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  BINDING *b;
3078b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int len;
3079b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3080b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* empty URI is only valid for default namespace per XML NS 1.0 (not 1.1) */
3081b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (*uri == XML_T('\0') && prefix->name)
3082b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_UNDECLARING_PREFIX;
3083b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3084b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (prefix->name
3085d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      && prefix->name[0] == XML_T(ASCII_x)
3086d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      && prefix->name[1] == XML_T(ASCII_m)
3087d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      && prefix->name[2] == XML_T(ASCII_l)) {
3088b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3089b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* Not allowed to bind xmlns */
3090d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    if (prefix->name[3] == XML_T(ASCII_n)
3091d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        && prefix->name[4] == XML_T(ASCII_s)
3092b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        && prefix->name[5] == XML_T('\0'))
3093b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_RESERVED_PREFIX_XMLNS;
3094b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3095b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (prefix->name[3] == XML_T('\0'))
3096b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      mustBeXML = XML_TRUE;
3097b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3098b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3099b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (len = 0; uri[len]; len++) {
3100b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len]))
3101b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      isXML = XML_FALSE;
3102b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
310335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    if (!mustBeXML && isXMLNS
3104b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        && (len > xmlnsLen || uri[len] != xmlnsNamespace[len]))
3105b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      isXMLNS = XML_FALSE;
3106b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3107b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  isXML = isXML && len == xmlLen;
3108b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  isXMLNS = isXMLNS && len == xmlnsLen;
3109b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3110b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (mustBeXML != isXML)
3111b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return mustBeXML ? XML_ERROR_RESERVED_PREFIX_XML
3112b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     : XML_ERROR_RESERVED_NAMESPACE_URI;
3113b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3114b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (isXMLNS)
3115b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_RESERVED_NAMESPACE_URI;
3116b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3117b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (namespaceSeparator)
3118b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    len++;
3119b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (freeBindingList) {
3120b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    b = freeBindingList;
3121b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (len > b->uriAlloc) {
3122b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      XML_Char *temp = (XML_Char *)REALLOC(b->uri,
3123b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          sizeof(XML_Char) * (len + EXPAND_SPARE));
3124b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (temp == NULL)
3125b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
3126b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      b->uri = temp;
3127b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      b->uriAlloc = len + EXPAND_SPARE;
3128b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3129b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    freeBindingList = b->nextTagBinding;
3130b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3131b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
3132b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    b = (BINDING *)MALLOC(sizeof(BINDING));
3133b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!b)
3134b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NO_MEMORY;
3135b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE));
3136b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!b->uri) {
3137b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      FREE(b);
3138b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NO_MEMORY;
3139b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3140b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    b->uriAlloc = len + EXPAND_SPARE;
3141b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3142b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  b->uriLen = len;
3143b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  memcpy(b->uri, uri, len * sizeof(XML_Char));
3144b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (namespaceSeparator)
3145b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    b->uri[len - 1] = namespaceSeparator;
3146b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  b->prefix = prefix;
3147b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  b->attId = attId;
3148b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  b->prevPrefixBinding = prefix->binding;
3149b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* NULL binding when default namespace undeclared */
3150b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix)
3151b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    prefix->binding = NULL;
3152b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else
3153b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    prefix->binding = b;
3154b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  b->nextTagBinding = *bindingsPtr;
3155b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *bindingsPtr = b;
3156b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* if attId == NULL then we are not starting a namespace scope */
3157b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (attId && startNamespaceDeclHandler)
3158b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    startNamespaceDeclHandler(handlerArg, prefix->name,
3159b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              prefix->binding ? uri : 0);
3160b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_ERROR_NONE;
3161b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3162b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3163b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* The idea here is to avoid using stack for each CDATA section when
3164b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   the whole file is parsed with one call.
3165b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
3166b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
3167b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectcdataSectionProcessor(XML_Parser parser,
3168b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      const char *start,
3169b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      const char *end,
3170b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      const char **endPtr)
3171b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3172b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_Error result = doCdataSection(parser, encoding, &start, end,
3173b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                         endPtr, (XML_Bool)!ps_finalBuffer);
3174b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (result != XML_ERROR_NONE)
3175b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return result;
3176b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (start) {
3177b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (parentParser) {  /* we are parsing an external entity */
3178b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      processor = externalEntityContentProcessor;
3179b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return externalEntityContentProcessor(parser, start, end, endPtr);
3180b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3181b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
3182b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      processor = contentProcessor;
3183b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return contentProcessor(parser, start, end, endPtr);
3184b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3185b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3186b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return result;
3187b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3188b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3189b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* startPtr gets set to non-null if the section is closed, and to null if
3190b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   the section is not yet closed.
3191b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
3192b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
3193b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectdoCdataSection(XML_Parser parser,
3194b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const ENCODING *enc,
3195b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char **startPtr,
3196b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char *end,
3197b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char **nextPtr,
3198b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               XML_Bool haveMore)
3199b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3200b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *s = *startPtr;
3201b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char **eventPP;
3202b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char **eventEndPP;
3203b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (enc == encoding) {
3204b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventPP = &eventPtr;
3205b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *eventPP = s;
3206b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventEndPP = &eventEndPtr;
3207b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3208b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
3209b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventPP = &(openInternalEntities->internalEventPtr);
3210b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventEndPP = &(openInternalEntities->internalEventEndPtr);
3211b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3212b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *eventPP = s;
3213b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *startPtr = NULL;
3214b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3215b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
3216b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const char *next;
3217b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int tok = XmlCdataSectionTok(enc, s, end, &next);
3218b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *eventEndPP = next;
3219b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (tok) {
3220b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_CDATA_SECT_CLOSE:
3221b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (endCdataSectionHandler)
3222b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        endCdataSectionHandler(handlerArg);
3223b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#if 0
3224b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* see comment under XML_TOK_CDATA_SECT_OPEN */
3225b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else if (characterDataHandler)
3226b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        characterDataHandler(handlerArg, dataBuf, 0);
3227b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
3228b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else if (defaultHandler)
3229b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        reportDefault(parser, enc, s, next);
3230b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *startPtr = next;
3231b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextPtr = next;
3232b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (ps_parsing == XML_FINISHED)
3233b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_ABORTED;
3234b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else
3235b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
3236b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_DATA_NEWLINE:
3237b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (characterDataHandler) {
3238b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_Char c = 0xA;
3239b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        characterDataHandler(handlerArg, &c, 1);
3240b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3241b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else if (defaultHandler)
3242b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        reportDefault(parser, enc, s, next);
3243b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
3244b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_DATA_CHARS:
3245d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      {
3246d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        XML_CharacterDataHandler charDataHandler = characterDataHandler;
3247d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        if (charDataHandler) {
3248d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes          if (MUST_CONVERT(enc, s)) {
3249d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes            for (;;) {
3250d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes              ICHAR *dataPtr = (ICHAR *)dataBuf;
3251d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes              XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
3252d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes              *eventEndPP = next;
3253d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes              charDataHandler(handlerArg, dataBuf,
3254d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes                              (int)(dataPtr - (ICHAR *)dataBuf));
3255d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes              if (s == next)
3256d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes                break;
3257d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes              *eventPP = s;
3258d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes            }
3259b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
3260d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes          else
3261d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes            charDataHandler(handlerArg,
3262d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes                            (XML_Char *)s,
3263d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes                            (int)((XML_Char *)next - (XML_Char *)s));
3264b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
3265d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        else if (defaultHandler)
3266d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes          reportDefault(parser, enc, s, next);
3267b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3268b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
3269b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_INVALID:
3270b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *eventPP = next;
3271b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_INVALID_TOKEN;
3272b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_PARTIAL_CHAR:
3273b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (haveMore) {
3274b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = s;
3275b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
3276b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3277b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_PARTIAL_CHAR;
3278b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_PARTIAL:
3279b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_NONE:
3280b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (haveMore) {
3281b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = s;
3282b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
3283b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3284b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_UNCLOSED_CDATA_SECTION;
3285b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default:
3286b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *eventPP = next;
3287b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_UNEXPECTED_STATE;
3288b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3289b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3290b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *eventPP = s = next;
3291b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (ps_parsing) {
3292b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_SUSPENDED:
3293b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextPtr = next;
3294b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
3295b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_FINISHED:
3296b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_ABORTED;
3297b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default: ;
3298b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3299b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3300b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* not reached */
3301b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3302b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3303b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
3304b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3305b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* The idea here is to avoid using stack for each IGNORE section when
3306b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   the whole file is parsed with one call.
3307b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
3308b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
3309b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectignoreSectionProcessor(XML_Parser parser,
3310b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       const char *start,
3311b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       const char *end,
3312b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       const char **endPtr)
3313b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
331435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  enum XML_Error result = doIgnoreSection(parser, encoding, &start, end,
3315b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                          endPtr, (XML_Bool)!ps_finalBuffer);
3316b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (result != XML_ERROR_NONE)
3317b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return result;
3318b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (start) {
3319b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    processor = prologProcessor;
3320b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return prologProcessor(parser, start, end, endPtr);
3321b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3322b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return result;
3323b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3324b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3325b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* startPtr gets set to non-null is the section is closed, and to null
3326b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   if the section is not yet closed.
3327b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
3328b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
3329b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectdoIgnoreSection(XML_Parser parser,
3330b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const ENCODING *enc,
3331b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const char **startPtr,
3332b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const char *end,
3333b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const char **nextPtr,
3334b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                XML_Bool haveMore)
3335b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3336b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *next;
3337b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int tok;
3338b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *s = *startPtr;
3339b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char **eventPP;
3340b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char **eventEndPP;
3341b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (enc == encoding) {
3342b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventPP = &eventPtr;
3343b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *eventPP = s;
3344b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventEndPP = &eventEndPtr;
3345b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3346b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
3347b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventPP = &(openInternalEntities->internalEventPtr);
3348b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventEndPP = &(openInternalEntities->internalEventEndPtr);
3349b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3350b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *eventPP = s;
3351b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *startPtr = NULL;
3352b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  tok = XmlIgnoreSectionTok(enc, s, end, &next);
3353b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *eventEndPP = next;
3354b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  switch (tok) {
3355b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_TOK_IGNORE_SECT:
3356b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (defaultHandler)
3357b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      reportDefault(parser, enc, s, next);
3358b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *startPtr = next;
3359b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *nextPtr = next;
3360b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (ps_parsing == XML_FINISHED)
3361b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_ABORTED;
3362b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else
3363b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
3364b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_TOK_INVALID:
3365b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *eventPP = next;
3366b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_INVALID_TOKEN;
3367b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_TOK_PARTIAL_CHAR:
3368b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (haveMore) {
3369b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextPtr = s;
3370b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
3371b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3372b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_PARTIAL_CHAR;
3373b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_TOK_PARTIAL:
3374b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case XML_TOK_NONE:
3375b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (haveMore) {
3376b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextPtr = s;
3377b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
3378b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3379b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */
3380b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  default:
3381b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *eventPP = next;
3382b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_UNEXPECTED_STATE;
3383b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3384b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* not reached */
3385b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3386b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3387b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
3388b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3389b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
3390b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectinitializeEncoding(XML_Parser parser)
3391b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3392b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *s;
3393b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_UNICODE
3394b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  char encodingBuf[128];
3395b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!protocolEncodingName)
3396b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    s = NULL;
3397b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
3398b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int i;
3399b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (i = 0; protocolEncodingName[i]; i++) {
3400b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (i == sizeof(encodingBuf) - 1
3401b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          || (protocolEncodingName[i] & ~0x7f) != 0) {
3402b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        encodingBuf[0] = '\0';
3403b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
3404b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3405b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      encodingBuf[i] = (char)protocolEncodingName[i];
3406b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3407b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    encodingBuf[i] = '\0';
3408b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    s = encodingBuf;
3409b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3410b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
3411b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  s = protocolEncodingName;
3412b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
3413b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s))
3414b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_NONE;
3415b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return handleUnknownEncoding(parser, protocolEncodingName);
3416b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3417b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3418b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
3419b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectprocessXmlDecl(XML_Parser parser, int isGeneralTextEntity,
3420b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char *s, const char *next)
3421b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3422b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *encodingName = NULL;
3423b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *storedEncName = NULL;
3424b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const ENCODING *newEncoding = NULL;
3425b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *version = NULL;
3426b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *versionend;
3427b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *storedversion = NULL;
3428b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int standalone = -1;
3429b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!(ns
3430b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ? XmlParseXmlDeclNS
3431b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        : XmlParseXmlDecl)(isGeneralTextEntity,
3432b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           encoding,
3433b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           s,
3434b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           next,
3435b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           &eventPtr,
3436b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           &version,
3437b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           &versionend,
3438b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           &encodingName,
3439b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           &newEncoding,
3440b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           &standalone)) {
3441b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (isGeneralTextEntity)
3442b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_TEXT_DECL;
3443b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else
3444b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_XML_DECL;
3445b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3446b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!isGeneralTextEntity && standalone == 1) {
3447b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    _dtd->standalone = XML_TRUE;
3448b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
3449b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE)
3450b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
3451b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
3452b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3453b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (xmlDeclHandler) {
3454b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (encodingName != NULL) {
3455b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      storedEncName = poolStoreString(&temp2Pool,
3456b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                      encoding,
3457b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                      encodingName,
3458b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                      encodingName
3459b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                      + XmlNameLength(encoding, encodingName));
3460b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!storedEncName)
3461b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              return XML_ERROR_NO_MEMORY;
3462b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      poolFinish(&temp2Pool);
3463b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3464b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (version) {
3465b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      storedversion = poolStoreString(&temp2Pool,
3466b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                      encoding,
3467b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                      version,
3468b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                      versionend - encoding->minBytesPerChar);
3469b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!storedversion)
3470b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
3471b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3472b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone);
3473b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3474b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else if (defaultHandler)
3475b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    reportDefault(parser, encoding, s, next);
3476b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (protocolEncodingName == NULL) {
3477b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (newEncoding) {
3478b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) {
3479b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        eventPtr = encodingName;
3480b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_INCORRECT_ENCODING;
3481b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3482b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      encoding = newEncoding;
3483b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3484b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else if (encodingName) {
3485b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      enum XML_Error result;
3486b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!storedEncName) {
3487b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        storedEncName = poolStoreString(
3488b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          &temp2Pool, encoding, encodingName,
3489b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          encodingName + XmlNameLength(encoding, encodingName));
3490b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!storedEncName)
3491b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
3492b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3493b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      result = handleUnknownEncoding(parser, storedEncName);
3494b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      poolClear(&temp2Pool);
3495b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (result == XML_ERROR_UNKNOWN_ENCODING)
3496b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        eventPtr = encodingName;
3497b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return result;
3498b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3499b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3500b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3501b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (storedEncName || storedversion)
3502b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    poolClear(&temp2Pool);
3503b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3504b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_ERROR_NONE;
3505b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3506b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3507b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
3508b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjecthandleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName)
3509b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3510b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (unknownEncodingHandler) {
3511b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_Encoding info;
3512b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int i;
3513b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (i = 0; i < 256; i++)
3514b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      info.map[i] = -1;
3515b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    info.convert = NULL;
3516b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    info.data = NULL;
3517b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    info.release = NULL;
3518b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName,
3519b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               &info)) {
3520b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      ENCODING *enc;
3521b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding());
3522b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!unknownEncodingMem) {
3523b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (info.release)
3524b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          info.release(info.data);
3525b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
3526b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3527b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      enc = (ns
3528b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             ? XmlInitUnknownEncodingNS
3529b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             : XmlInitUnknownEncoding)(unknownEncodingMem,
3530b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                       info.map,
3531b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                       info.convert,
3532b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                       info.data);
3533b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (enc) {
3534b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        unknownEncodingData = info.data;
3535b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        unknownEncodingRelease = info.release;
3536b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        encoding = enc;
3537b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
3538b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3539b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3540b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (info.release != NULL)
3541b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      info.release(info.data);
3542b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3543b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_ERROR_UNKNOWN_ENCODING;
3544b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3545b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3546b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
3547b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectprologInitProcessor(XML_Parser parser,
3548b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    const char *s,
3549b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    const char *end,
3550b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    const char **nextPtr)
3551b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3552b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_Error result = initializeEncoding(parser);
3553b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (result != XML_ERROR_NONE)
3554b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return result;
3555b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  processor = prologProcessor;
3556b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return prologProcessor(parser, s, end, nextPtr);
3557b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3558b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3559b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
3560b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3561b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
3562b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectexternalParEntInitProcessor(XML_Parser parser,
3563b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const char *s,
3564b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const char *end,
3565b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const char **nextPtr)
3566b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3567b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_Error result = initializeEncoding(parser);
3568b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (result != XML_ERROR_NONE)
3569b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return result;
3570b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3571b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* we know now that XML_Parse(Buffer) has been called,
3572b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     so we consider the external parameter entity read */
3573b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  _dtd->paramEntityRead = XML_TRUE;
3574b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3575b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (prologState.inEntityValue) {
3576b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    processor = entityValueInitProcessor;
3577b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return entityValueInitProcessor(parser, s, end, nextPtr);
3578b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3579b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
3580b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    processor = externalParEntProcessor;
3581b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return externalParEntProcessor(parser, s, end, nextPtr);
3582b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3583b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3584b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3585b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
3586b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectentityValueInitProcessor(XML_Parser parser,
3587b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                         const char *s,
3588b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                         const char *end,
3589b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                         const char **nextPtr)
3590b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3591b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int tok;
3592b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *start = s;
3593b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *next = start;
3594b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  eventPtr = start;
3595b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
359635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  for (;;) {
3597b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tok = XmlPrologTok(encoding, start, end, &next);
3598b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventEndPtr = next;
3599b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (tok <= 0) {
3600b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!ps_finalBuffer && tok != XML_TOK_INVALID) {
3601b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = s;
3602b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
3603b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3604b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      switch (tok) {
3605b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_INVALID:
3606b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_INVALID_TOKEN;
3607b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_PARTIAL:
3608b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_UNCLOSED_TOKEN;
3609b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_PARTIAL_CHAR:
3610b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_PARTIAL_CHAR;
3611b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_NONE:   /* start == end */
3612b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      default:
3613b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
3614b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3615b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* found end of entity value - can store it now */
3616b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return storeEntityValue(parser, encoding, s, end);
3617b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3618b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else if (tok == XML_TOK_XML_DECL) {
3619b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      enum XML_Error result;
3620b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      result = processXmlDecl(parser, 0, start, next);
3621b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (result != XML_ERROR_NONE)
3622b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return result;
3623b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      switch (ps_parsing) {
362435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      case XML_SUSPENDED:
3625b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = next;
3626b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
3627b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_FINISHED:
3628b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_ABORTED;
3629b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      default:
3630b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = next;
3631b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3632b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* stop scanning for text declaration - we found one */
3633b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      processor = entityValueProcessor;
3634b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return entityValueProcessor(parser, next, end, nextPtr);
3635b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3636b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* If we are at the end of the buffer, this would cause XmlPrologTok to
3637b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       return XML_TOK_NONE on the next call, which would then cause the
3638b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       function to exit with *nextPtr set to s - that is what we want for other
3639b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       tokens, but not for the BOM - we would rather like to skip it;
3640b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       then, when this routine is entered the next time, XmlPrologTok will
3641b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       return XML_TOK_INVALID, since the BOM is still in the buffer
3642b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    */
3643b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else if (tok == XML_TOK_BOM && next == end && !ps_finalBuffer) {
3644b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextPtr = next;
3645b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
3646b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3647b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    start = next;
3648b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventPtr = start;
3649b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3650b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3651b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3652b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
3653b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectexternalParEntProcessor(XML_Parser parser,
3654b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        const char *s,
3655b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        const char *end,
3656b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        const char **nextPtr)
3657b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3658b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *next = s;
3659b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int tok;
3660b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3661b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  tok = XmlPrologTok(encoding, s, end, &next);
3662b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (tok <= 0) {
3663b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!ps_finalBuffer && tok != XML_TOK_INVALID) {
3664b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextPtr = s;
3665b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
3666b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3667b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (tok) {
3668b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_INVALID:
3669b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_INVALID_TOKEN;
3670b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_PARTIAL:
3671b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_UNCLOSED_TOKEN;
3672b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_PARTIAL_CHAR:
3673b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_PARTIAL_CHAR;
3674b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_NONE:   /* start == end */
3675b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default:
3676b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
3677b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3678b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3679b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM.
3680b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     However, when parsing an external subset, doProlog will not accept a BOM
3681b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     as valid, and report a syntax error, so we have to skip the BOM
3682b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  */
3683b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else if (tok == XML_TOK_BOM) {
3684b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    s = next;
3685b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tok = XmlPrologTok(encoding, s, end, &next);
3686b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3687b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3688b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  processor = prologProcessor;
368935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  return doProlog(parser, encoding, s, end, tok, next,
3690b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                  nextPtr, (XML_Bool)!ps_finalBuffer);
3691b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3692b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3693b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
3694b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectentityValueProcessor(XML_Parser parser,
3695b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     const char *s,
3696b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     const char *end,
3697b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     const char **nextPtr)
3698b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3699b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *start = s;
3700b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *next = s;
3701b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const ENCODING *enc = encoding;
3702b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int tok;
3703b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3704b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
3705b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tok = XmlPrologTok(enc, start, end, &next);
3706b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (tok <= 0) {
3707b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!ps_finalBuffer && tok != XML_TOK_INVALID) {
3708b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = s;
3709b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
3710b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3711b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      switch (tok) {
3712b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_INVALID:
3713b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_INVALID_TOKEN;
3714b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_PARTIAL:
3715b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_UNCLOSED_TOKEN;
3716b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_PARTIAL_CHAR:
3717b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_PARTIAL_CHAR;
3718b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_NONE:   /* start == end */
3719b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      default:
3720b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
3721b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3722b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* found end of entity value - can store it now */
3723b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return storeEntityValue(parser, enc, s, end);
3724b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3725b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    start = next;
3726b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3727b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3728b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3729b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
3730b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3731b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
3732b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectprologProcessor(XML_Parser parser,
3733b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const char *s,
3734b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const char *end,
3735b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const char **nextPtr)
3736b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3737b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *next = s;
3738b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int tok = XmlPrologTok(encoding, s, end, &next);
373935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  return doProlog(parser, encoding, s, end, tok, next,
3740b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                  nextPtr, (XML_Bool)!ps_finalBuffer);
3741b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
3742b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3743b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
3744b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectdoProlog(XML_Parser parser,
3745b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         const ENCODING *enc,
3746b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         const char *s,
3747b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         const char *end,
3748b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         int tok,
3749b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         const char *next,
3750b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         const char **nextPtr,
3751b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         XML_Bool haveMore)
3752b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3753b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
3754d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' };
3755b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
375635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  static const XML_Char atypeCDATA[] =
3757d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
3758d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' };
3759d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  static const XML_Char atypeIDREF[] =
3760d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };
3761d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  static const XML_Char atypeIDREFS[] =
3762d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };
3763d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  static const XML_Char atypeENTITY[] =
3764d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };
3765d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  static const XML_Char atypeENTITIES[] = { ASCII_E, ASCII_N,
3766d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' };
3767b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  static const XML_Char atypeNMTOKEN[] = {
3768d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };
3769d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  static const XML_Char atypeNMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T,
3770d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' };
3771d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  static const XML_Char notationPrefix[] = { ASCII_N, ASCII_O, ASCII_T,
3772d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0' };
3773d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  static const XML_Char enumValueSep[] = { ASCII_PIPE, '\0' };
3774d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes  static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' };
3775b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3776b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* save one level of indirection */
377735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  DTD * const dtd = _dtd;
3778b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3779b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char **eventPP;
3780b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char **eventEndPP;
3781b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_Content_Quant quant;
3782b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3783b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (enc == encoding) {
3784b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventPP = &eventPtr;
3785b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventEndPP = &eventEndPtr;
3786b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3787b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
3788b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventPP = &(openInternalEntities->internalEventPtr);
3789b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventEndPP = &(openInternalEntities->internalEventEndPtr);
3790b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3791b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3792b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
3793b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int role;
3794b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_Bool handleDefault = XML_TRUE;
3795b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *eventPP = s;
3796b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *eventEndPP = next;
3797b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (tok <= 0) {
3798b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (haveMore && tok != XML_TOK_INVALID) {
3799b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = s;
3800b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
3801b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3802b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      switch (tok) {
3803b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_INVALID:
3804b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *eventPP = next;
3805b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_INVALID_TOKEN;
3806b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_PARTIAL:
3807b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_UNCLOSED_TOKEN;
3808b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_PARTIAL_CHAR:
3809b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_PARTIAL_CHAR;
381035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      case -XML_TOK_PROLOG_S:
381135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        tok = -tok;
381235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        break;
3813b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_NONE:
3814b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
3815b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* for internal PE NOT referenced between declarations */
3816b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (enc != encoding && !openInternalEntities->betweenDecl) {
3817b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          *nextPtr = s;
3818b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NONE;
3819b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
3820b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* WFC: PE Between Declarations - must check that PE contains
3821b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           complete markup, not only for external PEs, but also for
3822b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           internal PEs if the reference occurs between declarations.
3823b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        */
3824b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (isParamEntity || enc != encoding) {
3825b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc)
3826b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              == XML_ROLE_ERROR)
3827b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_INCOMPLETE_PE;
3828b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          *nextPtr = s;
3829b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NONE;
3830b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
3831b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
3832b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_ELEMENTS;
3833b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      default:
3834b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        tok = -tok;
3835b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        next = end;
3836b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
3837b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3838b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
3839b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    role = XmlTokenRole(&prologState, tok, s, next, enc);
3840b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (role) {
3841b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_XML_DECL:
3842b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      {
3843b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        enum XML_Error result = processXmlDecl(parser, 0, s, next);
3844b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (result != XML_ERROR_NONE)
3845b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return result;
3846b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        enc = encoding;
3847b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
3848b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3849b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
3850b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_DOCTYPE_NAME:
3851b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (startDoctypeDeclHandler) {
3852b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        doctypeName = poolStoreString(&tempPool, enc, s, next);
3853b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!doctypeName)
3854b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
3855b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolFinish(&tempPool);
3856b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        doctypePubid = NULL;
3857b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
3858b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3859b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      doctypeSysid = NULL; /* always initialize to NULL */
3860b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
3861b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_DOCTYPE_INTERNAL_SUBSET:
3862b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (startDoctypeDeclHandler) {
3863b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid,
3864b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                doctypePubid, 1);
3865b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        doctypeName = NULL;
3866b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolClear(&tempPool);
3867b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
3868b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3869b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
3870b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
3871b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_TEXT_DECL:
3872b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      {
3873b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        enum XML_Error result = processXmlDecl(parser, 1, s, next);
3874b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (result != XML_ERROR_NONE)
3875b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return result;
3876b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        enc = encoding;
3877b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
3878b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3879b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
3880b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
3881b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_DOCTYPE_PUBLIC_ID:
3882b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
3883b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      useForeignDTD = XML_FALSE;
388435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      declEntity = (ENTITY *)lookup(parser,
388535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                                    &dtd->paramEntities,
3886b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    externalSubsetName,
3887b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    sizeof(ENTITY));
3888b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!declEntity)
3889b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
3890b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
3891b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      dtd->hasParamEntityRefs = XML_TRUE;
3892b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (startDoctypeDeclHandler) {
389335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        XML_Char *pubId;
3894b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!XmlIsPublicId(enc, s, next, eventPP))
3895b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_PUBLICID;
389635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        pubId = poolStoreString(&tempPool, enc,
389735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                                s + enc->minBytesPerChar,
389835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                                next - enc->minBytesPerChar);
389935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        if (!pubId)
3900b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
390135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        normalizePublicId(pubId);
3902b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolFinish(&tempPool);
390335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        doctypePubid = pubId;
3904b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
3905b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        goto alreadyChecked;
3906b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3907b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* fall through */
3908b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ENTITY_PUBLIC_ID:
3909b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!XmlIsPublicId(enc, s, next, eventPP))
3910b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_PUBLICID;
3911b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    alreadyChecked:
3912b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->keepProcessing && declEntity) {
3913b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_Char *tem = poolStoreString(&dtd->pool,
3914b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        enc,
3915b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        s + enc->minBytesPerChar,
3916b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        next - enc->minBytesPerChar);
3917b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!tem)
3918b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
3919b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        normalizePublicId(tem);
3920b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        declEntity->publicId = tem;
3921b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolFinish(&dtd->pool);
3922b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (entityDeclHandler)
3923b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          handleDefault = XML_FALSE;
3924b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3925b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
3926b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_DOCTYPE_CLOSE:
3927b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (doctypeName) {
3928b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        startDoctypeDeclHandler(handlerArg, doctypeName,
3929b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                doctypeSysid, doctypePubid, 0);
3930b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolClear(&tempPool);
3931b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
3932b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3933b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* doctypeSysid will be non-NULL in the case of a previous
3934b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler
3935b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         was not set, indicating an external subset
3936b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      */
3937b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
3938b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (doctypeSysid || useForeignDTD) {
3939b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs;
3940b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->hasParamEntityRefs = XML_TRUE;
3941b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (paramEntityParsing && externalEntityRefHandler) {
394235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes          ENTITY *entity = (ENTITY *)lookup(parser,
394335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                                            &dtd->paramEntities,
3944b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                            externalSubsetName,
3945b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                            sizeof(ENTITY));
3946b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!entity)
3947b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_NO_MEMORY;
3948b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (useForeignDTD)
3949b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            entity->base = curBase;
3950b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          dtd->paramEntityRead = XML_FALSE;
3951b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!externalEntityRefHandler(externalEntityRefHandlerArg,
3952b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        0,
3953b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        entity->base,
3954b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        entity->systemId,
3955b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        entity->publicId))
3956b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
3957b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (dtd->paramEntityRead) {
395835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes            if (!dtd->standalone &&
395935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                notStandaloneHandler &&
3960b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                !notStandaloneHandler(handlerArg))
3961b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              return XML_ERROR_NOT_STANDALONE;
3962b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
3963b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          /* if we didn't read the foreign DTD then this means that there
3964b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             is no external subset and we must reset dtd->hasParamEntityRefs
3965b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          */
3966b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          else if (!doctypeSysid)
3967b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            dtd->hasParamEntityRefs = hadParamEntityRefs;
3968b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          /* end of DTD - no need to update dtd->keepProcessing */
3969b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
3970b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        useForeignDTD = XML_FALSE;
3971b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3972b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
3973b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (endDoctypeDeclHandler) {
3974b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        endDoctypeDeclHandler(handlerArg);
3975b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
3976b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
3977b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
3978b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_INSTANCE_START:
3979b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
3980b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* if there is no DOCTYPE declaration then now is the
3981b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         last chance to read the foreign DTD
3982b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      */
3983b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (useForeignDTD) {
3984b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs;
3985b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->hasParamEntityRefs = XML_TRUE;
3986b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (paramEntityParsing && externalEntityRefHandler) {
398735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes          ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities,
3988b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                            externalSubsetName,
3989b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                            sizeof(ENTITY));
3990b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!entity)
3991b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_NO_MEMORY;
3992b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          entity->base = curBase;
3993b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          dtd->paramEntityRead = XML_FALSE;
3994b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!externalEntityRefHandler(externalEntityRefHandlerArg,
3995b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        0,
3996b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        entity->base,
3997b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        entity->systemId,
3998b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        entity->publicId))
3999b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
4000b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (dtd->paramEntityRead) {
4001b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (!dtd->standalone &&
4002b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                notStandaloneHandler &&
4003b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                !notStandaloneHandler(handlerArg))
4004b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              return XML_ERROR_NOT_STANDALONE;
4005b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
4006b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          /* if we didn't read the foreign DTD then this means that there
4007b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             is no external subset and we must reset dtd->hasParamEntityRefs
4008b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          */
4009b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          else
4010b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            dtd->hasParamEntityRefs = hadParamEntityRefs;
4011b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          /* end of DTD - no need to update dtd->keepProcessing */
4012b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4013b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4014b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
4015b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      processor = contentProcessor;
4016b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return contentProcessor(parser, s, end, nextPtr);
4017b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ATTLIST_ELEMENT_NAME:
4018b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declElementType = getElementType(parser, enc, s, next);
4019b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!declElementType)
4020b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
4021b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto checkAttListDeclHandler;
4022b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ATTRIBUTE_NAME:
4023b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declAttributeId = getAttributeId(parser, enc, s, next);
4024b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!declAttributeId)
4025b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
4026b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declAttributeIsCdata = XML_FALSE;
4027b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declAttributeType = NULL;
4028b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declAttributeIsId = XML_FALSE;
4029b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto checkAttListDeclHandler;
4030b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ATTRIBUTE_TYPE_CDATA:
4031b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declAttributeIsCdata = XML_TRUE;
4032b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declAttributeType = atypeCDATA;
4033b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto checkAttListDeclHandler;
4034b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ATTRIBUTE_TYPE_ID:
4035b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declAttributeIsId = XML_TRUE;
4036b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declAttributeType = atypeID;
4037b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto checkAttListDeclHandler;
4038b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ATTRIBUTE_TYPE_IDREF:
4039b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declAttributeType = atypeIDREF;
4040b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto checkAttListDeclHandler;
4041b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ATTRIBUTE_TYPE_IDREFS:
4042b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declAttributeType = atypeIDREFS;
4043b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto checkAttListDeclHandler;
4044b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ATTRIBUTE_TYPE_ENTITY:
4045b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declAttributeType = atypeENTITY;
4046b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto checkAttListDeclHandler;
4047b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES:
4048b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declAttributeType = atypeENTITIES;
4049b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto checkAttListDeclHandler;
4050b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN:
4051b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declAttributeType = atypeNMTOKEN;
4052b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto checkAttListDeclHandler;
4053b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS:
4054b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declAttributeType = atypeNMTOKENS;
4055b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    checkAttListDeclHandler:
4056b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->keepProcessing && attlistDeclHandler)
4057b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4058b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4059b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ATTRIBUTE_ENUM_VALUE:
4060b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ATTRIBUTE_NOTATION_VALUE:
4061b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->keepProcessing && attlistDeclHandler) {
4062b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const XML_Char *prefix;
4063b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (declAttributeType) {
4064b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          prefix = enumValueSep;
4065b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4066b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else {
4067b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE
4068b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    ? notationPrefix
4069b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    : enumValueStart);
4070b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4071b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!poolAppendString(&tempPool, prefix))
4072b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4073b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!poolAppend(&tempPool, enc, s, next))
4074b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4075b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        declAttributeType = tempPool.start;
4076b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4077b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4078b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4079b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE:
4080b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE:
4081b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->keepProcessing) {
4082b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!defineAttribute(declElementType, declAttributeId,
4083b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             declAttributeIsCdata, declAttributeIsId,
4084b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             0, parser))
4085b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4086b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (attlistDeclHandler && declAttributeType) {
4087d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes          if (*declAttributeType == XML_T(ASCII_LPAREN)
4088d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes              || (*declAttributeType == XML_T(ASCII_N)
4089d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes                  && declAttributeType[1] == XML_T(ASCII_O))) {
4090b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            /* Enumerated or Notation type */
4091d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes            if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN))
4092b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                || !poolAppendChar(&tempPool, XML_T('\0')))
4093b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              return XML_ERROR_NO_MEMORY;
4094b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            declAttributeType = tempPool.start;
4095b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            poolFinish(&tempPool);
4096b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
4097b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          *eventEndPP = s;
4098b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          attlistDeclHandler(handlerArg, declElementType->name,
4099b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             declAttributeId->name, declAttributeType,
4100b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE);
4101b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          poolClear(&tempPool);
4102b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          handleDefault = XML_FALSE;
4103b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4104b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4105b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4106b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE:
4107b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_FIXED_ATTRIBUTE_VALUE:
4108b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->keepProcessing) {
4109b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const XML_Char *attVal;
4110b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        enum XML_Error result =
4111b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          storeAttributeValue(parser, enc, declAttributeIsCdata,
4112b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              s + enc->minBytesPerChar,
4113b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              next - enc->minBytesPerChar,
4114b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              &dtd->pool);
4115b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (result)
4116b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return result;
4117b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        attVal = poolStart(&dtd->pool);
4118b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolFinish(&dtd->pool);
4119b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* ID attributes aren't allowed to have a default */
4120b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!defineAttribute(declElementType, declAttributeId,
4121b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             declAttributeIsCdata, XML_FALSE, attVal, parser))
4122b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4123b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (attlistDeclHandler && declAttributeType) {
4124d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes          if (*declAttributeType == XML_T(ASCII_LPAREN)
4125d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes              || (*declAttributeType == XML_T(ASCII_N)
4126d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes                  && declAttributeType[1] == XML_T(ASCII_O))) {
4127b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            /* Enumerated or Notation type */
4128d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes            if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN))
4129b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                || !poolAppendChar(&tempPool, XML_T('\0')))
4130b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              return XML_ERROR_NO_MEMORY;
4131b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            declAttributeType = tempPool.start;
4132b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            poolFinish(&tempPool);
4133b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
4134b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          *eventEndPP = s;
4135b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          attlistDeclHandler(handlerArg, declElementType->name,
4136b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             declAttributeId->name, declAttributeType,
4137b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             attVal,
4138b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             role == XML_ROLE_FIXED_ATTRIBUTE_VALUE);
4139b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          poolClear(&tempPool);
4140b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          handleDefault = XML_FALSE;
4141b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4142b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4143b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4144b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ENTITY_VALUE:
4145b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->keepProcessing) {
4146b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        enum XML_Error result = storeEntityValue(parser, enc,
4147b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                            s + enc->minBytesPerChar,
4148b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                            next - enc->minBytesPerChar);
4149b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (declEntity) {
4150b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          declEntity->textPtr = poolStart(&dtd->entityValuePool);
4151b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          declEntity->textLen = (int)(poolLength(&dtd->entityValuePool));
4152b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          poolFinish(&dtd->entityValuePool);
4153b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (entityDeclHandler) {
4154b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            *eventEndPP = s;
4155b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            entityDeclHandler(handlerArg,
4156b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              declEntity->name,
4157b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              declEntity->is_param,
4158b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              declEntity->textPtr,
4159b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              declEntity->textLen,
4160b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              curBase, 0, 0, 0);
4161b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            handleDefault = XML_FALSE;
4162b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
4163b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4164b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else
4165b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          poolDiscard(&dtd->entityValuePool);
4166b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (result != XML_ERROR_NONE)
4167b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return result;
4168b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4169b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4170b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_DOCTYPE_SYSTEM_ID:
4171b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
4172b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      useForeignDTD = XML_FALSE;
4173b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
4174b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      dtd->hasParamEntityRefs = XML_TRUE;
4175b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (startDoctypeDeclHandler) {
4176b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        doctypeSysid = poolStoreString(&tempPool, enc,
4177b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                       s + enc->minBytesPerChar,
4178b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                       next - enc->minBytesPerChar);
4179b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (doctypeSysid == NULL)
4180b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4181b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolFinish(&tempPool);
4182b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4183b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4184b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
4185b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else
4186b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* use externalSubsetName to make doctypeSysid non-NULL
4187b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           for the case where no startDoctypeDeclHandler is set */
4188b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        doctypeSysid = externalSubsetName;
4189b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
4190b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!dtd->standalone
4191b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
4192b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          && !paramEntityParsing
4193b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
4194b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          && notStandaloneHandler
4195b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          && !notStandaloneHandler(handlerArg))
4196b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NOT_STANDALONE;
4197b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifndef XML_DTD
4198b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4199b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else /* XML_DTD */
4200b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!declEntity) {
420135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        declEntity = (ENTITY *)lookup(parser,
420235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                                      &dtd->paramEntities,
4203b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                      externalSubsetName,
4204b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                      sizeof(ENTITY));
4205b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!declEntity)
4206b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4207b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        declEntity->publicId = NULL;
4208b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4209b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* fall through */
4210b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
4211b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ENTITY_SYSTEM_ID:
4212b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->keepProcessing && declEntity) {
4213b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        declEntity->systemId = poolStoreString(&dtd->pool, enc,
4214b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                               s + enc->minBytesPerChar,
4215b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                               next - enc->minBytesPerChar);
4216b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!declEntity->systemId)
4217b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4218b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        declEntity->base = curBase;
4219b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolFinish(&dtd->pool);
4220b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (entityDeclHandler)
4221b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          handleDefault = XML_FALSE;
4222b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4223b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4224b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ENTITY_COMPLETE:
4225b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->keepProcessing && declEntity && entityDeclHandler) {
4226b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *eventEndPP = s;
4227b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        entityDeclHandler(handlerArg,
4228b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          declEntity->name,
4229b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          declEntity->is_param,
4230b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          0,0,
4231b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          declEntity->base,
4232b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          declEntity->systemId,
4233b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          declEntity->publicId,
4234b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          0);
4235b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4236b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4237b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4238b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ENTITY_NOTATION_NAME:
4239b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->keepProcessing && declEntity) {
4240b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        declEntity->notation = poolStoreString(&dtd->pool, enc, s, next);
4241b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!declEntity->notation)
4242b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4243b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolFinish(&dtd->pool);
4244b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (unparsedEntityDeclHandler) {
4245b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          *eventEndPP = s;
4246b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          unparsedEntityDeclHandler(handlerArg,
4247b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    declEntity->name,
4248b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    declEntity->base,
4249b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    declEntity->systemId,
4250b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    declEntity->publicId,
4251b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    declEntity->notation);
4252b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          handleDefault = XML_FALSE;
4253b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4254b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (entityDeclHandler) {
4255b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          *eventEndPP = s;
4256b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          entityDeclHandler(handlerArg,
4257b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            declEntity->name,
4258b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            0,0,0,
4259b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            declEntity->base,
4260b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            declEntity->systemId,
4261b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            declEntity->publicId,
4262b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            declEntity->notation);
4263b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          handleDefault = XML_FALSE;
4264b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4265b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4266b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4267b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_GENERAL_ENTITY_NAME:
4268b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      {
4269b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (XmlPredefinedEntityName(enc, s, next)) {
4270b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          declEntity = NULL;
4271b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          break;
4272b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4273b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (dtd->keepProcessing) {
4274b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);
4275b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!name)
4276b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_NO_MEMORY;
427735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes          declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name,
4278b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        sizeof(ENTITY));
4279b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!declEntity)
4280b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_NO_MEMORY;
4281b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (declEntity->name != name) {
4282b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            poolDiscard(&dtd->pool);
4283b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            declEntity = NULL;
4284b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
4285b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          else {
4286b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            poolFinish(&dtd->pool);
4287b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            declEntity->publicId = NULL;
4288b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            declEntity->is_param = XML_FALSE;
4289b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            /* if we have a parent parser or are reading an internal parameter
4290b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               entity, then the entity declaration is not considered "internal"
4291b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            */
4292b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            declEntity->is_internal = !(parentParser || openInternalEntities);
4293b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (entityDeclHandler)
4294b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              handleDefault = XML_FALSE;
4295b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
4296b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4297b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else {
4298b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          poolDiscard(&dtd->pool);
4299b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          declEntity = NULL;
4300b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4301b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4302b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4303b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_PARAM_ENTITY_NAME:
4304b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
4305b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->keepProcessing) {
4306b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);
4307b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!name)
4308b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
430935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities,
4310b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                           name, sizeof(ENTITY));
4311b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!declEntity)
4312b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4313b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (declEntity->name != name) {
4314b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          poolDiscard(&dtd->pool);
4315b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          declEntity = NULL;
4316b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4317b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else {
4318b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          poolFinish(&dtd->pool);
4319b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          declEntity->publicId = NULL;
4320b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          declEntity->is_param = XML_TRUE;
4321b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          /* if we have a parent parser or are reading an internal parameter
4322b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             entity, then the entity declaration is not considered "internal"
4323b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          */
4324b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          declEntity->is_internal = !(parentParser || openInternalEntities);
4325b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (entityDeclHandler)
4326b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            handleDefault = XML_FALSE;
4327b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4328b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4329b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else {
4330b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolDiscard(&dtd->pool);
4331b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        declEntity = NULL;
4332b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4333b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else /* not XML_DTD */
4334b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declEntity = NULL;
4335b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
4336b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4337b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_NOTATION_NAME:
4338b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declNotationPublicId = NULL;
4339b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      declNotationName = NULL;
4340b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (notationDeclHandler) {
4341b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        declNotationName = poolStoreString(&tempPool, enc, s, next);
4342b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!declNotationName)
4343b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4344b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolFinish(&tempPool);
4345b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4346b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4347b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4348b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_NOTATION_PUBLIC_ID:
4349b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!XmlIsPublicId(enc, s, next, eventPP))
4350b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_PUBLICID;
4351b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (declNotationName) {  /* means notationDeclHandler != NULL */
4352b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_Char *tem = poolStoreString(&tempPool,
4353b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        enc,
4354b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        s + enc->minBytesPerChar,
4355b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        next - enc->minBytesPerChar);
4356b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!tem)
4357b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4358b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        normalizePublicId(tem);
4359b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        declNotationPublicId = tem;
4360b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolFinish(&tempPool);
4361b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4362b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4363b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4364b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_NOTATION_SYSTEM_ID:
4365b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (declNotationName && notationDeclHandler) {
4366b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const XML_Char *systemId
4367b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          = poolStoreString(&tempPool, enc,
4368b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            s + enc->minBytesPerChar,
4369b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            next - enc->minBytesPerChar);
4370b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!systemId)
4371b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4372b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *eventEndPP = s;
4373b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        notationDeclHandler(handlerArg,
4374b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            declNotationName,
4375b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            curBase,
4376b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            systemId,
4377b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            declNotationPublicId);
4378b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4379b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4380b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      poolClear(&tempPool);
4381b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4382b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_NOTATION_NO_SYSTEM_ID:
4383b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (declNotationPublicId && notationDeclHandler) {
4384b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *eventEndPP = s;
4385b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        notationDeclHandler(handlerArg,
4386b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            declNotationName,
4387b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            curBase,
4388b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            0,
4389b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            declNotationPublicId);
4390b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4391b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4392b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      poolClear(&tempPool);
4393b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4394b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ERROR:
4395b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      switch (tok) {
4396b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_PARAM_ENTITY_REF:
4397b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* PE references in internal subset are
439835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes           not allowed within declarations. */
4399b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_PARAM_ENTITY_REF;
4400b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_XML_DECL:
4401b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_MISPLACED_XML_PI;
4402b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      default:
4403b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_SYNTAX;
4404b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4405b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
4406b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_IGNORE_SECT:
4407b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      {
4408b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        enum XML_Error result;
4409b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (defaultHandler)
4410b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          reportDefault(parser, enc, s, next);
4411b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4412b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore);
4413b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (result != XML_ERROR_NONE)
4414b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return result;
4415b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (!next) {
4416b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          processor = ignoreSectionProcessor;
4417b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return result;
4418b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4419b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4420b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4421b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
4422b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_GROUP_OPEN:
4423b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (prologState.level >= groupSize) {
4424b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (groupSize) {
4425b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          char *temp = (char *)REALLOC(groupConnector, groupSize *= 2);
4426b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (temp == NULL)
4427b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_NO_MEMORY;
4428b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          groupConnector = temp;
4429b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (dtd->scaffIndex) {
4430b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            int *temp = (int *)REALLOC(dtd->scaffIndex,
4431b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          groupSize * sizeof(int));
4432b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (temp == NULL)
4433b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              return XML_ERROR_NO_MEMORY;
4434b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            dtd->scaffIndex = temp;
4435b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
4436b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4437b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else {
4438b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          groupConnector = (char *)MALLOC(groupSize = 32);
4439b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!groupConnector)
4440b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_NO_MEMORY;
4441b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4442b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4443b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      groupConnector[prologState.level] = 0;
4444b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->in_eldecl) {
4445b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        int myindex = nextScaffoldPart(parser);
4446b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (myindex < 0)
4447b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4448b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->scaffIndex[dtd->scaffLevel] = myindex;
4449b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->scaffLevel++;
4450b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->scaffold[myindex].type = XML_CTYPE_SEQ;
4451b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (elementDeclHandler)
4452b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          handleDefault = XML_FALSE;
4453b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4454b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4455b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_GROUP_SEQUENCE:
4456d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      if (groupConnector[prologState.level] == ASCII_PIPE)
4457b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_SYNTAX;
4458d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      groupConnector[prologState.level] = ASCII_COMMA;
4459b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->in_eldecl && elementDeclHandler)
4460b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4461b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4462b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_GROUP_CHOICE:
4463d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      if (groupConnector[prologState.level] == ASCII_COMMA)
4464b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_SYNTAX;
4465b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->in_eldecl
4466b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          && !groupConnector[prologState.level]
4467b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
4468b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              != XML_CTYPE_MIXED)
4469b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          ) {
4470b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
4471b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            = XML_CTYPE_CHOICE;
4472b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (elementDeclHandler)
4473b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          handleDefault = XML_FALSE;
4474b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4475d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes      groupConnector[prologState.level] = ASCII_PIPE;
4476b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4477b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_PARAM_ENTITY_REF:
4478b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
4479b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_INNER_PARAM_ENTITY_REF:
4480b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      dtd->hasParamEntityRefs = XML_TRUE;
4481b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!paramEntityParsing)
4482b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->keepProcessing = dtd->standalone;
4483b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else {
4484b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const XML_Char *name;
4485b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ENTITY *entity;
4486b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        name = poolStoreString(&dtd->pool, enc,
4487b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                s + enc->minBytesPerChar,
4488b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                next - enc->minBytesPerChar);
4489b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!name)
4490b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
449135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0);
4492b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolDiscard(&dtd->pool);
4493b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* first, determine if a check for an existing declaration is needed;
4494b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           if yes, check that the entity exists, and that it is internal,
4495b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           otherwise call the skipped entity handler
4496b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        */
4497b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (prologState.documentEntity &&
4498b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            (dtd->standalone
4499b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             ? !openInternalEntities
4500b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             : !dtd->hasParamEntityRefs)) {
4501b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!entity)
4502b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_UNDEFINED_ENTITY;
4503b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          else if (!entity->is_internal)
4504b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_ENTITY_DECLARED_IN_PE;
4505b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4506b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (!entity) {
4507b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          dtd->keepProcessing = dtd->standalone;
4508b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          /* cannot report skipped entities in declarations */
4509b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) {
4510b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            skippedEntityHandler(handlerArg, name, 1);
4511b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            handleDefault = XML_FALSE;
4512b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
4513b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          break;
4514b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4515b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (entity->open)
4516b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_RECURSIVE_ENTITY_REF;
4517b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (entity->textPtr) {
4518b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          enum XML_Error result;
451935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes          XML_Bool betweenDecl =
4520b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE);
4521b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          result = processInternalEntity(parser, entity, betweenDecl);
4522b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (result != XML_ERROR_NONE)
4523b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return result;
4524b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          handleDefault = XML_FALSE;
4525b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          break;
4526b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4527b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (externalEntityRefHandler) {
4528b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          dtd->paramEntityRead = XML_FALSE;
4529b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          entity->open = XML_TRUE;
4530b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!externalEntityRefHandler(externalEntityRefHandlerArg,
4531b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        0,
4532b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        entity->base,
4533b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        entity->systemId,
4534b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        entity->publicId)) {
4535b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            entity->open = XML_FALSE;
4536b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
4537b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
4538b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          entity->open = XML_FALSE;
4539b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          handleDefault = XML_FALSE;
4540b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!dtd->paramEntityRead) {
4541b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            dtd->keepProcessing = dtd->standalone;
4542b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            break;
4543b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
4544b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4545b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else {
4546b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          dtd->keepProcessing = dtd->standalone;
4547b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          break;
4548b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4549b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4550b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
4551b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!dtd->standalone &&
4552b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          notStandaloneHandler &&
4553b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          !notStandaloneHandler(handlerArg))
4554b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NOT_STANDALONE;
4555b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4556b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4557b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* Element declaration stuff */
4558b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4559b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ELEMENT_NAME:
4560b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (elementDeclHandler) {
4561b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        declElementType = getElementType(parser, enc, s, next);
4562b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!declElementType)
4563b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4564b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->scaffLevel = 0;
4565b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->scaffCount = 0;
4566b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->in_eldecl = XML_TRUE;
4567b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4568b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4569b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4570b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4571b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_CONTENT_ANY:
4572b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_CONTENT_EMPTY:
4573b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->in_eldecl) {
4574b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (elementDeclHandler) {
4575b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content));
4576b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!content)
4577b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_NO_MEMORY;
4578b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          content->quant = XML_CQUANT_NONE;
4579b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          content->name = NULL;
4580b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          content->numchildren = 0;
4581b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          content->children = NULL;
4582b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          content->type = ((role == XML_ROLE_CONTENT_ANY) ?
4583b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           XML_CTYPE_ANY :
4584b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           XML_CTYPE_EMPTY);
4585b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          *eventEndPP = s;
4586b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          elementDeclHandler(handlerArg, declElementType->name, content);
4587b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          handleDefault = XML_FALSE;
4588b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4589b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->in_eldecl = XML_FALSE;
4590b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4591b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4592b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4593b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_CONTENT_PCDATA:
4594b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->in_eldecl) {
4595b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
4596b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            = XML_CTYPE_MIXED;
4597b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (elementDeclHandler)
4598b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          handleDefault = XML_FALSE;
4599b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4600b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4601b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4602b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_CONTENT_ELEMENT:
4603b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      quant = XML_CQUANT_NONE;
4604b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto elementContent;
4605b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_CONTENT_ELEMENT_OPT:
4606b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      quant = XML_CQUANT_OPT;
4607b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto elementContent;
4608b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_CONTENT_ELEMENT_REP:
4609b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      quant = XML_CQUANT_REP;
4610b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto elementContent;
4611b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_CONTENT_ELEMENT_PLUS:
4612b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      quant = XML_CQUANT_PLUS;
4613b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    elementContent:
4614b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->in_eldecl) {
4615b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ELEMENT_TYPE *el;
4616b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const XML_Char *name;
4617b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        int nameLen;
4618b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const char *nxt = (quant == XML_CQUANT_NONE
4619b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           ? next
4620b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           : next - enc->minBytesPerChar);
4621b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        int myindex = nextScaffoldPart(parser);
4622b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (myindex < 0)
4623b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4624b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->scaffold[myindex].type = XML_CTYPE_NAME;
4625b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->scaffold[myindex].quant = quant;
4626b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        el = getElementType(parser, enc, s, nxt);
4627b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!el)
4628b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
4629b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        name = el->name;
4630b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->scaffold[myindex].name = name;
4631b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        nameLen = 0;
4632b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        for (; name[nameLen++]; );
4633b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->contentStringLen +=  nameLen;
4634b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (elementDeclHandler)
4635b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          handleDefault = XML_FALSE;
4636b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4637b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4638b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4639b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_GROUP_CLOSE:
4640b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      quant = XML_CQUANT_NONE;
4641b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto closeGroup;
4642b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_GROUP_CLOSE_OPT:
4643b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      quant = XML_CQUANT_OPT;
4644b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto closeGroup;
4645b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_GROUP_CLOSE_REP:
4646b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      quant = XML_CQUANT_REP;
4647b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto closeGroup;
4648b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_GROUP_CLOSE_PLUS:
4649b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      quant = XML_CQUANT_PLUS;
4650b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    closeGroup:
4651b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->in_eldecl) {
4652b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (elementDeclHandler)
4653b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          handleDefault = XML_FALSE;
4654b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->scaffLevel--;
4655b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant;
4656b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (dtd->scaffLevel == 0) {
4657b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!handleDefault) {
4658b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            XML_Content *model = build_model(parser);
4659b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (!model)
4660b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              return XML_ERROR_NO_MEMORY;
4661b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            *eventEndPP = s;
4662b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            elementDeclHandler(handlerArg, declElementType->name, model);
4663b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
4664b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          dtd->in_eldecl = XML_FALSE;
4665b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          dtd->contentStringLen = 0;
4666b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4667b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4668b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4669b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* End element declaration stuff */
4670b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4671b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_PI:
4672b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!reportProcessingInstruction(parser, enc, s, next))
4673b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
4674b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      handleDefault = XML_FALSE;
4675b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4676b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_COMMENT:
4677b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!reportComment(parser, enc, s, next))
4678b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
4679b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      handleDefault = XML_FALSE;
4680b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4681b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_NONE:
4682b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      switch (tok) {
4683b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      case XML_TOK_BOM:
4684b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4685b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
4686b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4687b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4688b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_DOCTYPE_NONE:
4689b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (startDoctypeDeclHandler)
4690b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4691b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4692b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ENTITY_NONE:
4693b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->keepProcessing && entityDeclHandler)
4694b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4695b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4696b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_NOTATION_NONE:
4697b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (notationDeclHandler)
4698b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4699b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4700b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ATTLIST_NONE:
4701b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (dtd->keepProcessing && attlistDeclHandler)
4702b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4703b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4704b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_ROLE_ELEMENT_NONE:
4705b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (elementDeclHandler)
4706b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        handleDefault = XML_FALSE;
4707b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4708b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    } /* end of big switch */
4709b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4710b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (handleDefault && defaultHandler)
4711b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      reportDefault(parser, enc, s, next);
4712b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4713b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (ps_parsing) {
471435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    case XML_SUSPENDED:
4715b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextPtr = next;
4716b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
4717b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_FINISHED:
4718b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_ABORTED;
4719b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default:
4720b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      s = next;
4721b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      tok = XmlPrologTok(enc, s, end, &next);
4722b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
4723b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
4724b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* not reached */
4725b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
4726b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4727b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
4728b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectepilogProcessor(XML_Parser parser,
4729b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const char *s,
4730b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const char *end,
4731b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const char **nextPtr)
4732b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
4733b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  processor = epilogProcessor;
4734b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  eventPtr = s;
4735b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
4736b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const char *next = NULL;
4737b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int tok = XmlPrologTok(encoding, s, end, &next);
4738b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventEndPtr = next;
4739b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (tok) {
4740b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* report partial linebreak - it might be the last token */
4741b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case -XML_TOK_PROLOG_S:
4742b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (defaultHandler) {
4743b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        reportDefault(parser, encoding, s, next);
4744b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (ps_parsing == XML_FINISHED)
4745b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_ABORTED;
4746b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4747b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextPtr = next;
4748b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
4749b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_NONE:
4750b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextPtr = s;
4751b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
4752b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_PROLOG_S:
4753b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (defaultHandler)
4754b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        reportDefault(parser, encoding, s, next);
4755b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4756b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_PI:
4757b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!reportProcessingInstruction(parser, encoding, s, next))
4758b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
4759b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4760b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_COMMENT:
4761b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!reportComment(parser, encoding, s, next))
4762b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
4763b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4764b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_INVALID:
4765b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      eventPtr = next;
4766b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_INVALID_TOKEN;
4767b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_PARTIAL:
4768b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!ps_finalBuffer) {
4769b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = s;
4770b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
4771b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4772b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_UNCLOSED_TOKEN;
4773b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_PARTIAL_CHAR:
4774b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!ps_finalBuffer) {
4775b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextPtr = s;
4776b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NONE;
4777b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4778b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_PARTIAL_CHAR;
4779b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default:
4780b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_JUNK_AFTER_DOC_ELEMENT;
4781b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
4782b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    eventPtr = s = next;
4783b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (ps_parsing) {
478435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    case XML_SUSPENDED:
4785b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextPtr = next;
4786b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
4787b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_FINISHED:
4788b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_ABORTED;
4789b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default: ;
4790b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
4791b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
4792b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
4793b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4794b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
4795b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectprocessInternalEntity(XML_Parser parser, ENTITY *entity,
4796b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      XML_Bool betweenDecl)
4797b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
4798b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *textStart, *textEnd;
4799b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *next;
4800b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_Error result;
4801b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  OPEN_INTERNAL_ENTITY *openEntity;
4802b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4803b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (freeInternalEntities) {
4804b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    openEntity = freeInternalEntities;
4805b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    freeInternalEntities = openEntity->next;
4806b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
4807b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
4808b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(sizeof(OPEN_INTERNAL_ENTITY));
4809b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!openEntity)
4810b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NO_MEMORY;
4811b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
4812b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  entity->open = XML_TRUE;
4813b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  entity->processed = 0;
4814b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  openEntity->next = openInternalEntities;
4815b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  openInternalEntities = openEntity;
4816b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  openEntity->entity = entity;
4817b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  openEntity->startTagLevel = tagLevel;
4818b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  openEntity->betweenDecl = betweenDecl;
4819b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  openEntity->internalEventPtr = NULL;
4820b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  openEntity->internalEventEndPtr = NULL;
4821b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  textStart = (char *)entity->textPtr;
4822b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  textEnd = (char *)(entity->textPtr + entity->textLen);
4823b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4824b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
4825b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (entity->is_param) {
4826b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next);
482735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
4828b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      next, &next, XML_FALSE);
4829b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
483035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  else
4831b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
483235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    result = doContent(parser, tagLevel, internalEncoding, textStart,
4833b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       textEnd, &next, XML_FALSE);
4834b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4835b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (result == XML_ERROR_NONE) {
4836b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (textEnd != next && ps_parsing == XML_SUSPENDED) {
4837b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      entity->processed = (int)(next - textStart);
4838b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      processor = internalEntityProcessor;
4839b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
4840b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
4841b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      entity->open = XML_FALSE;
4842b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      openInternalEntities = openEntity->next;
4843b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* put openEntity back in list of free instances */
4844b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      openEntity->next = freeInternalEntities;
4845b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      freeInternalEntities = openEntity;
4846b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
4847b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
4848b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return result;
4849b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
4850b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4851b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
4852b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectinternalEntityProcessor(XML_Parser parser,
4853b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        const char *s,
4854b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        const char *end,
4855b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        const char **nextPtr)
4856b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
4857b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ENTITY *entity;
4858b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *textStart, *textEnd;
4859b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *next;
4860b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_Error result;
4861b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  OPEN_INTERNAL_ENTITY *openEntity = openInternalEntities;
4862b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!openEntity)
4863b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_UNEXPECTED_STATE;
4864b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4865b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  entity = openEntity->entity;
4866b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  textStart = ((char *)entity->textPtr) + entity->processed;
4867b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  textEnd = (char *)(entity->textPtr + entity->textLen);
4868b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4869b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
4870b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (entity->is_param) {
4871b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next);
487235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
4873b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      next, &next, XML_FALSE);
4874b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
4875b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else
4876b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
487735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    result = doContent(parser, openEntity->startTagLevel, internalEncoding,
487835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                       textStart, textEnd, &next, XML_FALSE);
4879b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4880b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (result != XML_ERROR_NONE)
4881b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return result;
4882b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else if (textEnd != next && ps_parsing == XML_SUSPENDED) {
4883b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    entity->processed = (int)(next - (char *)entity->textPtr);
4884b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return result;
4885b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
4886b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
4887b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    entity->open = XML_FALSE;
4888b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    openInternalEntities = openEntity->next;
4889b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* put openEntity back in list of free instances */
4890b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    openEntity->next = freeInternalEntities;
4891b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    freeInternalEntities = openEntity;
4892b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
4893b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4894b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
4895b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (entity->is_param) {
4896b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int tok;
4897b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    processor = prologProcessor;
4898b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tok = XmlPrologTok(encoding, s, end, &next);
489935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    return doProlog(parser, encoding, s, end, tok, next, nextPtr,
4900b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    (XML_Bool)!ps_finalBuffer);
4901b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
4902b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else
4903b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
4904b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
4905b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    processor = contentProcessor;
4906b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* see externalEntityContentProcessor vs contentProcessor */
4907b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return doContent(parser, parentParser ? 1 : 0, encoding, s, end,
490835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                     nextPtr, (XML_Bool)!ps_finalBuffer);
490935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  }
4910b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
4911b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4912b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error PTRCALL
4913b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjecterrorProcessor(XML_Parser parser,
4914b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char *s,
4915b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char *end,
4916b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char **nextPtr)
4917b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
4918b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return errorCode;
4919b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
4920b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4921b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
4922b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectstoreAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
4923b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    const char *ptr, const char *end,
4924b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    STRING_POOL *pool)
4925b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
4926b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr,
4927b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                               end, pool);
4928b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (result)
4929b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return result;
4930b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20)
4931b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    poolChop(pool);
4932b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!poolAppendChar(pool, XML_T('\0')))
4933b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_ERROR_NO_MEMORY;
4934b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_ERROR_NONE;
4935b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
4936b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4937b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
4938b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectappendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
4939b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     const char *ptr, const char *end,
4940b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     STRING_POOL *pool)
4941b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
4942b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD * const dtd = _dtd;  /* save one level of indirection */
4943b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
4944b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const char *next;
4945b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int tok = XmlAttributeValueTok(enc, ptr, end, &next);
4946b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (tok) {
4947b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_NONE:
4948b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NONE;
4949b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_INVALID:
4950b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (enc == encoding)
4951b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        eventPtr = next;
4952b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_INVALID_TOKEN;
4953b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_PARTIAL:
4954b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (enc == encoding)
4955b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        eventPtr = ptr;
4956b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_INVALID_TOKEN;
4957b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_CHAR_REF:
4958b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      {
4959b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_Char buf[XML_ENCODE_MAX];
4960b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        int i;
4961b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        int n = XmlCharRefNumber(enc, ptr);
4962b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (n < 0) {
4963b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (enc == encoding)
4964b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            eventPtr = ptr;
4965b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_BAD_CHAR_REF;
4966b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4967b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!isCdata
4968b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            && n == 0x20 /* space */
4969b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20))
4970b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          break;
4971b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        n = XmlEncode(n, (ICHAR *)buf);
4972b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!n) {
4973b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (enc == encoding)
4974b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            eventPtr = ptr;
4975b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_BAD_CHAR_REF;
4976b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4977b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        for (i = 0; i < n; i++) {
4978b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!poolAppendChar(pool, buf[i]))
4979b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_NO_MEMORY;
4980b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
4981b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
4982b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4983b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_DATA_CHARS:
4984b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!poolAppend(pool, enc, ptr, next))
4985b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
4986b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4987b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_TRAILING_CR:
4988b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      next = ptr + enc->minBytesPerChar;
4989b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* fall through */
4990b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_ATTRIBUTE_VALUE_S:
4991b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_DATA_NEWLINE:
4992b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20))
4993b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
4994b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!poolAppendChar(pool, 0x20))
4995b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_ERROR_NO_MEMORY;
4996b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
4997b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_ENTITY_REF:
4998b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      {
4999b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const XML_Char *name;
5000b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ENTITY *entity;
5001b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        char checkEntityDecl;
5002b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc,
5003b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                              ptr + enc->minBytesPerChar,
5004b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                              next - enc->minBytesPerChar);
5005b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (ch) {
5006b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!poolAppendChar(pool, ch))
5007b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                return XML_ERROR_NO_MEMORY;
5008b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          break;
5009b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5010b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        name = poolStoreString(&temp2Pool, enc,
5011b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               ptr + enc->minBytesPerChar,
5012b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               next - enc->minBytesPerChar);
5013b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!name)
5014b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_NO_MEMORY;
501535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0);
5016b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolDiscard(&temp2Pool);
5017b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* First, determine if a check for an existing declaration is needed;
5018b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           if yes, check that the entity exists, and that it is internal.
5019b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        */
5020b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (pool == &dtd->pool)  /* are we called from prolog? */
5021b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          checkEntityDecl =
5022b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
5023b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              prologState.documentEntity &&
5024b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
5025b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              (dtd->standalone
5026b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               ? !openInternalEntities
5027b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               : !dtd->hasParamEntityRefs);
5028b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else /* if (pool == &tempPool): we are called from content */
5029b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone;
5030b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (checkEntityDecl) {
5031b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!entity)
5032b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_UNDEFINED_ENTITY;
5033b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          else if (!entity->is_internal)
5034b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_ERROR_ENTITY_DECLARED_IN_PE;
5035b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5036b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (!entity) {
5037b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          /* Cannot report skipped entity here - see comments on
5038b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             skippedEntityHandler.
5039b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (skippedEntityHandler)
5040b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            skippedEntityHandler(handlerArg, name, 0);
5041b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          */
5042b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          /* Cannot call the default handler because this would be
5043b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             out of sync with the call to the startElementHandler.
5044b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if ((pool == &tempPool) && defaultHandler)
5045b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            reportDefault(parser, enc, ptr, next);
5046b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          */
5047b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          break;
5048b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5049b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (entity->open) {
5050b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (enc == encoding)
5051b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            eventPtr = ptr;
5052b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_RECURSIVE_ENTITY_REF;
5053b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5054b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (entity->notation) {
5055b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (enc == encoding)
5056b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            eventPtr = ptr;
5057b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_ERROR_BINARY_ENTITY_REF;
5058b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5059b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!entity->textPtr) {
5060b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (enc == encoding)
5061b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            eventPtr = ptr;
506235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes          return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF;
5063b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5064b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else {
5065b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          enum XML_Error result;
5066b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          const XML_Char *textEnd = entity->textPtr + entity->textLen;
5067b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          entity->open = XML_TRUE;
5068b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          result = appendAttributeValue(parser, internalEncoding, isCdata,
5069b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        (char *)entity->textPtr,
5070b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        (char *)textEnd, pool);
5071b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          entity->open = XML_FALSE;
5072b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (result)
5073b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return result;
5074b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5075b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
5076b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
5077b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default:
5078b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (enc == encoding)
5079b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        eventPtr = ptr;
5080b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_UNEXPECTED_STATE;
5081b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5082b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ptr = next;
5083b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5084b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* not reached */
5085b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5086b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5087b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic enum XML_Error
5088b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectstoreEntityValue(XML_Parser parser,
5089b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                 const ENCODING *enc,
5090b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                 const char *entityTextPtr,
5091b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                 const char *entityTextEnd)
5092b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5093b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD * const dtd = _dtd;  /* save one level of indirection */
5094b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  STRING_POOL *pool = &(dtd->entityValuePool);
5095b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum XML_Error result = XML_ERROR_NONE;
5096b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
5097b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int oldInEntityValue = prologState.inEntityValue;
5098b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  prologState.inEntityValue = 1;
5099b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
5100b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* never return Null for the value argument in EntityDeclHandler,
5101b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     since this would indicate an external entity; therefore we
5102b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     have to make sure that entityValuePool.start is not null */
5103b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!pool->blocks) {
5104b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!poolGrow(pool))
5105b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_ERROR_NO_MEMORY;
5106b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5107b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5108b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
5109b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const char *next;
5110b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next);
5111b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (tok) {
5112b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_PARAM_ENTITY_REF:
5113b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
5114b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (isParamEntity || enc != encoding) {
5115b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const XML_Char *name;
5116b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ENTITY *entity;
5117b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        name = poolStoreString(&tempPool, enc,
5118b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               entityTextPtr + enc->minBytesPerChar,
5119b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               next - enc->minBytesPerChar);
5120b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!name) {
5121b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          result = XML_ERROR_NO_MEMORY;
5122b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          goto endEntityValue;
5123b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
512435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0);
5125b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolDiscard(&tempPool);
5126b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!entity) {
5127b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          /* not a well-formedness error - see XML 1.0: WFC Entity Declared */
5128b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          /* cannot report skipped entity here - see comments on
5129b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             skippedEntityHandler
5130b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (skippedEntityHandler)
5131b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            skippedEntityHandler(handlerArg, name, 0);
5132b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          */
5133b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          dtd->keepProcessing = dtd->standalone;
5134b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          goto endEntityValue;
5135b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5136b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (entity->open) {
5137b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (enc == encoding)
5138b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            eventPtr = entityTextPtr;
5139b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          result = XML_ERROR_RECURSIVE_ENTITY_REF;
5140b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          goto endEntityValue;
5141b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5142b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (entity->systemId) {
5143b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (externalEntityRefHandler) {
5144b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            dtd->paramEntityRead = XML_FALSE;
5145b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            entity->open = XML_TRUE;
5146b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (!externalEntityRefHandler(externalEntityRefHandlerArg,
5147b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                          0,
5148b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                          entity->base,
5149b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                          entity->systemId,
5150b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                          entity->publicId)) {
5151b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              entity->open = XML_FALSE;
5152b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              result = XML_ERROR_EXTERNAL_ENTITY_HANDLING;
5153b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              goto endEntityValue;
5154b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            }
5155b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            entity->open = XML_FALSE;
5156b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (!dtd->paramEntityRead)
5157b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              dtd->keepProcessing = dtd->standalone;
5158b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
5159b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          else
5160b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            dtd->keepProcessing = dtd->standalone;
5161b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5162b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else {
5163b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          entity->open = XML_TRUE;
5164b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          result = storeEntityValue(parser,
5165b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    internalEncoding,
5166b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    (char *)entity->textPtr,
5167b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    (char *)(entity->textPtr
5168b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                             + entity->textLen));
5169b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          entity->open = XML_FALSE;
5170b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (result)
5171b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            goto endEntityValue;
5172b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5173b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
5174b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
5175b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
5176b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* In the internal subset, PE references are not legal
5177b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         within markup declarations, e.g entity values in this case. */
5178b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      eventPtr = entityTextPtr;
5179b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      result = XML_ERROR_PARAM_ENTITY_REF;
5180b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto endEntityValue;
5181b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_NONE:
5182b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      result = XML_ERROR_NONE;
5183b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto endEntityValue;
5184b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_ENTITY_REF:
5185b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_DATA_CHARS:
5186b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!poolAppend(pool, enc, entityTextPtr, next)) {
5187b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        result = XML_ERROR_NO_MEMORY;
5188b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        goto endEntityValue;
5189b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
5190b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
5191b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_TRAILING_CR:
5192b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      next = entityTextPtr + enc->minBytesPerChar;
5193b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* fall through */
5194b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_DATA_NEWLINE:
5195b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (pool->end == pool->ptr && !poolGrow(pool)) {
5196b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              result = XML_ERROR_NO_MEMORY;
5197b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        goto endEntityValue;
5198b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
5199b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(pool->ptr)++ = 0xA;
5200b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
5201b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_CHAR_REF:
5202b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      {
5203b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_Char buf[XML_ENCODE_MAX];
5204b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        int i;
5205b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        int n = XmlCharRefNumber(enc, entityTextPtr);
5206b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (n < 0) {
5207b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (enc == encoding)
5208b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            eventPtr = entityTextPtr;
5209b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          result = XML_ERROR_BAD_CHAR_REF;
5210b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          goto endEntityValue;
5211b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5212b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        n = XmlEncode(n, (ICHAR *)buf);
5213b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!n) {
5214b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (enc == encoding)
5215b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            eventPtr = entityTextPtr;
5216b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          result = XML_ERROR_BAD_CHAR_REF;
5217b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          goto endEntityValue;
5218b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5219b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        for (i = 0; i < n; i++) {
5220b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (pool->end == pool->ptr && !poolGrow(pool)) {
5221b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            result = XML_ERROR_NO_MEMORY;
5222b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            goto endEntityValue;
5223b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
5224b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          *(pool->ptr)++ = buf[i];
5225b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5226b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
5227b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
5228b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_PARTIAL:
5229b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (enc == encoding)
5230b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        eventPtr = entityTextPtr;
5231b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      result = XML_ERROR_INVALID_TOKEN;
5232b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto endEntityValue;
5233b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case XML_TOK_INVALID:
5234b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (enc == encoding)
5235b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        eventPtr = next;
5236b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      result = XML_ERROR_INVALID_TOKEN;
5237b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto endEntityValue;
5238b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default:
5239b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (enc == encoding)
5240b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        eventPtr = entityTextPtr;
5241b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      result = XML_ERROR_UNEXPECTED_STATE;
5242b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      goto endEntityValue;
5243b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5244b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    entityTextPtr = next;
5245b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5246b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectendEntityValue:
5247b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
5248b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  prologState.inEntityValue = oldInEntityValue;
5249b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
5250b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return result;
5251b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5252b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5253b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL
5254b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectnormalizeLines(XML_Char *s)
5255b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5256b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char *p;
5257b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;; s++) {
5258b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (*s == XML_T('\0'))
5259b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return;
5260b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (*s == 0xD)
5261b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
5262b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5263b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p = s;
5264b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  do {
5265b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (*s == 0xD) {
5266b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *p++ = 0xA;
5267b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (*++s == 0xA)
5268b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        s++;
5269b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5270b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else
5271b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *p++ = *s++;
5272b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  } while (*s);
5273b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *p = XML_T('\0');
5274b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5275b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5276b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
5277b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectreportProcessingInstruction(XML_Parser parser, const ENCODING *enc,
5278b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const char *start, const char *end)
5279b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5280b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *target;
5281b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char *data;
5282b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *tem;
5283b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!processingInstructionHandler) {
5284b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (defaultHandler)
5285b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      reportDefault(parser, enc, start, end);
5286b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 1;
5287b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5288b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  start += enc->minBytesPerChar * 2;
5289b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  tem = start + XmlNameLength(enc, start);
5290b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  target = poolStoreString(&tempPool, enc, start, tem);
5291b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!target)
5292b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
5293b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolFinish(&tempPool);
5294b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  data = poolStoreString(&tempPool, enc,
5295b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        XmlSkipS(enc, tem),
5296b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        end - enc->minBytesPerChar*2);
5297b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!data)
5298b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
5299b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  normalizeLines(data);
5300b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  processingInstructionHandler(handlerArg, target, data);
5301b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolClear(&tempPool);
5302b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 1;
5303b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5304b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5305b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
5306b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectreportComment(XML_Parser parser, const ENCODING *enc,
5307b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              const char *start, const char *end)
5308b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5309b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char *data;
5310b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!commentHandler) {
5311b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (defaultHandler)
5312b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      reportDefault(parser, enc, start, end);
5313b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 1;
5314b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5315b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  data = poolStoreString(&tempPool,
5316b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                         enc,
5317b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                         start + enc->minBytesPerChar * 4,
5318b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                         end - enc->minBytesPerChar * 3);
5319b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!data)
5320b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
5321b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  normalizeLines(data);
5322b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  commentHandler(handlerArg, data);
5323b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolClear(&tempPool);
5324b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 1;
5325b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5326b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5327b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
5328b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectreportDefault(XML_Parser parser, const ENCODING *enc,
5329b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              const char *s, const char *end)
5330b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5331b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (MUST_CONVERT(enc, s)) {
5332b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const char **eventPP;
5333b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const char **eventEndPP;
5334b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (enc == encoding) {
5335b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      eventPP = &eventPtr;
5336b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      eventEndPP = &eventEndPtr;
5337b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5338b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
5339b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      eventPP = &(openInternalEntities->internalEventPtr);
5340b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      eventEndPP = &(openInternalEntities->internalEventEndPtr);
5341b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5342b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    do {
5343b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      ICHAR *dataPtr = (ICHAR *)dataBuf;
5344b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);
5345b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *eventEndPP = s;
5346b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      defaultHandler(handlerArg, dataBuf, (int)(dataPtr - (ICHAR *)dataBuf));
5347b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *eventPP = s;
5348b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    } while (s != end);
5349b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5350b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else
5351b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    defaultHandler(handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s));
5352b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5353b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5354b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5355b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
5356b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectdefineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata,
5357b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                XML_Bool isId, const XML_Char *value, XML_Parser parser)
5358b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5359b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DEFAULT_ATTRIBUTE *att;
5360b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (value || isId) {
5361b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* The handling of default attributes gets messed up if we have
5362b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       a default which duplicates a non-default. */
5363b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int i;
5364b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (i = 0; i < type->nDefaultAtts; i++)
5365b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (attId == type->defaultAtts[i].id)
5366b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 1;
5367b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (isId && !type->idAtt && !attId->xmlns)
5368b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      type->idAtt = attId;
5369b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5370b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (type->nDefaultAtts == type->allocDefaultAtts) {
5371b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (type->allocDefaultAtts == 0) {
5372b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      type->allocDefaultAtts = 8;
5373b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts
5374b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            * sizeof(DEFAULT_ATTRIBUTE));
5375b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!type->defaultAtts)
5376b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
5377b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5378b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
5379b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      DEFAULT_ATTRIBUTE *temp;
5380b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      int count = type->allocDefaultAtts * 2;
5381b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      temp = (DEFAULT_ATTRIBUTE *)
5382b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE)));
5383b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (temp == NULL)
5384b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
5385b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      type->allocDefaultAtts = count;
5386b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      type->defaultAtts = temp;
5387b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5388b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5389b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  att = type->defaultAtts + type->nDefaultAtts;
5390b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  att->id = attId;
5391b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  att->value = value;
5392b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  att->isCdata = isCdata;
5393b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!isCdata)
5394b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    attId->maybeTokenized = XML_TRUE;
5395b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  type->nDefaultAtts += 1;
5396b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 1;
5397b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5398b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5399b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
5400b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectsetElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType)
5401b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5402b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD * const dtd = _dtd;  /* save one level of indirection */
5403b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *name;
5404b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (name = elementType->name; *name; name++) {
5405d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    if (*name == XML_T(ASCII_COLON)) {
5406b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      PREFIX *prefix;
5407b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      const XML_Char *s;
5408b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      for (s = elementType->name; s != name; s++) {
5409b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!poolAppendChar(&dtd->pool, *s))
5410b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return 0;
5411b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
5412b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!poolAppendChar(&dtd->pool, XML_T('\0')))
5413b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
541435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool),
5415b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                sizeof(PREFIX));
5416b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!prefix)
5417b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
5418b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (prefix->name == poolStart(&dtd->pool))
5419b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolFinish(&dtd->pool);
5420b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else
5421b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolDiscard(&dtd->pool);
5422b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      elementType->prefix = prefix;
5423b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5424b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5425b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5426b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 1;
5427b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5428b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5429b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic ATTRIBUTE_ID *
5430b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectgetAttributeId(XML_Parser parser, const ENCODING *enc,
5431b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char *start, const char *end)
5432b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5433b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD * const dtd = _dtd;  /* save one level of indirection */
5434b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ATTRIBUTE_ID *id;
5435b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *name;
5436b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!poolAppendChar(&dtd->pool, XML_T('\0')))
5437b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
5438b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  name = poolStoreString(&dtd->pool, enc, start, end);
5439b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!name)
5440b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
5441b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* skip quotation mark - its storage will be re-used (like in name[-1]) */
5442b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ++name;
544335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, sizeof(ATTRIBUTE_ID));
5444b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!id)
5445b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
5446b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (id->name != name)
5447b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    poolDiscard(&dtd->pool);
5448b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
5449b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    poolFinish(&dtd->pool);
5450b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!ns)
5451b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      ;
5452d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    else if (name[0] == XML_T(ASCII_x)
5453d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        && name[1] == XML_T(ASCII_m)
5454d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        && name[2] == XML_T(ASCII_l)
5455d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        && name[3] == XML_T(ASCII_n)
5456d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        && name[4] == XML_T(ASCII_s)
5457d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) {
5458b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (name[5] == XML_T('\0'))
5459b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        id->prefix = &dtd->defaultPrefix;
5460b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else
546135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, sizeof(PREFIX));
5462b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      id->xmlns = XML_TRUE;
5463b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5464b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
5465b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      int i;
5466b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      for (i = 0; name[i]; i++) {
5467b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* attributes without prefix are *not* in the default namespace */
5468d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        if (name[i] == XML_T(ASCII_COLON)) {
5469b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          int j;
5470b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          for (j = 0; j < i; j++) {
5471b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (!poolAppendChar(&dtd->pool, name[j]))
5472b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              return NULL;
5473b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
5474b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!poolAppendChar(&dtd->pool, XML_T('\0')))
5475b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return NULL;
547635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes          id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool),
5477b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        sizeof(PREFIX));
5478b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (id->prefix->name == poolStart(&dtd->pool))
5479b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            poolFinish(&dtd->pool);
5480b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          else
5481b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            poolDiscard(&dtd->pool);
5482b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          break;
5483b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5484b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
5485b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5486b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5487b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return id;
5488b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5489b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5490d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#define CONTEXT_SEP XML_T(ASCII_FF)
5491b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5492b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const XML_Char *
5493b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectgetContext(XML_Parser parser)
5494b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5495b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD * const dtd = _dtd;  /* save one level of indirection */
5496b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  HASH_TABLE_ITER iter;
5497b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Bool needSep = XML_FALSE;
5498b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5499b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (dtd->defaultPrefix.binding) {
5500b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int i;
5501b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int len;
5502d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS)))
5503b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return NULL;
5504b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    len = dtd->defaultPrefix.binding->uriLen;
5505b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (namespaceSeparator)
5506b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      len--;
5507b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (i = 0; i < len; i++)
5508b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i]))
5509b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return NULL;
5510b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    needSep = XML_TRUE;
5511b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5512b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5513b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableIterInit(&iter, &(dtd->prefixes));
5514b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
5515b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int i;
5516b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int len;
5517b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const XML_Char *s;
5518b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter);
5519b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!prefix)
5520b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
5521b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!prefix->binding)
5522b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      continue;
5523b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP))
5524b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return NULL;
5525b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (s = prefix->name; *s; s++)
5526b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!poolAppendChar(&tempPool, *s))
5527b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return NULL;
5528d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS)))
5529b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return NULL;
5530b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    len = prefix->binding->uriLen;
5531b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (namespaceSeparator)
5532b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      len--;
5533b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (i = 0; i < len; i++)
5534b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!poolAppendChar(&tempPool, prefix->binding->uri[i]))
5535b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return NULL;
5536b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    needSep = XML_TRUE;
5537b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5538b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5539b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5540b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableIterInit(&iter, &(dtd->generalEntities));
5541b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
5542b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const XML_Char *s;
5543b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ENTITY *e = (ENTITY *)hashTableIterNext(&iter);
5544b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!e)
5545b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
5546b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!e->open)
5547b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      continue;
5548b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP))
5549b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return NULL;
5550b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (s = e->name; *s; s++)
5551b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!poolAppendChar(&tempPool, *s))
5552b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
5553b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    needSep = XML_TRUE;
5554b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5555b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5556b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!poolAppendChar(&tempPool, XML_T('\0')))
5557b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
5558b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return tempPool.start;
5559b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5560b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5561b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Bool
5562b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectsetContext(XML_Parser parser, const XML_Char *context)
5563b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5564b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD * const dtd = _dtd;  /* save one level of indirection */
5565b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *s = context;
5566b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5567b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  while (*context != XML_T('\0')) {
5568b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (*s == CONTEXT_SEP || *s == XML_T('\0')) {
5569b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      ENTITY *e;
5570b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!poolAppendChar(&tempPool, XML_T('\0')))
5571b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_FALSE;
557235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&tempPool), 0);
5573b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (e)
5574b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        e->open = XML_TRUE;
5575b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (*s != XML_T('\0'))
5576b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        s++;
5577b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      context = s;
5578b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      poolDiscard(&tempPool);
5579b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5580d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    else if (*s == XML_T(ASCII_EQUALS)) {
5581b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      PREFIX *prefix;
5582b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (poolLength(&tempPool) == 0)
5583b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        prefix = &dtd->defaultPrefix;
5584b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else {
5585b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!poolAppendChar(&tempPool, XML_T('\0')))
5586b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_FALSE;
558735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&tempPool),
5588b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                  sizeof(PREFIX));
5589b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!prefix)
5590b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_FALSE;
5591b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (prefix->name == poolStart(&tempPool)) {
5592b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          prefix->name = poolCopyString(&dtd->pool, prefix->name);
5593b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!prefix->name)
5594b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return XML_FALSE;
5595b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5596b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        poolDiscard(&tempPool);
5597b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
5598b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      for (context = s + 1;
5599b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           *context != CONTEXT_SEP && *context != XML_T('\0');
5600b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           context++)
5601b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!poolAppendChar(&tempPool, *context))
5602b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return XML_FALSE;
5603b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!poolAppendChar(&tempPool, XML_T('\0')))
5604b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_FALSE;
5605b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (addBinding(parser, prefix, NULL, poolStart(&tempPool),
5606b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     &inheritedBindings) != XML_ERROR_NONE)
5607b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_FALSE;
5608b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      poolDiscard(&tempPool);
5609b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (*context != XML_T('\0'))
5610b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ++context;
5611b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      s = context;
5612b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5613b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
5614b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!poolAppendChar(&tempPool, *s))
5615b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_FALSE;
5616b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      s++;
5617b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5618b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5619b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_TRUE;
5620b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5621b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5622b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL
5623b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectnormalizePublicId(XML_Char *publicId)
5624b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5625b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char *p = publicId;
5626b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char *s;
5627b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (s = publicId; *s; s++) {
5628b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (*s) {
5629b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0x20:
5630b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0xD:
5631b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0xA:
5632b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (p != publicId && p[-1] != 0x20)
5633b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *p++ = 0x20;
5634b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
5635b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default:
5636b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *p++ = *s;
5637b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5638b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5639b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (p != publicId && p[-1] == 0x20)
5640b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    --p;
5641b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *p = XML_T('\0');
5642b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5643b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5644b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic DTD *
5645b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectdtdCreate(const XML_Memory_Handling_Suite *ms)
5646b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5647b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD));
5648b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (p == NULL)
5649b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return p;
5650b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolInit(&(p->pool), ms);
5651b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolInit(&(p->entityValuePool), ms);
5652b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableInit(&(p->generalEntities), ms);
5653b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableInit(&(p->elementTypes), ms);
5654b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableInit(&(p->attributeIds), ms);
5655b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableInit(&(p->prefixes), ms);
5656b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
5657b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->paramEntityRead = XML_FALSE;
5658b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableInit(&(p->paramEntities), ms);
5659b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
5660b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->defaultPrefix.name = NULL;
5661b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->defaultPrefix.binding = NULL;
5662b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5663b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->in_eldecl = XML_FALSE;
5664b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->scaffIndex = NULL;
5665b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->scaffold = NULL;
5666b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->scaffLevel = 0;
5667b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->scaffSize = 0;
5668b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->scaffCount = 0;
5669b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->contentStringLen = 0;
5670b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5671b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->keepProcessing = XML_TRUE;
5672b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->hasParamEntityRefs = XML_FALSE;
5673b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->standalone = XML_FALSE;
5674b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return p;
5675b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5676b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5677b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
5678b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectdtdReset(DTD *p, const XML_Memory_Handling_Suite *ms)
5679b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5680b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  HASH_TABLE_ITER iter;
5681b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableIterInit(&iter, &(p->elementTypes));
5682b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
5683b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);
5684b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!e)
5685b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
5686b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (e->allocDefaultAtts != 0)
5687b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      ms->free_fcn(e->defaultAtts);
5688b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5689b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableClear(&(p->generalEntities));
5690b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
5691b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->paramEntityRead = XML_FALSE;
5692b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableClear(&(p->paramEntities));
5693b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
5694b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableClear(&(p->elementTypes));
5695b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableClear(&(p->attributeIds));
5696b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableClear(&(p->prefixes));
5697b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolClear(&(p->pool));
5698b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolClear(&(p->entityValuePool));
5699b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->defaultPrefix.name = NULL;
5700b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->defaultPrefix.binding = NULL;
5701b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5702b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->in_eldecl = XML_FALSE;
5703b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5704b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ms->free_fcn(p->scaffIndex);
5705b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->scaffIndex = NULL;
5706b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ms->free_fcn(p->scaffold);
5707b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->scaffold = NULL;
5708b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5709b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->scaffLevel = 0;
5710b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->scaffSize = 0;
5711b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->scaffCount = 0;
5712b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->contentStringLen = 0;
5713b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5714b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->keepProcessing = XML_TRUE;
5715b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->hasParamEntityRefs = XML_FALSE;
5716b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->standalone = XML_FALSE;
5717b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5718b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5719b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
5720b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectdtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms)
5721b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5722b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  HASH_TABLE_ITER iter;
5723b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableIterInit(&iter, &(p->elementTypes));
5724b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
5725b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);
5726b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!e)
5727b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
5728b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (e->allocDefaultAtts != 0)
5729b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      ms->free_fcn(e->defaultAtts);
5730b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5731b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableDestroy(&(p->generalEntities));
5732b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
5733b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableDestroy(&(p->paramEntities));
5734b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
5735b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableDestroy(&(p->elementTypes));
5736b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableDestroy(&(p->attributeIds));
5737b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableDestroy(&(p->prefixes));
5738b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolDestroy(&(p->pool));
5739b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolDestroy(&(p->entityValuePool));
5740b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (isDocEntity) {
5741b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ms->free_fcn(p->scaffIndex);
5742b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ms->free_fcn(p->scaffold);
5743b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5744b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ms->free_fcn(p);
5745b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5746b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5747b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise.
5748b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   The new DTD has already been initialized.
5749b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
5750b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
575135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott HughesdtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
5752b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5753b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  HASH_TABLE_ITER iter;
5754b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5755b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* Copy the prefix table. */
5756b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5757b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableIterInit(&iter, &(oldDtd->prefixes));
5758b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
5759b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const XML_Char *name;
5760b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter);
5761b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!oldP)
5762b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
5763b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    name = poolCopyString(&(newDtd->pool), oldP->name);
5764b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!name)
5765b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
576635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    if (!lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX)))
5767b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
5768b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5769b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5770b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableIterInit(&iter, &(oldDtd->attributeIds));
5771b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5772b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* Copy the attribute id table. */
5773b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5774b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
5775b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ATTRIBUTE_ID *newA;
5776b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const XML_Char *name;
5777b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter);
5778b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5779b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!oldA)
5780b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
5781b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* Remember to allocate the scratch byte before the name. */
5782b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!poolAppendChar(&(newDtd->pool), XML_T('\0')))
5783b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
5784b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    name = poolCopyString(&(newDtd->pool), oldA->name);
5785b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!name)
5786b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
5787b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ++name;
578835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    newA = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), name,
5789b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                  sizeof(ATTRIBUTE_ID));
5790b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!newA)
5791b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
5792b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    newA->maybeTokenized = oldA->maybeTokenized;
5793b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (oldA->prefix) {
5794b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      newA->xmlns = oldA->xmlns;
5795b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (oldA->prefix == &oldDtd->defaultPrefix)
5796b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        newA->prefix = &newDtd->defaultPrefix;
5797b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else
579835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes        newA->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes),
5799b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        oldA->prefix->name, 0);
5800b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5801b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5802b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5803b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* Copy the element type table. */
5804b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5805b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableIterInit(&iter, &(oldDtd->elementTypes));
5806b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5807b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
5808b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int i;
5809b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ELEMENT_TYPE *newE;
5810b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const XML_Char *name;
5811b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter);
5812b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!oldE)
5813b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
5814b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    name = poolCopyString(&(newDtd->pool), oldE->name);
5815b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!name)
5816b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
581735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    newE = (ELEMENT_TYPE *)lookup(oldParser, &(newDtd->elementTypes), name,
5818b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                  sizeof(ELEMENT_TYPE));
5819b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!newE)
5820b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
5821b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (oldE->nDefaultAtts) {
5822b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      newE->defaultAtts = (DEFAULT_ATTRIBUTE *)
5823b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));
5824b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!newE->defaultAtts) {
5825b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ms->free_fcn(newE);
5826b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
5827b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
5828b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5829b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (oldE->idAtt)
5830b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      newE->idAtt = (ATTRIBUTE_ID *)
583135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes          lookup(oldParser, &(newDtd->attributeIds), oldE->idAtt->name, 0);
5832b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts;
5833b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (oldE->prefix)
583435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes      newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes),
5835b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                      oldE->prefix->name, 0);
5836b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (i = 0; i < newE->nDefaultAtts; i++) {
5837b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      newE->defaultAtts[i].id = (ATTRIBUTE_ID *)
583835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes          lookup(oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0);
5839b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata;
5840b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (oldE->defaultAtts[i].value) {
5841b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        newE->defaultAtts[i].value
5842b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value);
5843b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!newE->defaultAtts[i].value)
5844b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return 0;
5845b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
5846b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else
5847b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        newE->defaultAtts[i].value = NULL;
5848b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5849b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5850b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5851b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* Copy the entity tables. */
585235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  if (!copyEntityTable(oldParser,
585335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                       &(newDtd->generalEntities),
5854b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       &(newDtd->pool),
5855b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       &(oldDtd->generalEntities)))
5856b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
5857b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5858b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
585935e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  if (!copyEntityTable(oldParser,
586035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                       &(newDtd->paramEntities),
5861b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       &(newDtd->pool),
5862b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       &(oldDtd->paramEntities)))
5863b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
5864b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  newDtd->paramEntityRead = oldDtd->paramEntityRead;
5865b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_DTD */
5866b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5867b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  newDtd->keepProcessing = oldDtd->keepProcessing;
5868b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs;
5869b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  newDtd->standalone = oldDtd->standalone;
5870b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5871b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* Don't want deep copying for scaffolding */
5872b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  newDtd->in_eldecl = oldDtd->in_eldecl;
5873b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  newDtd->scaffold = oldDtd->scaffold;
5874b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  newDtd->contentStringLen = oldDtd->contentStringLen;
5875b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  newDtd->scaffSize = oldDtd->scaffSize;
5876b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  newDtd->scaffLevel = oldDtd->scaffLevel;
5877b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  newDtd->scaffIndex = oldDtd->scaffIndex;
5878b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5879b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 1;
5880b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}  /* End dtdCopy */
5881b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5882b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
588335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott HughescopyEntityTable(XML_Parser oldParser,
588435e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                HASH_TABLE *newTable,
5885b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                STRING_POOL *newPool,
5886b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const HASH_TABLE *oldTable)
5887b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5888b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  HASH_TABLE_ITER iter;
5889b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *cachedOldBase = NULL;
5890b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *cachedNewBase = NULL;
5891b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5892b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  hashTableIterInit(&iter, oldTable);
5893b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5894b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
5895b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ENTITY *newE;
5896b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const XML_Char *name;
5897b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter);
5898b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!oldE)
5899b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
5900b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    name = poolCopyString(newPool, oldE->name);
5901b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!name)
5902b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
590335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    newE = (ENTITY *)lookup(oldParser, newTable, name, sizeof(ENTITY));
5904b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!newE)
5905b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
5906b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (oldE->systemId) {
5907b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      const XML_Char *tem = poolCopyString(newPool, oldE->systemId);
5908b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!tem)
5909b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
5910b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      newE->systemId = tem;
5911b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (oldE->base) {
5912b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (oldE->base == cachedOldBase)
5913b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          newE->base = cachedNewBase;
5914b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else {
5915b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          cachedOldBase = oldE->base;
5916b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          tem = poolCopyString(newPool, cachedOldBase);
5917b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          if (!tem)
5918b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return 0;
5919b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          cachedNewBase = newE->base = tem;
5920b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
5921b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
5922b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (oldE->publicId) {
5923b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        tem = poolCopyString(newPool, oldE->publicId);
5924b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!tem)
5925b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          return 0;
5926b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        newE->publicId = tem;
5927b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
5928b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5929b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
5930b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr,
5931b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                            oldE->textLen);
5932b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!tem)
5933b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
5934b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      newE->textPtr = tem;
5935b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      newE->textLen = oldE->textLen;
5936b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5937b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (oldE->notation) {
5938b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      const XML_Char *tem = poolCopyString(newPool, oldE->notation);
5939b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!tem)
5940b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
5941b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      newE->notation = tem;
5942b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5943b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    newE->is_param = oldE->is_param;
5944b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    newE->is_internal = oldE->is_internal;
5945b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5946b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 1;
5947b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5948b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5949b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define INIT_POWER 6
5950b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5951b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Bool FASTCALL
5952b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectkeyeq(KEY s1, KEY s2)
5953b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5954b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (; *s1 == *s2; s1++, s2++)
5955b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (*s1 == 0)
5956b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_TRUE;
5957b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_FALSE;
5958b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5959b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5960b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic unsigned long FASTCALL
596135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hugheshash(XML_Parser parser, KEY s)
5962b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
596335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  unsigned long h = hash_secret_salt;
5964b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  while (*s)
5965b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    h = CHAR_HASH(h, *s++);
5966b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return h;
5967b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
5968b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5969b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic NAMED *
597035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hugheslookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize)
5971b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5972b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  size_t i;
5973b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (table->size == 0) {
5974b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    size_t tsize;
5975b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!createSize)
5976b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return NULL;
5977b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    table->power = INIT_POWER;
5978b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* table->size is a power of 2 */
5979b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    table->size = (size_t)1 << INIT_POWER;
5980b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tsize = table->size * sizeof(NAMED *);
5981b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    table->v = (NAMED **)table->mem->malloc_fcn(tsize);
5982b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!table->v) {
5983b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      table->size = 0;
5984b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return NULL;
5985b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
5986b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    memset(table->v, 0, tsize);
598735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    i = hash(parser, name) & ((unsigned long)table->size - 1);
5988b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
5989b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
599035e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    unsigned long h = hash(parser, name);
5991b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    unsigned long mask = (unsigned long)table->size - 1;
5992b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    unsigned char step = 0;
5993b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    i = h & mask;
5994b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    while (table->v[i]) {
5995b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (keyeq(name, table->v[i]->name))
5996b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return table->v[i];
5997b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!step)
5998b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        step = PROBE_STEP(h, mask, table->power);
5999b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      i < step ? (i += table->size - step) : (i -= step);
6000b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
6001b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!createSize)
6002b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return NULL;
6003b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6004b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* check for overflow (table is half full) */
6005b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (table->used >> (table->power - 1)) {
6006b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      unsigned char newPower = table->power + 1;
6007b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      size_t newSize = (size_t)1 << newPower;
6008b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      unsigned long newMask = (unsigned long)newSize - 1;
6009b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      size_t tsize = newSize * sizeof(NAMED *);
6010b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize);
6011b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!newV)
6012b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return NULL;
6013b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      memset(newV, 0, tsize);
6014b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      for (i = 0; i < table->size; i++)
6015b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (table->v[i]) {
601635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes          unsigned long newHash = hash(parser, table->v[i]->name);
6017b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          size_t j = newHash & newMask;
6018b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          step = 0;
6019b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          while (newV[j]) {
6020b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (!step)
6021b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              step = PROBE_STEP(newHash, newMask, newPower);
6022b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            j < step ? (j += newSize - step) : (j -= step);
6023b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          }
6024b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          newV[j] = table->v[i];
6025b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
6026b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      table->mem->free_fcn(table->v);
6027b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      table->v = newV;
6028b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      table->power = newPower;
6029b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      table->size = newSize;
6030b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      i = h & newMask;
6031b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      step = 0;
6032b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      while (table->v[i]) {
6033b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (!step)
6034b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          step = PROBE_STEP(h, newMask, newPower);
6035b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        i < step ? (i += newSize - step) : (i -= step);
6036b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
6037b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
6038b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6039b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize);
6040b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!table->v[i])
6041b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
6042b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  memset(table->v[i], 0, createSize);
6043b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  table->v[i]->name = name;
6044b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  (table->used)++;
6045b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return table->v[i];
6046b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6047b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6048b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL
6049b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjecthashTableClear(HASH_TABLE *table)
6050b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6051b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  size_t i;
6052b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (i = 0; i < table->size; i++) {
6053b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    table->mem->free_fcn(table->v[i]);
6054b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    table->v[i] = NULL;
6055b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6056b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  table->used = 0;
6057b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6058b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6059b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL
6060b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjecthashTableDestroy(HASH_TABLE *table)
6061b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6062b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  size_t i;
6063b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (i = 0; i < table->size; i++)
6064b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    table->mem->free_fcn(table->v[i]);
6065b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  table->mem->free_fcn(table->v);
6066b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6067b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6068b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL
6069b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjecthashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms)
6070b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6071b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->power = 0;
6072b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->size = 0;
6073b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->used = 0;
6074b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->v = NULL;
6075b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p->mem = ms;
6076b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6077b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6078b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL
6079b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjecthashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table)
6080b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6081b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  iter->p = table->v;
6082b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  iter->end = iter->p + table->size;
6083b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6084b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6085b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic NAMED * FASTCALL
6086b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjecthashTableIterNext(HASH_TABLE_ITER *iter)
6087b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6088b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  while (iter->p != iter->end) {
6089b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    NAMED *tem = *(iter->p)++;
6090b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (tem)
6091b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return tem;
6092b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6093b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return NULL;
6094b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6095b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6096b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL
6097b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms)
6098b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6099b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  pool->blocks = NULL;
6100b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  pool->freeBlocks = NULL;
6101b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  pool->start = NULL;
6102b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  pool->ptr = NULL;
6103b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  pool->end = NULL;
6104b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  pool->mem = ms;
6105b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6106b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6107b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL
6108b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolClear(STRING_POOL *pool)
6109b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6110b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!pool->freeBlocks)
6111b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    pool->freeBlocks = pool->blocks;
6112b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
6113b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    BLOCK *p = pool->blocks;
6114b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    while (p) {
6115b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      BLOCK *tem = p->next;
6116b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      p->next = pool->freeBlocks;
6117b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      pool->freeBlocks = p;
6118b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      p = tem;
6119b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
6120b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6121b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  pool->blocks = NULL;
6122b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  pool->start = NULL;
6123b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  pool->ptr = NULL;
6124b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  pool->end = NULL;
6125b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6126b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6127b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void FASTCALL
6128b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolDestroy(STRING_POOL *pool)
6129b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6130b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  BLOCK *p = pool->blocks;
6131b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  while (p) {
6132b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    BLOCK *tem = p->next;
6133b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    pool->mem->free_fcn(p);
6134b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    p = tem;
6135b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6136b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  p = pool->freeBlocks;
6137b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  while (p) {
6138b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    BLOCK *tem = p->next;
6139b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    pool->mem->free_fcn(p);
6140b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    p = tem;
6141b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6142b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6143b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6144b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Char *
6145b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolAppend(STRING_POOL *pool, const ENCODING *enc,
6146b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           const char *ptr, const char *end)
6147b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6148b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!pool->ptr && !poolGrow(pool))
6149b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
6150b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
6151b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end);
6152b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (ptr == end)
6153b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
6154b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!poolGrow(pool))
6155b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return NULL;
6156b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6157b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return pool->start;
6158b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6159b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6160b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const XML_Char * FASTCALL
6161b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolCopyString(STRING_POOL *pool, const XML_Char *s)
6162b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6163b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  do {
6164b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!poolAppendChar(pool, *s))
6165b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return NULL;
6166b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  } while (*s++);
6167b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  s = pool->start;
6168b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolFinish(pool);
6169b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return s;
6170b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6171b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6172b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const XML_Char *
6173b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n)
6174b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6175b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!pool->ptr && !poolGrow(pool))
6176b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
6177b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (; n > 0; --n, s++) {
6178b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!poolAppendChar(pool, *s))
6179b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return NULL;
6180b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6181b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  s = pool->start;
6182b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  poolFinish(pool);
6183b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return s;
6184b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6185b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6186b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const XML_Char * FASTCALL
6187b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolAppendString(STRING_POOL *pool, const XML_Char *s)
6188b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6189b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  while (*s) {
6190b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!poolAppendChar(pool, *s))
6191b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return NULL;
6192b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    s++;
6193b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6194b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return pool->start;
6195b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6196b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6197b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Char *
6198b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolStoreString(STRING_POOL *pool, const ENCODING *enc,
6199b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const char *ptr, const char *end)
6200b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6201b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!poolAppend(pool, enc, ptr, end))
6202b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
6203b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (pool->ptr == pool->end && !poolGrow(pool))
6204b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
6205b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *(pool->ptr)++ = 0;
6206b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return pool->start;
6207b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6208b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6209b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Bool FASTCALL
6210b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectpoolGrow(STRING_POOL *pool)
6211b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6212b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (pool->freeBlocks) {
6213b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (pool->start == 0) {
6214b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      pool->blocks = pool->freeBlocks;
6215b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      pool->freeBlocks = pool->freeBlocks->next;
6216b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      pool->blocks->next = NULL;
6217b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      pool->start = pool->blocks->s;
6218b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      pool->end = pool->start + pool->blocks->size;
6219b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      pool->ptr = pool->start;
6220b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_TRUE;
6221b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
6222b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (pool->end - pool->start < pool->freeBlocks->size) {
6223b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      BLOCK *tem = pool->freeBlocks->next;
6224b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      pool->freeBlocks->next = pool->blocks;
6225b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      pool->blocks = pool->freeBlocks;
6226b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      pool->freeBlocks = tem;
6227b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      memcpy(pool->blocks->s, pool->start,
6228b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             (pool->end - pool->start) * sizeof(XML_Char));
6229b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      pool->ptr = pool->blocks->s + (pool->ptr - pool->start);
6230b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      pool->start = pool->blocks->s;
6231b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      pool->end = pool->start + pool->blocks->size;
6232b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_TRUE;
6233b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
6234b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6235b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (pool->blocks && pool->start == pool->blocks->s) {
6236b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int blockSize = (int)(pool->end - pool->start)*2;
623735e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    BLOCK *temp = (BLOCK *)
6238b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      pool->mem->realloc_fcn(pool->blocks,
6239b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             (offsetof(BLOCK, s)
6240b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              + blockSize * sizeof(XML_Char)));
624135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    if (temp == NULL)
6242b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_FALSE;
624335e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    pool->blocks = temp;
6244b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    pool->blocks->size = blockSize;
6245b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    pool->ptr = pool->blocks->s + (pool->ptr - pool->start);
6246b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    pool->start = pool->blocks->s;
6247b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    pool->end = pool->start + blockSize;
6248b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6249b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
6250b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    BLOCK *tem;
6251b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int blockSize = (int)(pool->end - pool->start);
6252b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (blockSize < INIT_BLOCK_SIZE)
6253b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      blockSize = INIT_BLOCK_SIZE;
6254b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else
6255b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      blockSize *= 2;
6256b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s)
6257b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        + blockSize * sizeof(XML_Char));
6258b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!tem)
6259b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_FALSE;
6260b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tem->size = blockSize;
6261b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tem->next = pool->blocks;
6262b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    pool->blocks = tem;
6263b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (pool->ptr != pool->start)
6264b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      memcpy(tem->s, pool->start,
6265b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             (pool->ptr - pool->start) * sizeof(XML_Char));
6266b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    pool->ptr = tem->s + (pool->ptr - pool->start);
6267b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    pool->start = tem->s;
6268b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    pool->end = tem->s + blockSize;
6269b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6270b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XML_TRUE;
6271b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6272b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6273b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int FASTCALL
6274b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectnextScaffoldPart(XML_Parser parser)
6275b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6276b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD * const dtd = _dtd;  /* save one level of indirection */
6277b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  CONTENT_SCAFFOLD * me;
6278b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int next;
6279b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6280b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!dtd->scaffIndex) {
6281b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int));
6282b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!dtd->scaffIndex)
6283b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return -1;
6284b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    dtd->scaffIndex[0] = 0;
6285b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6286b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6287b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (dtd->scaffCount >= dtd->scaffSize) {
6288b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CONTENT_SCAFFOLD *temp;
6289b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (dtd->scaffold) {
6290b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      temp = (CONTENT_SCAFFOLD *)
6291b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD));
6292b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (temp == NULL)
6293b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return -1;
6294b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      dtd->scaffSize *= 2;
6295b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
6296b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
6297b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS
6298b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                        * sizeof(CONTENT_SCAFFOLD));
6299b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (temp == NULL)
6300b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return -1;
6301b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS;
6302b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
6303b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    dtd->scaffold = temp;
6304b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6305b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  next = dtd->scaffCount++;
6306b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  me = &dtd->scaffold[next];
6307b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (dtd->scaffLevel) {
6308b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]];
6309b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (parent->lastchild) {
6310b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      dtd->scaffold[parent->lastchild].nextsib = next;
6311b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
6312b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!parent->childcnt)
6313b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      parent->firstchild = next;
6314b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    parent->lastchild = next;
6315b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    parent->childcnt++;
6316b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6317b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0;
6318b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return next;
6319b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6320b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6321b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
6322b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectbuild_node(XML_Parser parser,
6323b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           int src_node,
6324b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           XML_Content *dest,
6325b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           XML_Content **contpos,
6326b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           XML_Char **strpos)
6327b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6328b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD * const dtd = _dtd;  /* save one level of indirection */
6329b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  dest->type = dtd->scaffold[src_node].type;
6330b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  dest->quant = dtd->scaffold[src_node].quant;
6331b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (dest->type == XML_CTYPE_NAME) {
6332b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const XML_Char *src;
6333b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    dest->name = *strpos;
6334b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    src = dtd->scaffold[src_node].name;
6335b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (;;) {
6336b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(*strpos)++ = *src;
6337b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (!*src)
6338b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
6339b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      src++;
6340b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
6341b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    dest->numchildren = 0;
6342b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    dest->children = NULL;
6343b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6344b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
6345b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    unsigned int i;
6346b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int cn;
6347b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    dest->numchildren = dtd->scaffold[src_node].childcnt;
6348b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    dest->children = *contpos;
6349b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *contpos += dest->numchildren;
6350b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (i = 0, cn = dtd->scaffold[src_node].firstchild;
6351b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         i < dest->numchildren;
6352b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         i++, cn = dtd->scaffold[cn].nextsib) {
6353b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      build_node(parser, cn, &(dest->children[i]), contpos, strpos);
6354b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
6355b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    dest->name = NULL;
6356b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6357b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6358b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6359b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Content *
6360b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectbuild_model (XML_Parser parser)
6361b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6362b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD * const dtd = _dtd;  /* save one level of indirection */
6363b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Content *ret;
6364b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Content *cpos;
6365b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Char * str;
6366b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int allocsize = (dtd->scaffCount * sizeof(XML_Content)
6367b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   + (dtd->contentStringLen * sizeof(XML_Char)));
6368b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6369b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ret = (XML_Content *)MALLOC(allocsize);
6370b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!ret)
6371b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
6372b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6373b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  str =  (XML_Char *) (&ret[dtd->scaffCount]);
6374b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  cpos = &ret[1];
6375b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6376b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  build_node(parser, 0, ret, &cpos, &str);
6377b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return ret;
6378b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6379b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6380b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic ELEMENT_TYPE *
6381b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectgetElementType(XML_Parser parser,
6382b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const ENCODING *enc,
6383b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char *ptr,
6384b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char *end)
6385b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
6386b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  DTD * const dtd = _dtd;  /* save one level of indirection */
6387b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end);
6388b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ELEMENT_TYPE *ret;
6389b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
6390b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!name)
6391b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
639235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes  ret = (ELEMENT_TYPE *) lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE));
6393b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!ret)
6394b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NULL;
6395b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (ret->name != name)
6396b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    poolDiscard(&dtd->pool);
6397b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
6398b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    poolFinish(&dtd->pool);
6399b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!setElementTypePrefix(parser, ret))
6400b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return NULL;
6401b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
6402b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return ret;
6403b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
6404