annotate mcabber/libjabber/xmlparse.c @ 430:d03663d2e7d9

Display error messages as specified in RFC3920 (9.3) If possible, we display the child element corresponding to the stanza error conditions defined in RFC3920. Error code and error text will be displayed if available.
author Mikael Berthe <mikael@lilotux.net>
date Sun, 11 Sep 2005 22:01:57 +0200
parents f7f07794d2df
children 0aa9015f06df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2 The contents of this file are subject to the Mozilla Public License
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3 Version 1.1 (the "License"); you may not use this file except in
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
4 compliance with the License. You may obtain a copy of the License at
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
5 http://www.mozilla.org/MPL/
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
6
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
7 Software distributed under the License is distributed on an "AS IS"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
8 basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
9 License for the specific language governing rights and limitations
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
10 under the License.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
11
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
12 The Original Code is expat.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
13
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
14 The Initial Developer of the Original Code is James Clark.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
15 Portions created by James Clark are Copyright (C) 1998, 1999
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
16 James Clark. All Rights Reserved.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
17
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
18 Contributor(s):
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
19
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
20 Alternatively, the contents of this file may be used under the terms
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
21 of the GNU General Public License (the "GPL"), in which case the
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
22 provisions of the GPL are applicable instead of those above. If you
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
23 wish to allow use of your version of this file only under the terms of
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
24 the GPL and not to allow others to use your version of this file under
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
25 the MPL, indicate your decision by deleting the provisions above and
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
26 replace them with the notice and other provisions required by the
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
27 GPL. If you do not delete the provisions above, a recipient may use
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
28 your version of this file under either the MPL or the GPL.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
29 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
30
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
31 #include "xmldef.h"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
32 #include "xmlparse.h"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
33
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
34 #ifdef XML_UNICODE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
35 #define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
36 #define XmlConvert XmlUtf16Convert
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
37 #define XmlGetInternalEncoding XmlGetUtf16InternalEncoding
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
38 #define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
39 #define XmlEncode XmlUtf16Encode
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
40 #define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
41 typedef unsigned short ICHAR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
42 #else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
43 #define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
44 #define XmlConvert XmlUtf8Convert
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
45 #define XmlGetInternalEncoding XmlGetUtf8InternalEncoding
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
46 #define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
47 #define XmlEncode XmlUtf8Encode
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
48 #define MUST_CONVERT(enc, s) (!(enc)->isUtf8)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
49 typedef char ICHAR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
50 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
51
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
52
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
53 #ifndef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
54
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
55 #define XmlInitEncodingNS XmlInitEncoding
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
56 #define XmlInitUnknownEncodingNS XmlInitUnknownEncoding
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
57 #undef XmlGetInternalEncodingNS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
58 #define XmlGetInternalEncodingNS XmlGetInternalEncoding
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
59 #define XmlParseXmlDeclNS XmlParseXmlDecl
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
60
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
61 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
62
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
63
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
64 #ifdef XML_UNICODE_WCHAR_T
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
65 #define XML_T(x) L ## x
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
66 #else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
67 #define XML_T(x) x
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
68 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
69
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
70 /* Round up n to be a multiple of sz, where sz is a power of 2. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
71 #define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
72
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
73 #include "xmltok.h"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
74 #include "xmlrole.h"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
75 #include "hashtable.h"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
76
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
77 #define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
78 #define INIT_DATA_BUF_SIZE 1024
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
79 #define INIT_ATTS_SIZE 16
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
80 #define INIT_BLOCK_SIZE 1024
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
81 #define INIT_BUFFER_SIZE 1024
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
82
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
83 #define EXPAND_SPARE 24
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
84
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
85 typedef struct binding {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
86 struct prefix *prefix;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
87 struct binding *nextTagBinding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
88 struct binding *prevPrefixBinding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
89 const struct attribute_id *attId;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
90 XML_Char *uri;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
91 int uriLen;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
92 int uriAlloc;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
93 } BINDING;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
94
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
95 typedef struct prefix {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
96 const XML_Char *name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
97 BINDING *binding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
98 } PREFIX;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
99
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
100 typedef struct {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
101 const XML_Char *str;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
102 const XML_Char *localPart;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
103 int uriLen;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
104 } TAG_NAME;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
105
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
106 typedef struct tag {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
107 struct tag *parent;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
108 const char *rawName;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
109 int rawNameLength;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
110 TAG_NAME name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
111 char *buf;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
112 char *bufEnd;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
113 BINDING *bindings;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
114 } TAG;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
115
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
116 typedef struct {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
117 const XML_Char *name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
118 const XML_Char *textPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
119 int textLen;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
120 const XML_Char *systemId;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
121 const XML_Char *base;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
122 const XML_Char *publicId;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
123 const XML_Char *notation;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
124 char open;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
125 } ENTITY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
126
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
127 typedef struct block {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
128 struct block *next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
129 int size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
130 XML_Char s[1];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
131 } BLOCK;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
132
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
133 typedef struct {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
134 BLOCK *blocks;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
135 BLOCK *freeBlocks;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
136 const XML_Char *end;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
137 XML_Char *ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
138 XML_Char *start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
139 } STRING_POOL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
140
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
141 /* The XML_Char before the name is used to determine whether
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
142 an attribute has been specified. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
143 typedef struct attribute_id {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
144 XML_Char *name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
145 PREFIX *prefix;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
146 char maybeTokenized;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
147 char xmlns;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
148 } ATTRIBUTE_ID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
149
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
150 typedef struct {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
151 const ATTRIBUTE_ID *id;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
152 char isCdata;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
153 const XML_Char *value;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
154 } DEFAULT_ATTRIBUTE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
155
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
156 typedef struct {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
157 const XML_Char *name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
158 PREFIX *prefix;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
159 int nDefaultAtts;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
160 int allocDefaultAtts;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
161 DEFAULT_ATTRIBUTE *defaultAtts;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
162 } ELEMENT_TYPE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
163
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
164 typedef struct {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
165 HASH_TABLE generalEntities;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
166 HASH_TABLE elementTypes;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
167 HASH_TABLE attributeIds;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
168 HASH_TABLE prefixes;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
169 STRING_POOL pool;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
170 int complete;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
171 int standalone;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
172 const XML_Char *base;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
173 PREFIX defaultPrefix;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
174 } DTD;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
175
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
176 typedef struct open_internal_entity {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
177 const char *internalEventPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
178 const char *internalEventEndPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
179 struct open_internal_entity *next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
180 ENTITY *entity;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
181 } OPEN_INTERNAL_ENTITY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
182
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
183 typedef enum XML_Error Processor(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
184 const char *start,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
185 const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
186 const char **endPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
187
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
188 static Processor prologProcessor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
189 static Processor prologInitProcessor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
190 static Processor contentProcessor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
191 static Processor cdataSectionProcessor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
192 static Processor epilogProcessor;
235
f7f07794d2df [/trunk] Changeset 248 by mikael
mikael
parents: 25
diff changeset
193 /* static Processor errorProcessor; */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
194 static Processor externalEntityInitProcessor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
195 static Processor externalEntityInitProcessor2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
196 static Processor externalEntityInitProcessor3;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
197 static Processor externalEntityContentProcessor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
198
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
199 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
200 handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
201 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
202 processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *, const char *);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
203 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
204 initializeEncoding(XML_Parser parser);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
205 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
206 doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
207 const char *start, const char *end, const char **endPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
208 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
209 doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, const char *end, const char **nextPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
210 static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *, const char *s,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
211 TAG_NAME *tagNamePtr, BINDING **bindingsPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
212 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
213 int addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, const XML_Char *uri, BINDING **bindingsPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
214 static int
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
215 defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, int isCdata, const XML_Char *dfltValue);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
216 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
217 storeAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
218 STRING_POOL *);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
219 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
220 appendAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
221 STRING_POOL *);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
222 static ATTRIBUTE_ID *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
223 getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
224 static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
225 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
226 storeEntityValue(XML_Parser parser, const char *start, const char *end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
227 static int
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
228 reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
229 static int
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
230 reportComment(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
231 static void
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
232 reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
233
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
234 static const XML_Char *getContext(XML_Parser parser);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
235 static int setContext(XML_Parser parser, const XML_Char *context);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
236 static void normalizePublicId(XML_Char *s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
237 static int dtdInit(DTD *);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
238 static void dtdDestroy(DTD *);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
239 static int dtdCopy(DTD *newDtd, const DTD *oldDtd);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
240 static void poolInit(STRING_POOL *);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
241 static void poolClear(STRING_POOL *);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
242 static void poolDestroy(STRING_POOL *);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
243 static XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
244 const char *ptr, const char *end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
245 static XML_Char *poolStoreString(STRING_POOL *pool, const ENCODING *enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
246 const char *ptr, const char *end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
247 static int poolGrow(STRING_POOL *pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
248 static const XML_Char *poolCopyString(STRING_POOL *pool, const XML_Char *s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
249 static const XML_Char *poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
250
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
251 #define poolStart(pool) ((pool)->start)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
252 #define poolEnd(pool) ((pool)->ptr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
253 #define poolLength(pool) ((pool)->ptr - (pool)->start)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
254 #define poolChop(pool) ((void)--(pool->ptr))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
255 #define poolLastChar(pool) (((pool)->ptr)[-1])
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
256 #define poolDiscard(pool) ((pool)->ptr = (pool)->start)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
257 #define poolFinish(pool) ((pool)->start = (pool)->ptr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
258 #define poolAppendChar(pool, c) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
259 (((pool)->ptr == (pool)->end && !poolGrow(pool)) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
260 ? 0 \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
261 : ((*((pool)->ptr)++ = c), 1))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
262
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
263 typedef struct {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
264 /* The first member must be userData so that the XML_GetUserData macro works. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
265 void *m_userData;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
266 void *m_handlerArg;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
267 char *m_buffer;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
268 /* first character to be parsed */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
269 const char *m_bufferPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
270 /* past last character to be parsed */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
271 char *m_bufferEnd;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
272 /* allocated end of buffer */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
273 const char *m_bufferLim;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
274 long m_parseEndByteIndex;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
275 const char *m_parseEndPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
276 XML_Char *m_dataBuf;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
277 XML_Char *m_dataBufEnd;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
278 XML_StartElementHandler m_startElementHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
279 XML_EndElementHandler m_endElementHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
280 XML_CharacterDataHandler m_characterDataHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
281 XML_ProcessingInstructionHandler m_processingInstructionHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
282 XML_CommentHandler m_commentHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
283 XML_StartCdataSectionHandler m_startCdataSectionHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
284 XML_EndCdataSectionHandler m_endCdataSectionHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
285 XML_DefaultHandler m_defaultHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
286 XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
287 XML_NotationDeclHandler m_notationDeclHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
288 XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
289 XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
290 XML_NotStandaloneHandler m_notStandaloneHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
291 XML_ExternalEntityRefHandler m_externalEntityRefHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
292 void *m_externalEntityRefHandlerArg;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
293 XML_UnknownEncodingHandler m_unknownEncodingHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
294 const ENCODING *m_encoding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
295 INIT_ENCODING m_initEncoding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
296 const XML_Char *m_protocolEncodingName;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
297 int m_ns;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
298 void *m_unknownEncodingMem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
299 void *m_unknownEncodingData;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
300 void *m_unknownEncodingHandlerData;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
301 void (*m_unknownEncodingRelease)(void *);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
302 PROLOG_STATE m_prologState;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
303 Processor *m_processor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
304 enum XML_Error m_errorCode;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
305 const char *m_eventPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
306 const char *m_eventEndPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
307 const char *m_positionPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
308 OPEN_INTERNAL_ENTITY *m_openInternalEntities;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
309 int m_defaultExpandInternalEntities;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
310 int m_tagLevel;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
311 ENTITY *m_declEntity;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
312 const XML_Char *m_declNotationName;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
313 const XML_Char *m_declNotationPublicId;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
314 ELEMENT_TYPE *m_declElementType;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
315 ATTRIBUTE_ID *m_declAttributeId;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
316 char m_declAttributeIsCdata;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
317 DTD m_dtd;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
318 TAG *m_tagStack;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
319 TAG *m_freeTagList;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
320 BINDING *m_inheritedBindings;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
321 BINDING *m_freeBindingList;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
322 int m_attsSize;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
323 int m_nSpecifiedAtts;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
324 ATTRIBUTE *m_atts;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
325 POSITION m_position;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
326 STRING_POOL m_tempPool;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
327 STRING_POOL m_temp2Pool;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
328 char *m_groupConnector;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
329 unsigned m_groupSize;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
330 int m_hadExternalDoctype;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
331 XML_Char m_namespaceSeparator;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
332 } Parser;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
333
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
334 #define userData (((Parser *)parser)->m_userData)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
335 #define handlerArg (((Parser *)parser)->m_handlerArg)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
336 #define startElementHandler (((Parser *)parser)->m_startElementHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
337 #define endElementHandler (((Parser *)parser)->m_endElementHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
338 #define characterDataHandler (((Parser *)parser)->m_characterDataHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
339 #define processingInstructionHandler (((Parser *)parser)->m_processingInstructionHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
340 #define commentHandler (((Parser *)parser)->m_commentHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
341 #define startCdataSectionHandler (((Parser *)parser)->m_startCdataSectionHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
342 #define endCdataSectionHandler (((Parser *)parser)->m_endCdataSectionHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
343 #define defaultHandler (((Parser *)parser)->m_defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
344 #define unparsedEntityDeclHandler (((Parser *)parser)->m_unparsedEntityDeclHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
345 #define notationDeclHandler (((Parser *)parser)->m_notationDeclHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
346 #define startNamespaceDeclHandler (((Parser *)parser)->m_startNamespaceDeclHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
347 #define endNamespaceDeclHandler (((Parser *)parser)->m_endNamespaceDeclHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
348 #define notStandaloneHandler (((Parser *)parser)->m_notStandaloneHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
349 #define externalEntityRefHandler (((Parser *)parser)->m_externalEntityRefHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
350 #define externalEntityRefHandlerArg (((Parser *)parser)->m_externalEntityRefHandlerArg)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
351 #define unknownEncodingHandler (((Parser *)parser)->m_unknownEncodingHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
352 #define encoding (((Parser *)parser)->m_encoding)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
353 #define initEncoding (((Parser *)parser)->m_initEncoding)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
354 #define unknownEncodingMem (((Parser *)parser)->m_unknownEncodingMem)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
355 #define unknownEncodingData (((Parser *)parser)->m_unknownEncodingData)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
356 #define unknownEncodingHandlerData \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
357 (((Parser *)parser)->m_unknownEncodingHandlerData)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
358 #define unknownEncodingRelease (((Parser *)parser)->m_unknownEncodingRelease)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
359 #define protocolEncodingName (((Parser *)parser)->m_protocolEncodingName)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
360 #define ns (((Parser *)parser)->m_ns)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
361 #define prologState (((Parser *)parser)->m_prologState)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
362 #define processor (((Parser *)parser)->m_processor)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
363 #define errorCode (((Parser *)parser)->m_errorCode)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
364 #define eventPtr (((Parser *)parser)->m_eventPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
365 #define eventEndPtr (((Parser *)parser)->m_eventEndPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
366 #define positionPtr (((Parser *)parser)->m_positionPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
367 #define position (((Parser *)parser)->m_position)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
368 #define openInternalEntities (((Parser *)parser)->m_openInternalEntities)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
369 #define defaultExpandInternalEntities (((Parser *)parser)->m_defaultExpandInternalEntities)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
370 #define tagLevel (((Parser *)parser)->m_tagLevel)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
371 #define buffer (((Parser *)parser)->m_buffer)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
372 #define bufferPtr (((Parser *)parser)->m_bufferPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
373 #define bufferEnd (((Parser *)parser)->m_bufferEnd)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
374 #define parseEndByteIndex (((Parser *)parser)->m_parseEndByteIndex)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
375 #define parseEndPtr (((Parser *)parser)->m_parseEndPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
376 #define bufferLim (((Parser *)parser)->m_bufferLim)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
377 #define dataBuf (((Parser *)parser)->m_dataBuf)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
378 #define dataBufEnd (((Parser *)parser)->m_dataBufEnd)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
379 #define dtd (((Parser *)parser)->m_dtd)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
380 #define declEntity (((Parser *)parser)->m_declEntity)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
381 #define declNotationName (((Parser *)parser)->m_declNotationName)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
382 #define declNotationPublicId (((Parser *)parser)->m_declNotationPublicId)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
383 #define declElementType (((Parser *)parser)->m_declElementType)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
384 #define declAttributeId (((Parser *)parser)->m_declAttributeId)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
385 #define declAttributeIsCdata (((Parser *)parser)->m_declAttributeIsCdata)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
386 #define freeTagList (((Parser *)parser)->m_freeTagList)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
387 #define freeBindingList (((Parser *)parser)->m_freeBindingList)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
388 #define inheritedBindings (((Parser *)parser)->m_inheritedBindings)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
389 #define tagStack (((Parser *)parser)->m_tagStack)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
390 #define atts (((Parser *)parser)->m_atts)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
391 #define attsSize (((Parser *)parser)->m_attsSize)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
392 #define nSpecifiedAtts (((Parser *)parser)->m_nSpecifiedAtts)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
393 #define tempPool (((Parser *)parser)->m_tempPool)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
394 #define temp2Pool (((Parser *)parser)->m_temp2Pool)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
395 #define groupConnector (((Parser *)parser)->m_groupConnector)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
396 #define groupSize (((Parser *)parser)->m_groupSize)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
397 #define hadExternalDoctype (((Parser *)parser)->m_hadExternalDoctype)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
398 #define namespaceSeparator (((Parser *)parser)->m_namespaceSeparator)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
399
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
400 #ifdef _MSC_VER
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
401 #ifdef _DEBUG
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
402 Parser *asParser(XML_Parser parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
403 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
404 return parser;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
405 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
406 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
407 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
408
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
409 XML_Parser XML_ParserCreate(const XML_Char *encodingName)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
410 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
411 XML_Parser parser = malloc(sizeof(Parser));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
412 if (!parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
413 return parser;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
414 processor = prologInitProcessor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
415 XmlPrologStateInit(&prologState);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
416 userData = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
417 handlerArg = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
418 startElementHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
419 endElementHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
420 characterDataHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
421 processingInstructionHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
422 commentHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
423 startCdataSectionHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
424 endCdataSectionHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
425 defaultHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
426 unparsedEntityDeclHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
427 notationDeclHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
428 startNamespaceDeclHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
429 endNamespaceDeclHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
430 notStandaloneHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
431 externalEntityRefHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
432 externalEntityRefHandlerArg = parser;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
433 unknownEncodingHandler = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
434 buffer = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
435 bufferPtr = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
436 bufferEnd = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
437 parseEndByteIndex = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
438 parseEndPtr = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
439 bufferLim = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
440 declElementType = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
441 declAttributeId = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
442 declEntity = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
443 declNotationName = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
444 declNotationPublicId = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
445 memset(&position, 0, sizeof(POSITION));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
446 errorCode = XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
447 eventPtr = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
448 eventEndPtr = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
449 positionPtr = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
450 openInternalEntities = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
451 tagLevel = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
452 tagStack = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
453 freeTagList = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
454 freeBindingList = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
455 inheritedBindings = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
456 attsSize = INIT_ATTS_SIZE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
457 atts = malloc(attsSize * sizeof(ATTRIBUTE));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
458 nSpecifiedAtts = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
459 dataBuf = malloc(INIT_DATA_BUF_SIZE * sizeof(XML_Char));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
460 groupSize = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
461 groupConnector = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
462 hadExternalDoctype = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
463 unknownEncodingMem = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
464 unknownEncodingRelease = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
465 unknownEncodingData = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
466 unknownEncodingHandlerData = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
467 namespaceSeparator = '!';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
468 ns = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
469 poolInit(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
470 poolInit(&temp2Pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
471 protocolEncodingName = encodingName ? poolCopyString(&tempPool, encodingName) : 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
472 if (!dtdInit(&dtd) || !atts || !dataBuf
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
473 || (encodingName && !protocolEncodingName)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
474 XML_ParserFree(parser);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
475 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
476 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
477 dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
478 XmlInitEncoding(&initEncoding, &encoding, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
479 return parser;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
480 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
481
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
482 XML_Parser XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
483 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
484 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
485 const XML_Char implicitContext[] = {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
486 XML_T('x'), XML_T('m'), XML_T('l'), XML_T('='),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
487 XML_T('h'), XML_T('t'), XML_T('t'), XML_T('p'), XML_T(':'),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
488 XML_T('/'), XML_T('/'), XML_T('w'), XML_T('w'), XML_T('w'),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
489 XML_T('.'), XML_T('w'), XML_T('3'),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
490 XML_T('.'), XML_T('o'), XML_T('r'), XML_T('g'),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
491 XML_T('/'), XML_T('X'), XML_T('M'), XML_T('L'),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
492 XML_T('/'), XML_T('1'), XML_T('9'), XML_T('9'), XML_T('8'),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
493 XML_T('/'), XML_T('n'), XML_T('a'), XML_T('m'), XML_T('e'),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
494 XML_T('s'), XML_T('p'), XML_T('a'), XML_T('c'), XML_T('e'),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
495 XML_T('\0')
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
496 };
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
497
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
498 XML_Parser parser = XML_ParserCreate(encodingName);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
499 if (parser) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
500 XmlInitEncodingNS(&initEncoding, &encoding, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
501 ns = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
502 namespaceSeparator = nsSep;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
503 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
504 if (!setContext(parser, implicitContext)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
505 XML_ParserFree(parser);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
506 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
507 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
508 return parser;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
509 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
510
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
511 int XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
512 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
513 if (!encodingName)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
514 protocolEncodingName = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
515 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
516 protocolEncodingName = poolCopyString(&tempPool, encodingName);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
517 if (!protocolEncodingName)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
518 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
519 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
520 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
521 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
522
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
523 XML_Parser XML_ExternalEntityParserCreate(XML_Parser oldParser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
524 const XML_Char *context,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
525 const XML_Char *encodingName)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
526 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
527 XML_Parser parser = oldParser;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
528 DTD *oldDtd = &dtd;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
529 XML_StartElementHandler oldStartElementHandler = startElementHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
530 XML_EndElementHandler oldEndElementHandler = endElementHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
531 XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
532 XML_ProcessingInstructionHandler oldProcessingInstructionHandler = processingInstructionHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
533 XML_CommentHandler oldCommentHandler = commentHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
534 XML_StartCdataSectionHandler oldStartCdataSectionHandler = startCdataSectionHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
535 XML_EndCdataSectionHandler oldEndCdataSectionHandler = endCdataSectionHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
536 XML_DefaultHandler oldDefaultHandler = defaultHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
537 XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler = startNamespaceDeclHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
538 XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler = endNamespaceDeclHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
539 XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
540 XML_ExternalEntityRefHandler oldExternalEntityRefHandler = externalEntityRefHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
541 XML_UnknownEncodingHandler oldUnknownEncodingHandler = unknownEncodingHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
542 void *oldUserData = userData;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
543 void *oldHandlerArg = handlerArg;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
544 int oldDefaultExpandInternalEntities = defaultExpandInternalEntities;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
545 void *oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
546
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
547 parser = (ns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
548 ? XML_ParserCreateNS(encodingName, namespaceSeparator)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
549 : XML_ParserCreate(encodingName));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
550 if (!parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
551 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
552 startElementHandler = oldStartElementHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
553 endElementHandler = oldEndElementHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
554 characterDataHandler = oldCharacterDataHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
555 processingInstructionHandler = oldProcessingInstructionHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
556 commentHandler = oldCommentHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
557 startCdataSectionHandler = oldStartCdataSectionHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
558 endCdataSectionHandler = oldEndCdataSectionHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
559 defaultHandler = oldDefaultHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
560 startNamespaceDeclHandler = oldStartNamespaceDeclHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
561 endNamespaceDeclHandler = oldEndNamespaceDeclHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
562 notStandaloneHandler = oldNotStandaloneHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
563 externalEntityRefHandler = oldExternalEntityRefHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
564 unknownEncodingHandler = oldUnknownEncodingHandler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
565 userData = oldUserData;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
566 if (oldUserData == oldHandlerArg)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
567 handlerArg = userData;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
568 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
569 handlerArg = parser;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
570 if (oldExternalEntityRefHandlerArg != oldParser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
571 externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
572 defaultExpandInternalEntities = oldDefaultExpandInternalEntities;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
573 if (!dtdCopy(&dtd, oldDtd) || !setContext(parser, context)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
574 XML_ParserFree(parser);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
575 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
576 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
577 processor = externalEntityInitProcessor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
578 return parser;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
579 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
580
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
581 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
582 void destroyBindings(BINDING *bindings)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
583 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
584 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
585 BINDING *b = bindings;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
586 if (!b)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
587 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
588 bindings = b->nextTagBinding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
589 free(b->uri);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
590 free(b);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
591 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
592 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
593
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
594 void XML_ParserFree(XML_Parser parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
595 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
596 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
597 TAG *p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
598 if (tagStack == 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
599 if (freeTagList == 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
600 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
601 tagStack = freeTagList;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
602 freeTagList = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
603 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
604 p = tagStack;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
605 tagStack = tagStack->parent;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
606 free(p->buf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
607 destroyBindings(p->bindings);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
608 free(p);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
609 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
610 destroyBindings(freeBindingList);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
611 destroyBindings(inheritedBindings);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
612 poolDestroy(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
613 poolDestroy(&temp2Pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
614 dtdDestroy(&dtd);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
615 free((void *)atts);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
616 free(groupConnector);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
617 free(buffer);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
618 free(dataBuf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
619 free(unknownEncodingMem);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
620 if (unknownEncodingRelease)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
621 unknownEncodingRelease(unknownEncodingData);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
622 free(parser);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
623 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
624
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
625 void XML_UseParserAsHandlerArg(XML_Parser parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
626 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
627 handlerArg = parser;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
628 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
629
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
630 void XML_SetUserData(XML_Parser parser, void *p)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
631 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
632 if (handlerArg == userData)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
633 handlerArg = userData = p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
634 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
635 userData = p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
636 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
637
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
638 int XML_SetBase(XML_Parser parser, const XML_Char *p)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
639 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
640 if (p) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
641 p = poolCopyString(&dtd.pool, p);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
642 if (!p)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
643 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
644 dtd.base = p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
645 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
646 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
647 dtd.base = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
648 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
649 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
650
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
651 const XML_Char *XML_GetBase(XML_Parser parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
652 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
653 return dtd.base;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
654 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
655
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
656 int XML_GetSpecifiedAttributeCount(XML_Parser parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
657 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
658 return nSpecifiedAtts;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
659 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
660
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
661 void XML_SetElementHandler(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
662 XML_StartElementHandler start,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
663 XML_EndElementHandler end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
664 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
665 startElementHandler = start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
666 endElementHandler = end;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
667 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
668
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
669 void XML_SetCharacterDataHandler(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
670 XML_CharacterDataHandler handler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
671 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
672 characterDataHandler = handler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
673 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
674
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
675 void XML_SetProcessingInstructionHandler(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
676 XML_ProcessingInstructionHandler handler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
677 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
678 processingInstructionHandler = handler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
679 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
680
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
681 void XML_SetCommentHandler(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
682 XML_CommentHandler handler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
683 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
684 commentHandler = handler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
685 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
686
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
687 void XML_SetCdataSectionHandler(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
688 XML_StartCdataSectionHandler start,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
689 XML_EndCdataSectionHandler end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
690 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
691 startCdataSectionHandler = start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
692 endCdataSectionHandler = end;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
693 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
694
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
695 void XML_SetDefaultHandler(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
696 XML_DefaultHandler handler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
697 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
698 defaultHandler = handler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
699 defaultExpandInternalEntities = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
700 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
701
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
702 void XML_SetDefaultHandlerExpand(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
703 XML_DefaultHandler handler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
704 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
705 defaultHandler = handler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
706 defaultExpandInternalEntities = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
707 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
708
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
709 void XML_SetUnparsedEntityDeclHandler(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
710 XML_UnparsedEntityDeclHandler handler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
711 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
712 unparsedEntityDeclHandler = handler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
713 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
714
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
715 void XML_SetNotationDeclHandler(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
716 XML_NotationDeclHandler handler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
717 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
718 notationDeclHandler = handler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
719 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
720
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
721 void XML_SetNamespaceDeclHandler(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
722 XML_StartNamespaceDeclHandler start,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
723 XML_EndNamespaceDeclHandler end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
724 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
725 startNamespaceDeclHandler = start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
726 endNamespaceDeclHandler = end;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
727 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
728
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
729 void XML_SetNotStandaloneHandler(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
730 XML_NotStandaloneHandler handler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
731 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
732 notStandaloneHandler = handler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
733 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
734
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
735 void XML_SetExternalEntityRefHandler(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
736 XML_ExternalEntityRefHandler handler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
737 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
738 externalEntityRefHandler = handler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
739 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
740
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
741 void XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
742 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
743 if (arg)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
744 externalEntityRefHandlerArg = arg;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
745 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
746 externalEntityRefHandlerArg = parser;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
747 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
748
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
749 void XML_SetUnknownEncodingHandler(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
750 XML_UnknownEncodingHandler handler,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
751 void *data)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
752 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
753 unknownEncodingHandler = handler;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
754 unknownEncodingHandlerData = data;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
755 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
756
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
757 int XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
758 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
759 if (len == 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
760 if (!isFinal)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
761 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
762 positionPtr = bufferPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
763 errorCode = processor(parser, bufferPtr, parseEndPtr = bufferEnd, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
764 if (errorCode == XML_ERROR_NONE)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
765 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
766 eventEndPtr = eventPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
767 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
768 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
769 else if (bufferPtr == bufferEnd) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
770 const char *end;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
771 int nLeftOver;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
772 parseEndByteIndex += len;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
773 positionPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
774 if (isFinal) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
775 errorCode = processor(parser, s, parseEndPtr = s + len, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
776 if (errorCode == XML_ERROR_NONE)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
777 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
778 eventEndPtr = eventPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
779 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
780 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
781 errorCode = processor(parser, s, parseEndPtr = s + len, &end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
782 if (errorCode != XML_ERROR_NONE) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
783 eventEndPtr = eventPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
784 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
785 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
786 XmlUpdatePosition(encoding, positionPtr, end, &position);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
787 nLeftOver = s + len - end;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
788 if (nLeftOver) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
789 if (buffer == 0 || nLeftOver > bufferLim - buffer) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
790 /* FIXME avoid integer overflow */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
791 buffer = buffer == 0 ? malloc(len * 2) : realloc(buffer, len * 2);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
792 if (!buffer) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
793 errorCode = XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
794 eventPtr = eventEndPtr = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
795 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
796 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
797 bufferLim = buffer + len * 2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
798 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
799 memcpy(buffer, end, nLeftOver);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
800 bufferPtr = buffer;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
801 bufferEnd = buffer + nLeftOver;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
802 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
803 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
804 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
805 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
806 memcpy(XML_GetBuffer(parser, len), s, len);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
807 return XML_ParseBuffer(parser, len, isFinal);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
808 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
809 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
810
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
811 int XML_ParseBuffer(XML_Parser parser, int len, int isFinal)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
812 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
813 const char *start = bufferPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
814 positionPtr = start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
815 bufferEnd += len;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
816 parseEndByteIndex += len;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
817 errorCode = processor(parser, start, parseEndPtr = bufferEnd,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
818 isFinal ? (const char **)0 : &bufferPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
819 if (errorCode == XML_ERROR_NONE) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
820 if (!isFinal)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
821 XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
822 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
823 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
824 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
825 eventEndPtr = eventPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
826 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
827 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
828 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
829
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
830 void *XML_GetBuffer(XML_Parser parser, int len)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
831 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
832 if (len > bufferLim - bufferEnd) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
833 /* FIXME avoid integer overflow */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
834 int neededSize = len + (bufferEnd - bufferPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
835 if (neededSize <= bufferLim - buffer) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
836 memmove(buffer, bufferPtr, bufferEnd - bufferPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
837 bufferEnd = buffer + (bufferEnd - bufferPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
838 bufferPtr = buffer;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
839 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
840 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
841 char *newBuf;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
842 int bufferSize = bufferLim - bufferPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
843 if (bufferSize == 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
844 bufferSize = INIT_BUFFER_SIZE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
845 do {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
846 bufferSize *= 2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
847 } while (bufferSize < neededSize);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
848 newBuf = malloc(bufferSize);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
849 if (newBuf == 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
850 errorCode = XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
851 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
852 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
853 bufferLim = newBuf + bufferSize;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
854 if (bufferPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
855 memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
856 free(buffer);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
857 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
858 bufferEnd = newBuf + (bufferEnd - bufferPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
859 bufferPtr = buffer = newBuf;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
860 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
861 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
862 return bufferEnd;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
863 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
864
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
865 enum XML_Error XML_GetErrorCode(XML_Parser parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
866 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
867 return errorCode;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
868 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
869
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
870 long XML_GetCurrentByteIndex(XML_Parser parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
871 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
872 if (eventPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
873 return parseEndByteIndex - (parseEndPtr - eventPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
874 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
875 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
876
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
877 int XML_GetCurrentByteCount(XML_Parser parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
878 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
879 if (eventEndPtr && eventPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
880 return eventEndPtr - eventPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
881 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
882 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
883
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
884 int XML_GetCurrentLineNumber(XML_Parser parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
885 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
886 if (eventPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
887 XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
888 positionPtr = eventPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
889 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
890 return position.lineNumber + 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
891 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
892
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
893 int XML_GetCurrentColumnNumber(XML_Parser parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
894 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
895 if (eventPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
896 XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
897 positionPtr = eventPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
898 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
899 return position.columnNumber;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
900 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
901
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
902 void XML_DefaultCurrent(XML_Parser parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
903 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
904 if (defaultHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
905 if (openInternalEntities)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
906 reportDefault(parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
907 ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding(),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
908 openInternalEntities->internalEventPtr,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
909 openInternalEntities->internalEventEndPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
910 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
911 reportDefault(parser, encoding, eventPtr, eventEndPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
912 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
913 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
914
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
915 const XML_LChar *XML_ErrorString(int code)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
916 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
917 static const XML_LChar *message[] = {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
918 0,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
919 XML_T("out of memory"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
920 XML_T("syntax error"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
921 XML_T("no element found"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
922 XML_T("not well-formed"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
923 XML_T("unclosed token"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
924 XML_T("unclosed token"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
925 XML_T("mismatched tag"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
926 XML_T("duplicate attribute"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
927 XML_T("junk after document element"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
928 XML_T("illegal parameter entity reference"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
929 XML_T("undefined entity"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
930 XML_T("recursive entity reference"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
931 XML_T("asynchronous entity"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
932 XML_T("reference to invalid character number"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
933 XML_T("reference to binary entity"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
934 XML_T("reference to external entity in attribute"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
935 XML_T("xml processing instruction not at start of external entity"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
936 XML_T("unknown encoding"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
937 XML_T("encoding specified in XML declaration is incorrect"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
938 XML_T("unclosed CDATA section"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
939 XML_T("error in processing external entity reference"),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
940 XML_T("document is not standalone")
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
941 };
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
942 if (code > 0 && code < sizeof(message)/sizeof(message[0]))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
943 return message[code];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
944 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
945 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
946
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
947 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
948 enum XML_Error contentProcessor(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
949 const char *start,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
950 const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
951 const char **endPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
952 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
953 return doContent(parser, 0, encoding, start, end, endPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
954 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
955
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
956 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
957 enum XML_Error externalEntityInitProcessor(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
958 const char *start,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
959 const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
960 const char **endPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
961 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
962 enum XML_Error result = initializeEncoding(parser);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
963 if (result != XML_ERROR_NONE)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
964 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
965 processor = externalEntityInitProcessor2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
966 return externalEntityInitProcessor2(parser, start, end, endPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
967 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
968
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
969 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
970 enum XML_Error externalEntityInitProcessor2(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
971 const char *start,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
972 const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
973 const char **endPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
974 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
975 const char *next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
976 int tok = XmlContentTok(encoding, start, end, &next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
977 switch (tok) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
978 case XML_TOK_BOM:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
979 start = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
980 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
981 case XML_TOK_PARTIAL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
982 if (endPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
983 *endPtr = start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
984 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
985 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
986 eventPtr = start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
987 return XML_ERROR_UNCLOSED_TOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
988 case XML_TOK_PARTIAL_CHAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
989 if (endPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
990 *endPtr = start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
991 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
992 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
993 eventPtr = start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
994 return XML_ERROR_PARTIAL_CHAR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
995 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
996 processor = externalEntityInitProcessor3;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
997 return externalEntityInitProcessor3(parser, start, end, endPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
998 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
999
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1000 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1001 enum XML_Error externalEntityInitProcessor3(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1002 const char *start,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1003 const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1004 const char **endPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1005 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1006 const char *next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1007 int tok = XmlContentTok(encoding, start, end, &next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1008 switch (tok) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1009 case XML_TOK_XML_DECL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1010 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1011 enum XML_Error result = processXmlDecl(parser, 1, start, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1012 if (result != XML_ERROR_NONE)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1013 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1014 start = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1015 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1016 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1017 case XML_TOK_PARTIAL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1018 if (endPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1019 *endPtr = start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1020 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1021 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1022 eventPtr = start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1023 return XML_ERROR_UNCLOSED_TOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1024 case XML_TOK_PARTIAL_CHAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1025 if (endPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1026 *endPtr = start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1027 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1028 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1029 eventPtr = start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1030 return XML_ERROR_PARTIAL_CHAR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1031 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1032 processor = externalEntityContentProcessor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1033 tagLevel = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1034 return doContent(parser, 1, encoding, start, end, endPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1035 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1036
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1037 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1038 enum XML_Error externalEntityContentProcessor(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1039 const char *start,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1040 const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1041 const char **endPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1042 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1043 return doContent(parser, 1, encoding, start, end, endPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1044 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1045
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1046 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1047 doContent(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1048 int startTagLevel,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1049 const ENCODING *enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1050 const char *s,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1051 const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1052 const char **nextPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1053 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1054 const ENCODING *internalEnc = ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding();
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1055 const char **eventPP;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1056 const char **eventEndPP;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1057 if (enc == encoding) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1058 eventPP = &eventPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1059 eventEndPP = &eventEndPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1060 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1061 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1062 eventPP = &(openInternalEntities->internalEventPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1063 eventEndPP = &(openInternalEntities->internalEventEndPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1064 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1065 *eventPP = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1066 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1067 const char *next = s; /* XmlContentTok doesn't always set the last arg */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1068 int tok = XmlContentTok(enc, s, end, &next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1069 *eventEndPP = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1070 switch (tok) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1071 case XML_TOK_TRAILING_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1072 if (nextPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1073 *nextPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1074 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1075 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1076 *eventEndPP = end;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1077 if (characterDataHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1078 XML_Char c = 0xA;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1079 characterDataHandler(handlerArg, &c, 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1080 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1081 else if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1082 reportDefault(parser, enc, s, end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1083 if (startTagLevel == 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1084 return XML_ERROR_NO_ELEMENTS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1085 if (tagLevel != startTagLevel)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1086 return XML_ERROR_ASYNC_ENTITY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1087 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1088 case XML_TOK_NONE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1089 if (nextPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1090 *nextPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1091 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1092 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1093 if (startTagLevel > 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1094 if (tagLevel != startTagLevel)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1095 return XML_ERROR_ASYNC_ENTITY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1096 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1097 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1098 return XML_ERROR_NO_ELEMENTS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1099 case XML_TOK_INVALID:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1100 *eventPP = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1101 return XML_ERROR_INVALID_TOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1102 case XML_TOK_PARTIAL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1103 if (nextPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1104 *nextPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1105 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1106 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1107 return XML_ERROR_UNCLOSED_TOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1108 case XML_TOK_PARTIAL_CHAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1109 if (nextPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1110 *nextPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1111 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1112 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1113 return XML_ERROR_PARTIAL_CHAR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1114 case XML_TOK_ENTITY_REF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1115 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1116 const XML_Char *name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1117 ENTITY *entity;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1118 XML_Char ch = XmlPredefinedEntityName(enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1119 s + enc->minBytesPerChar,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1120 next - enc->minBytesPerChar);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1121 if (ch) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1122 if (characterDataHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1123 characterDataHandler(handlerArg, &ch, 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1124 else if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1125 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1126 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1127 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1128 name = poolStoreString(&dtd.pool, enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1129 s + enc->minBytesPerChar,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1130 next - enc->minBytesPerChar);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1131 if (!name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1132 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1133 entity = (ENTITY *)lookup(&dtd.generalEntities, name, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1134 poolDiscard(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1135 if (!entity) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1136 if (dtd.complete || dtd.standalone)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1137 return XML_ERROR_UNDEFINED_ENTITY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1138 if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1139 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1140 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1141 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1142 if (entity->open)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1143 return XML_ERROR_RECURSIVE_ENTITY_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1144 if (entity->notation)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1145 return XML_ERROR_BINARY_ENTITY_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1146 if (entity) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1147 if (entity->textPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1148 enum XML_Error result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1149 OPEN_INTERNAL_ENTITY openEntity;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1150 if (defaultHandler && !defaultExpandInternalEntities) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1151 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1152 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1153 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1154 entity->open = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1155 openEntity.next = openInternalEntities;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1156 openInternalEntities = &openEntity;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1157 openEntity.entity = entity;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1158 openEntity.internalEventPtr = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1159 openEntity.internalEventEndPtr = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1160 result = doContent(parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1161 tagLevel,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1162 internalEnc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1163 (char *)entity->textPtr,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1164 (char *)(entity->textPtr + entity->textLen),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1165 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1166 entity->open = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1167 openInternalEntities = openEntity.next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1168 if (result)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1169 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1170 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1171 else if (externalEntityRefHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1172 const XML_Char *context;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1173 entity->open = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1174 context = getContext(parser);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1175 entity->open = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1176 if (!context)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1177 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1178 if (!externalEntityRefHandler(externalEntityRefHandlerArg,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1179 context,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1180 dtd.base,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1181 entity->systemId,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1182 entity->publicId))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1183 return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1184 poolDiscard(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1185 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1186 else if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1187 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1188 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1189 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1190 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1191 case XML_TOK_START_TAG_WITH_ATTS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1192 if (!startElementHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1193 enum XML_Error result = storeAtts(parser, enc, s, 0, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1194 if (result)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1195 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1196 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1197 /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1198 case XML_TOK_START_TAG_NO_ATTS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1199 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1200 TAG *tag;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1201 if (freeTagList) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1202 tag = freeTagList;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1203 freeTagList = freeTagList->parent;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1204 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1205 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1206 tag = malloc(sizeof(TAG));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1207 if (!tag)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1208 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1209 tag->buf = malloc(INIT_TAG_BUF_SIZE);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1210 if (!tag->buf)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1211 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1212 tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1213 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1214 tag->bindings = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1215 tag->parent = tagStack;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1216 tagStack = tag;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1217 tag->name.localPart = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1218 tag->rawName = s + enc->minBytesPerChar;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1219 tag->rawNameLength = XmlNameLength(enc, tag->rawName);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1220 if (nextPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1221 /* Need to guarantee that:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1222 tag->buf + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)) <= tag->bufEnd - sizeof(XML_Char) */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1223 if (tag->rawNameLength + (int)(sizeof(XML_Char) - 1) + (int)sizeof(XML_Char) > tag->bufEnd - tag->buf) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1224 int bufSize = tag->rawNameLength * 4;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1225 bufSize = ROUND_UP(bufSize, sizeof(XML_Char));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1226 tag->buf = realloc(tag->buf, bufSize);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1227 if (!tag->buf)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1228 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1229 tag->bufEnd = tag->buf + bufSize;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1230 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1231 memcpy(tag->buf, tag->rawName, tag->rawNameLength);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1232 tag->rawName = tag->buf;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1233 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1234 ++tagLevel;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1235 if (startElementHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1236 enum XML_Error result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1237 XML_Char *toPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1238 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1239 const char *rawNameEnd = tag->rawName + tag->rawNameLength;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1240 const char *fromPtr = tag->rawName;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1241 int bufSize;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1242 if (nextPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1243 toPtr = (XML_Char *)(tag->buf + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1244 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1245 toPtr = (XML_Char *)tag->buf;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1246 tag->name.str = toPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1247 XmlConvert(enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1248 &fromPtr, rawNameEnd,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1249 (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1250 if (fromPtr == rawNameEnd)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1251 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1252 bufSize = (tag->bufEnd - tag->buf) << 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1253 tag->buf = realloc(tag->buf, bufSize);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1254 if (!tag->buf)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1255 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1256 tag->bufEnd = tag->buf + bufSize;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1257 if (nextPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1258 tag->rawName = tag->buf;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1259 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1260 *toPtr = XML_T('\0');
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1261 result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1262 if (result)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1263 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1264 startElementHandler(handlerArg, tag->name.str, (const XML_Char **)atts);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1265 poolClear(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1266 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1267 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1268 tag->name.str = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1269 if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1270 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1271 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1272 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1273 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1274 case XML_TOK_EMPTY_ELEMENT_WITH_ATTS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1275 if (!startElementHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1276 enum XML_Error result = storeAtts(parser, enc, s, 0, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1277 if (result)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1278 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1279 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1280 /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1281 case XML_TOK_EMPTY_ELEMENT_NO_ATTS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1282 if (startElementHandler || endElementHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1283 const char *rawName = s + enc->minBytesPerChar;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1284 enum XML_Error result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1285 BINDING *bindings = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1286 TAG_NAME name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1287 name.str = poolStoreString(&tempPool, enc, rawName,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1288 rawName + XmlNameLength(enc, rawName));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1289 if (!name.str)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1290 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1291 poolFinish(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1292 result = storeAtts(parser, enc, s, &name, &bindings);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1293 if (result)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1294 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1295 poolFinish(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1296 if (startElementHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1297 startElementHandler(handlerArg, name.str, (const XML_Char **)atts);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1298 if (endElementHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1299 if (startElementHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1300 *eventPP = *eventEndPP;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1301 endElementHandler(handlerArg, name.str);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1302 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1303 poolClear(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1304 while (bindings) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1305 BINDING *b = bindings;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1306 if (endNamespaceDeclHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1307 endNamespaceDeclHandler(handlerArg, b->prefix->name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1308 bindings = bindings->nextTagBinding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1309 b->nextTagBinding = freeBindingList;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1310 freeBindingList = b;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1311 b->prefix->binding = b->prevPrefixBinding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1312 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1313 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1314 else if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1315 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1316 if (tagLevel == 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1317 return epilogProcessor(parser, next, end, nextPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1318 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1319 case XML_TOK_END_TAG:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1320 if (tagLevel == startTagLevel)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1321 return XML_ERROR_ASYNC_ENTITY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1322 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1323 int len;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1324 const char *rawName;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1325 TAG *tag = tagStack;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1326 tagStack = tag->parent;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1327 tag->parent = freeTagList;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1328 freeTagList = tag;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1329 rawName = s + enc->minBytesPerChar*2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1330 len = XmlNameLength(enc, rawName);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1331 if (len != tag->rawNameLength
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1332 || memcmp(tag->rawName, rawName, len) != 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1333 *eventPP = rawName;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1334 return XML_ERROR_TAG_MISMATCH;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1335 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1336 --tagLevel;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1337 if (endElementHandler && tag->name.str) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1338 if (tag->name.localPart) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1339 XML_Char *to = (XML_Char *)tag->name.str + tag->name.uriLen;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1340 const XML_Char *from = tag->name.localPart;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1341 while ((*to++ = *from++) != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1342 ;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1343 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1344 endElementHandler(handlerArg, tag->name.str);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1345 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1346 else if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1347 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1348 while (tag->bindings) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1349 BINDING *b = tag->bindings;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1350 if (endNamespaceDeclHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1351 endNamespaceDeclHandler(handlerArg, b->prefix->name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1352 tag->bindings = tag->bindings->nextTagBinding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1353 b->nextTagBinding = freeBindingList;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1354 freeBindingList = b;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1355 b->prefix->binding = b->prevPrefixBinding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1356 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1357 if (tagLevel == 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1358 return epilogProcessor(parser, next, end, nextPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1359 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1360 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1361 case XML_TOK_CHAR_REF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1362 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1363 int n = XmlCharRefNumber(enc, s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1364 if (n < 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1365 return XML_ERROR_BAD_CHAR_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1366 if (characterDataHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1367 XML_Char buf[XML_ENCODE_MAX];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1368 characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1369 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1370 else if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1371 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1372 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1373 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1374 case XML_TOK_XML_DECL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1375 return XML_ERROR_MISPLACED_XML_PI;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1376 case XML_TOK_DATA_NEWLINE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1377 if (characterDataHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1378 XML_Char c = 0xA;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1379 characterDataHandler(handlerArg, &c, 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1380 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1381 else if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1382 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1383 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1384 case XML_TOK_CDATA_SECT_OPEN:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1385 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1386 enum XML_Error result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1387 if (startCdataSectionHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1388 startCdataSectionHandler(handlerArg);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1389 #if 0
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1390 /* Suppose you doing a transformation on a document that involves
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1391 changing only the character data. You set up a defaultHandler
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1392 and a characterDataHandler. The defaultHandler simply copies
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1393 characters through. The characterDataHandler does the transformation
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1394 and writes the characters out escaping them as necessary. This case
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1395 will fail to work if we leave out the following two lines (because &
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1396 and < inside CDATA sections will be incorrectly escaped).
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1397
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1398 However, now we have a start/endCdataSectionHandler, so it seems
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1399 easier to let the user deal with this. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1400
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1401 else if (characterDataHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1402 characterDataHandler(handlerArg, dataBuf, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1403 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1404 else if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1405 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1406 result = doCdataSection(parser, enc, &next, end, nextPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1407 if (!next) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1408 processor = cdataSectionProcessor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1409 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1410 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1411 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1412 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1413 case XML_TOK_TRAILING_RSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1414 if (nextPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1415 *nextPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1416 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1417 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1418 if (characterDataHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1419 if (MUST_CONVERT(enc, s)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1420 ICHAR *dataPtr = (ICHAR *)dataBuf;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1421 XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1422 characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1423 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1424 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1425 characterDataHandler(handlerArg,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1426 (XML_Char *)s,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1427 (XML_Char *)end - (XML_Char *)s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1428 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1429 else if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1430 reportDefault(parser, enc, s, end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1431 if (startTagLevel == 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1432 *eventPP = end;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1433 return XML_ERROR_NO_ELEMENTS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1434 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1435 if (tagLevel != startTagLevel) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1436 *eventPP = end;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1437 return XML_ERROR_ASYNC_ENTITY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1438 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1439 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1440 case XML_TOK_DATA_CHARS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1441 if (characterDataHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1442 if (MUST_CONVERT(enc, s)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1443 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1444 ICHAR *dataPtr = (ICHAR *)dataBuf;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1445 XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1446 *eventEndPP = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1447 characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1448 if (s == next)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1449 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1450 *eventPP = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1451 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1452 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1453 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1454 characterDataHandler(handlerArg,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1455 (XML_Char *)s,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1456 (XML_Char *)next - (XML_Char *)s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1457 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1458 else if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1459 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1460 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1461 case XML_TOK_PI:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1462 if (!reportProcessingInstruction(parser, enc, s, next))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1463 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1464 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1465 case XML_TOK_COMMENT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1466 if (!reportComment(parser, enc, s, next))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1467 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1468 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1469 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1470 if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1471 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1472 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1473 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1474 *eventPP = s = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1475 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1476 /* not reached */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1477 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1478
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1479 /* If tagNamePtr is non-null, build a real list of attributes,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1480 otherwise just check the attributes for well-formedness. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1481
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1482 static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1483 const char *s, TAG_NAME *tagNamePtr,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1484 BINDING **bindingsPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1485 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1486 ELEMENT_TYPE *elementType = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1487 int nDefaultAtts = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1488 const XML_Char **appAtts;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1489 int attIndex = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1490 int i;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1491 int n;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1492 int nPrefixes = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1493 BINDING *binding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1494 const XML_Char *localPart;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1495
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1496 if (tagNamePtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1497 elementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, tagNamePtr->str, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1498 if (!elementType) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1499 tagNamePtr->str = poolCopyString(&dtd.pool, tagNamePtr->str);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1500 if (!tagNamePtr->str)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1501 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1502 elementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, tagNamePtr->str, sizeof(ELEMENT_TYPE));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1503 if (!elementType)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1504 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1505 if (ns && !setElementTypePrefix(parser, elementType))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1506 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1507 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1508 nDefaultAtts = elementType->nDefaultAtts;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1509 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1510 n = XmlGetAttributes(enc, s, attsSize, atts);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1511 if (n + nDefaultAtts > attsSize) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1512 int oldAttsSize = attsSize;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1513 attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1514 atts = realloc((void *)atts, attsSize * sizeof(ATTRIBUTE));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1515 if (!atts)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1516 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1517 if (n > oldAttsSize)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1518 XmlGetAttributes(enc, s, n, atts);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1519 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1520 appAtts = (const XML_Char **)atts;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1521 for (i = 0; i < n; i++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1522 ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1523 atts[i].name
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1524 + XmlNameLength(enc, atts[i].name));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1525 if (!attId)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1526 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1527 if ((attId->name)[-1]) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1528 if (enc == encoding)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1529 eventPtr = atts[i].name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1530 return XML_ERROR_DUPLICATE_ATTRIBUTE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1531 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1532 (attId->name)[-1] = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1533 appAtts[attIndex++] = attId->name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1534 if (!atts[i].normalized) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1535 enum XML_Error result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1536 int isCdata = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1537
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1538 if (attId->maybeTokenized) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1539 int j;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1540 for (j = 0; j < nDefaultAtts; j++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1541 if (attId == elementType->defaultAtts[j].id) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1542 isCdata = elementType->defaultAtts[j].isCdata;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1543 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1544 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1545 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1546 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1547
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1548 result = storeAttributeValue(parser, enc, isCdata,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1549 atts[i].valuePtr, atts[i].valueEnd,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1550 &tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1551 if (result)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1552 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1553 if (tagNamePtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1554 appAtts[attIndex] = poolStart(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1555 poolFinish(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1556 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1557 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1558 poolDiscard(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1559 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1560 else if (tagNamePtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1561 appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr, atts[i].valueEnd);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1562 if (appAtts[attIndex] == 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1563 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1564 poolFinish(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1565 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1566 if (attId->prefix && tagNamePtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1567 if (attId->xmlns) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1568 if (!addBinding(parser, attId->prefix, attId, appAtts[attIndex], bindingsPtr))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1569 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1570 --attIndex;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1571 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1572 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1573 attIndex++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1574 nPrefixes++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1575 (attId->name)[-1] = 2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1576 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1577 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1578 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1579 attIndex++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1580 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1581 nSpecifiedAtts = attIndex;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1582 if (tagNamePtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1583 int j;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1584 for (j = 0; j < nDefaultAtts; j++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1585 const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + j;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1586 if (!(da->id->name)[-1] && da->value) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1587 if (da->id->prefix) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1588 if (da->id->xmlns) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1589 if (!addBinding(parser, da->id->prefix, da->id, da->value, bindingsPtr))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1590 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1591 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1592 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1593 (da->id->name)[-1] = 2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1594 nPrefixes++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1595 appAtts[attIndex++] = da->id->name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1596 appAtts[attIndex++] = da->value;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1597 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1598 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1599 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1600 (da->id->name)[-1] = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1601 appAtts[attIndex++] = da->id->name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1602 appAtts[attIndex++] = da->value;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1603 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1604 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1605 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1606 appAtts[attIndex] = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1607 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1608 i = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1609 if (nPrefixes) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1610 for (; i < attIndex; i += 2) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1611 if (appAtts[i][-1] == 2) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1612 ATTRIBUTE_ID *id;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1613 ((XML_Char *)(appAtts[i]))[-1] = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1614 id = (ATTRIBUTE_ID *)lookup(&dtd.attributeIds, appAtts[i], 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1615 if (id->prefix->binding) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1616 int j;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1617 const BINDING *b = id->prefix->binding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1618 const XML_Char *s = appAtts[i];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1619 for (j = 0; j < b->uriLen; j++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1620 if (!poolAppendChar(&tempPool, b->uri[j]))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1621 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1622 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1623 while (*s++ != ':')
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1624 ;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1625 do {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1626 if (!poolAppendChar(&tempPool, *s))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1627 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1628 } while (*s++);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1629 appAtts[i] = poolStart(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1630 poolFinish(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1631 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1632 if (!--nPrefixes)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1633 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1634 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1635 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1636 ((XML_Char *)(appAtts[i]))[-1] = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1637 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1638 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1639 for (; i < attIndex; i += 2)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1640 ((XML_Char *)(appAtts[i]))[-1] = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1641 if (!tagNamePtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1642 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1643 for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1644 binding->attId->name[-1] = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1645 if (elementType->prefix) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1646 binding = elementType->prefix->binding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1647 if (!binding)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1648 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1649 localPart = tagNamePtr->str;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1650 while (*localPart++ != XML_T(':'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1651 ;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1652 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1653 else if (dtd.defaultPrefix.binding) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1654 binding = dtd.defaultPrefix.binding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1655 localPart = tagNamePtr->str;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1656 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1657 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1658 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1659 tagNamePtr->localPart = localPart;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1660 tagNamePtr->uriLen = binding->uriLen;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1661 i = binding->uriLen;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1662 do {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1663 if (i == binding->uriAlloc) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1664 binding->uri = realloc(binding->uri, binding->uriAlloc *= 2);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1665 if (!binding->uri)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1666 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1667 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1668 binding->uri[i++] = *localPart;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1669 } while (*localPart++);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1670 tagNamePtr->str = binding->uri;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1671 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1672 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1673
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1674 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1675 int addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, const XML_Char *uri, BINDING **bindingsPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1676 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1677 BINDING *b;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1678 int len;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1679 for (len = 0; uri[len]; len++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1680 ;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1681 if (namespaceSeparator)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1682 len++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1683 if (freeBindingList) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1684 b = freeBindingList;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1685 if (len > b->uriAlloc) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1686 b->uri = realloc(b->uri, len + EXPAND_SPARE);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1687 if (!b->uri)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1688 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1689 b->uriAlloc = len + EXPAND_SPARE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1690 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1691 freeBindingList = b->nextTagBinding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1692 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1693 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1694 b = malloc(sizeof(BINDING));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1695 if (!b)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1696 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1697 b->uri = malloc(sizeof(XML_Char) * len + EXPAND_SPARE);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1698 if (!b->uri) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1699 free(b);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1700 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1701 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1702 b->uriAlloc = len;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1703 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1704 b->uriLen = len;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1705 memcpy(b->uri, uri, len * sizeof(XML_Char));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1706 if (namespaceSeparator)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1707 b->uri[len - 1] = namespaceSeparator;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1708 b->prefix = prefix;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1709 b->attId = attId;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1710 b->prevPrefixBinding = prefix->binding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1711 if (*uri == XML_T('\0') && prefix == &dtd.defaultPrefix)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1712 prefix->binding = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1713 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1714 prefix->binding = b;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1715 b->nextTagBinding = *bindingsPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1716 *bindingsPtr = b;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1717 if (startNamespaceDeclHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1718 startNamespaceDeclHandler(handlerArg, prefix->name,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1719 prefix->binding ? uri : 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1720 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1721 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1722
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1723 /* The idea here is to avoid using stack for each CDATA section when
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1724 the whole file is parsed with one call. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1725
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1726 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1727 enum XML_Error cdataSectionProcessor(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1728 const char *start,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1729 const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1730 const char **endPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1731 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1732 enum XML_Error result = doCdataSection(parser, encoding, &start, end, endPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1733 if (start) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1734 processor = contentProcessor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1735 return contentProcessor(parser, start, end, endPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1736 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1737 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1738 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1739
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1740 /* startPtr gets set to non-null is the section is closed, and to null if
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1741 the section is not yet closed. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1742
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1743 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1744 enum XML_Error doCdataSection(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1745 const ENCODING *enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1746 const char **startPtr,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1747 const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1748 const char **nextPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1749 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1750 const char *s = *startPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1751 const char **eventPP;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1752 const char **eventEndPP;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1753 if (enc == encoding) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1754 eventPP = &eventPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1755 *eventPP = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1756 eventEndPP = &eventEndPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1757 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1758 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1759 eventPP = &(openInternalEntities->internalEventPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1760 eventEndPP = &(openInternalEntities->internalEventEndPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1761 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1762 *eventPP = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1763 *startPtr = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1764 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1765 const char *next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1766 int tok = XmlCdataSectionTok(enc, s, end, &next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1767 *eventEndPP = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1768 switch (tok) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1769 case XML_TOK_CDATA_SECT_CLOSE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1770 if (endCdataSectionHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1771 endCdataSectionHandler(handlerArg);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1772 #if 0
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1773 /* see comment under XML_TOK_CDATA_SECT_OPEN */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1774 else if (characterDataHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1775 characterDataHandler(handlerArg, dataBuf, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1776 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1777 else if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1778 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1779 *startPtr = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1780 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1781 case XML_TOK_DATA_NEWLINE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1782 if (characterDataHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1783 XML_Char c = 0xA;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1784 characterDataHandler(handlerArg, &c, 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1785 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1786 else if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1787 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1788 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1789 case XML_TOK_DATA_CHARS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1790 if (characterDataHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1791 if (MUST_CONVERT(enc, s)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1792 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1793 ICHAR *dataPtr = (ICHAR *)dataBuf;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1794 XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1795 *eventEndPP = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1796 characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1797 if (s == next)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1798 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1799 *eventPP = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1800 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1801 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1802 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1803 characterDataHandler(handlerArg,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1804 (XML_Char *)s,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1805 (XML_Char *)next - (XML_Char *)s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1806 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1807 else if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1808 reportDefault(parser, enc, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1809 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1810 case XML_TOK_INVALID:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1811 *eventPP = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1812 return XML_ERROR_INVALID_TOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1813 case XML_TOK_PARTIAL_CHAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1814 if (nextPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1815 *nextPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1816 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1817 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1818 return XML_ERROR_PARTIAL_CHAR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1819 case XML_TOK_PARTIAL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1820 case XML_TOK_NONE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1821 if (nextPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1822 *nextPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1823 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1824 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1825 return XML_ERROR_UNCLOSED_CDATA_SECTION;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1826 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1827 abort();
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1828 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1829 *eventPP = s = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1830 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1831 /* not reached */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1832 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1833
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1834 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1835 initializeEncoding(XML_Parser parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1836 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1837 const char *s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1838 #ifdef XML_UNICODE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1839 char encodingBuf[128];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1840 if (!protocolEncodingName)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1841 s = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1842 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1843 int i;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1844 for (i = 0; protocolEncodingName[i]; i++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1845 if (i == sizeof(encodingBuf) - 1
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1846 || protocolEncodingName[i] >= 0x80
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1847 || protocolEncodingName[i] < 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1848 encodingBuf[0] = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1849 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1850 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1851 encodingBuf[i] = (char)protocolEncodingName[i];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1852 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1853 encodingBuf[i] = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1854 s = encodingBuf;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1855 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1856 #else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1857 s = protocolEncodingName;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1858 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1859 if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1860 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1861 return handleUnknownEncoding(parser, protocolEncodingName);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1862 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1863
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1864 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1865 processXmlDecl(XML_Parser parser, int isGeneralTextEntity,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1866 const char *s, const char *next)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1867 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1868 const char *encodingName = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1869 const ENCODING *newEncoding = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1870 const char *version;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1871 int standalone = -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1872 if (!(ns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1873 ? XmlParseXmlDeclNS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1874 : XmlParseXmlDecl)(isGeneralTextEntity,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1875 encoding,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1876 s,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1877 next,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1878 &eventPtr,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1879 &version,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1880 &encodingName,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1881 &newEncoding,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1882 &standalone))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1883 return XML_ERROR_SYNTAX;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1884 if (!isGeneralTextEntity && standalone == 1)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1885 dtd.standalone = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1886 if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1887 reportDefault(parser, encoding, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1888 if (!protocolEncodingName) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1889 if (newEncoding) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1890 if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1891 eventPtr = encodingName;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1892 return XML_ERROR_INCORRECT_ENCODING;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1893 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1894 encoding = newEncoding;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1895 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1896 else if (encodingName) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1897 enum XML_Error result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1898 const XML_Char *s = poolStoreString(&tempPool,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1899 encoding,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1900 encodingName,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1901 encodingName
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1902 + XmlNameLength(encoding, encodingName));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1903 if (!s)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1904 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1905 result = handleUnknownEncoding(parser, s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1906 poolDiscard(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1907 if (result == XML_ERROR_UNKNOWN_ENCODING)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1908 eventPtr = encodingName;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1909 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1910 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1911 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1912 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1913 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1914
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1915 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1916 handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1917 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1918 if (unknownEncodingHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1919 XML_Encoding info;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1920 int i;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1921 for (i = 0; i < 256; i++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1922 info.map[i] = -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1923 info.convert = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1924 info.data = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1925 info.release = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1926 if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, &info)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1927 ENCODING *enc;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1928 unknownEncodingMem = malloc(XmlSizeOfUnknownEncoding());
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1929 if (!unknownEncodingMem) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1930 if (info.release)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1931 info.release(info.data);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1932 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1933 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1934 enc = (ns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1935 ? XmlInitUnknownEncodingNS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1936 : XmlInitUnknownEncoding)(unknownEncodingMem,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1937 info.map,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1938 info.convert,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1939 info.data);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1940 if (enc) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1941 unknownEncodingData = info.data;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1942 unknownEncodingRelease = info.release;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1943 encoding = enc;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1944 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1945 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1946 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1947 if (info.release)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1948 info.release(info.data);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1949 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1950 return XML_ERROR_UNKNOWN_ENCODING;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1951 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1952
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1953 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1954 prologInitProcessor(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1955 const char *s,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1956 const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1957 const char **nextPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1958 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1959 enum XML_Error result = initializeEncoding(parser);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1960 if (result != XML_ERROR_NONE)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1961 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1962 processor = prologProcessor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1963 return prologProcessor(parser, s, end, nextPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1964 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1965
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1966 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1967 prologProcessor(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1968 const char *s,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1969 const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1970 const char **nextPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1971 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1972 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1973 const char *next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1974 int tok = XmlPrologTok(encoding, s, end, &next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1975 if (tok <= 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1976 if (nextPtr != 0 && tok != XML_TOK_INVALID) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1977 *nextPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1978 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1979 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1980 switch (tok) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1981 case XML_TOK_INVALID:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1982 eventPtr = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1983 return XML_ERROR_INVALID_TOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1984 case XML_TOK_NONE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1985 return XML_ERROR_NO_ELEMENTS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1986 case XML_TOK_PARTIAL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1987 return XML_ERROR_UNCLOSED_TOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1988 case XML_TOK_PARTIAL_CHAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1989 return XML_ERROR_PARTIAL_CHAR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1990 case XML_TOK_TRAILING_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1991 eventPtr = s + encoding->minBytesPerChar;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1992 return XML_ERROR_NO_ELEMENTS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1993 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1994 abort();
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1995 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1996 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1997 switch (XmlTokenRole(&prologState, tok, s, next, encoding)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1998 case XML_ROLE_XML_DECL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1999 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2000 enum XML_Error result = processXmlDecl(parser, 0, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2001 if (result != XML_ERROR_NONE)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2002 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2003 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2004 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2005 case XML_ROLE_DOCTYPE_SYSTEM_ID:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2006 if (!dtd.standalone
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2007 && notStandaloneHandler
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2008 && !notStandaloneHandler(handlerArg))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2009 return XML_ERROR_NOT_STANDALONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2010 hadExternalDoctype = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2011 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2012 case XML_ROLE_DOCTYPE_PUBLIC_ID:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2013 case XML_ROLE_ENTITY_PUBLIC_ID:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2014 if (!XmlIsPublicId(encoding, s, next, &eventPtr))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2015 return XML_ERROR_SYNTAX;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2016 if (declEntity) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2017 XML_Char *tem = poolStoreString(&dtd.pool,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2018 encoding,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2019 s + encoding->minBytesPerChar,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2020 next - encoding->minBytesPerChar);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2021 if (!tem)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2022 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2023 normalizePublicId(tem);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2024 declEntity->publicId = tem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2025 poolFinish(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2026 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2027 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2028 case XML_ROLE_INSTANCE_START:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2029 processor = contentProcessor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2030 if (hadExternalDoctype)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2031 dtd.complete = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2032 return contentProcessor(parser, s, end, nextPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2033 case XML_ROLE_ATTLIST_ELEMENT_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2034 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2035 const XML_Char *name = poolStoreString(&dtd.pool, encoding, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2036 if (!name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2037 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2038 declElementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, name, sizeof(ELEMENT_TYPE));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2039 if (!declElementType)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2040 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2041 if (declElementType->name != name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2042 poolDiscard(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2043 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2044 poolFinish(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2045 if (!setElementTypePrefix(parser, declElementType))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2046 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2047 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2048 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2049 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2050 case XML_ROLE_ATTRIBUTE_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2051 declAttributeId = getAttributeId(parser, encoding, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2052 if (!declAttributeId)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2053 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2054 declAttributeIsCdata = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2055 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2056 case XML_ROLE_ATTRIBUTE_TYPE_CDATA:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2057 declAttributeIsCdata = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2058 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2059 case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2060 case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2061 if (dtd.complete
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2062 && !defineAttribute(declElementType, declAttributeId, declAttributeIsCdata, 0))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2063 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2064 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2065 case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2066 case XML_ROLE_FIXED_ATTRIBUTE_VALUE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2067 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2068 const XML_Char *attVal;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2069 enum XML_Error result
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2070 = storeAttributeValue(parser, encoding, declAttributeIsCdata,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2071 s + encoding->minBytesPerChar,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2072 next - encoding->minBytesPerChar,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2073 &dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2074 if (result)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2075 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2076 attVal = poolStart(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2077 poolFinish(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2078 if (dtd.complete
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2079 && !defineAttribute(declElementType, declAttributeId, declAttributeIsCdata, attVal))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2080 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2081 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2082 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2083 case XML_ROLE_ENTITY_VALUE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2084 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2085 enum XML_Error result = storeEntityValue(parser, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2086 if (result != XML_ERROR_NONE)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2087 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2088 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2089 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2090 case XML_ROLE_ENTITY_SYSTEM_ID:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2091 if (declEntity) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2092 declEntity->systemId = poolStoreString(&dtd.pool, encoding,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2093 s + encoding->minBytesPerChar,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2094 next - encoding->minBytesPerChar);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2095 if (!declEntity->systemId)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2096 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2097 declEntity->base = dtd.base;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2098 poolFinish(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2099 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2100 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2101 case XML_ROLE_ENTITY_NOTATION_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2102 if (declEntity) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2103 declEntity->notation = poolStoreString(&dtd.pool, encoding, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2104 if (!declEntity->notation)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2105 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2106 poolFinish(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2107 if (unparsedEntityDeclHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2108 eventPtr = eventEndPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2109 unparsedEntityDeclHandler(handlerArg,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2110 declEntity->name,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2111 declEntity->base,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2112 declEntity->systemId,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2113 declEntity->publicId,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2114 declEntity->notation);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2115 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2116
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2117 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2118 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2119 case XML_ROLE_GENERAL_ENTITY_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2120 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2121 const XML_Char *name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2122 if (XmlPredefinedEntityName(encoding, s, next)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2123 declEntity = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2124 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2125 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2126 name = poolStoreString(&dtd.pool, encoding, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2127 if (!name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2128 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2129 if (dtd.complete) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2130 declEntity = (ENTITY *)lookup(&dtd.generalEntities, name, sizeof(ENTITY));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2131 if (!declEntity)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2132 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2133 if (declEntity->name != name) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2134 poolDiscard(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2135 declEntity = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2136 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2137 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2138 poolFinish(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2139 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2140 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2141 poolDiscard(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2142 declEntity = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2143 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2144 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2145 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2146 case XML_ROLE_PARAM_ENTITY_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2147 declEntity = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2148 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2149 case XML_ROLE_NOTATION_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2150 declNotationPublicId = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2151 declNotationName = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2152 if (notationDeclHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2153 declNotationName = poolStoreString(&tempPool, encoding, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2154 if (!declNotationName)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2155 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2156 poolFinish(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2157 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2158 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2159 case XML_ROLE_NOTATION_PUBLIC_ID:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2160 if (!XmlIsPublicId(encoding, s, next, &eventPtr))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2161 return XML_ERROR_SYNTAX;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2162 if (declNotationName) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2163 XML_Char *tem = poolStoreString(&tempPool,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2164 encoding,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2165 s + encoding->minBytesPerChar,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2166 next - encoding->minBytesPerChar);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2167 if (!tem)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2168 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2169 normalizePublicId(tem);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2170 declNotationPublicId = tem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2171 poolFinish(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2172 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2173 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2174 case XML_ROLE_NOTATION_SYSTEM_ID:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2175 if (declNotationName && notationDeclHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2176 const XML_Char *systemId
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2177 = poolStoreString(&tempPool, encoding,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2178 s + encoding->minBytesPerChar,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2179 next - encoding->minBytesPerChar);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2180 if (!systemId)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2181 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2182 eventPtr = eventEndPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2183 notationDeclHandler(handlerArg,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2184 declNotationName,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2185 dtd.base,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2186 systemId,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2187 declNotationPublicId);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2188 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2189 poolClear(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2190 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2191 case XML_ROLE_NOTATION_NO_SYSTEM_ID:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2192 if (declNotationPublicId && notationDeclHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2193 eventPtr = eventEndPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2194 notationDeclHandler(handlerArg,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2195 declNotationName,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2196 dtd.base,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2197 0,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2198 declNotationPublicId);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2199 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2200 poolClear(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2201 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2202 case XML_ROLE_ERROR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2203 eventPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2204 switch (tok) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2205 case XML_TOK_PARAM_ENTITY_REF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2206 return XML_ERROR_PARAM_ENTITY_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2207 case XML_TOK_XML_DECL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2208 return XML_ERROR_MISPLACED_XML_PI;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2209 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2210 return XML_ERROR_SYNTAX;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2211 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2212 case XML_ROLE_GROUP_OPEN:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2213 if (prologState.level >= groupSize) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2214 if (groupSize)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2215 groupConnector = realloc(groupConnector, groupSize *= 2);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2216 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2217 groupConnector = malloc(groupSize = 32);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2218 if (!groupConnector)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2219 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2220 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2221 groupConnector[prologState.level] = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2222 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2223 case XML_ROLE_GROUP_SEQUENCE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2224 if (groupConnector[prologState.level] == '|') {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2225 eventPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2226 return XML_ERROR_SYNTAX;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2227 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2228 groupConnector[prologState.level] = ',';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2229 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2230 case XML_ROLE_GROUP_CHOICE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2231 if (groupConnector[prologState.level] == ',') {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2232 eventPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2233 return XML_ERROR_SYNTAX;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2234 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2235 groupConnector[prologState.level] = '|';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2236 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2237 case XML_ROLE_PARAM_ENTITY_REF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2238 if (!dtd.standalone
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2239 && notStandaloneHandler
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2240 && !notStandaloneHandler(handlerArg))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2241 return XML_ERROR_NOT_STANDALONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2242 dtd.complete = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2243 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2244 case XML_ROLE_NONE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2245 switch (tok) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2246 case XML_TOK_PI:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2247 eventPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2248 eventEndPtr = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2249 if (!reportProcessingInstruction(parser, encoding, s, next))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2250 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2251 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2252 case XML_TOK_COMMENT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2253 eventPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2254 eventEndPtr = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2255 if (!reportComment(parser, encoding, s, next))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2256 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2257 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2258 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2259 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2260 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2261 if (defaultHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2262 switch (tok) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2263 case XML_TOK_PI:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2264 case XML_TOK_COMMENT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2265 case XML_TOK_BOM:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2266 case XML_TOK_XML_DECL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2267 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2268 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2269 eventPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2270 eventEndPtr = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2271 reportDefault(parser, encoding, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2272 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2273 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2274 s = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2275 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2276 /* not reached */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2277 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2278
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2279 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2280 enum XML_Error epilogProcessor(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2281 const char *s,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2282 const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2283 const char **nextPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2284 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2285 processor = epilogProcessor;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2286 eventPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2287 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2288 const char *next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2289 int tok = XmlPrologTok(encoding, s, end, &next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2290 eventEndPtr = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2291 switch (tok) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2292 case XML_TOK_TRAILING_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2293 if (defaultHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2294 eventEndPtr = end;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2295 reportDefault(parser, encoding, s, end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2296 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2297 /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2298 case XML_TOK_NONE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2299 if (nextPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2300 *nextPtr = end;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2301 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2302 case XML_TOK_PROLOG_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2303 if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2304 reportDefault(parser, encoding, s, next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2305 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2306 case XML_TOK_PI:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2307 if (!reportProcessingInstruction(parser, encoding, s, next))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2308 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2309 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2310 case XML_TOK_COMMENT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2311 if (!reportComment(parser, encoding, s, next))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2312 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2313 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2314 case XML_TOK_INVALID:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2315 eventPtr = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2316 return XML_ERROR_INVALID_TOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2317 case XML_TOK_PARTIAL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2318 if (nextPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2319 *nextPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2320 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2321 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2322 return XML_ERROR_UNCLOSED_TOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2323 case XML_TOK_PARTIAL_CHAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2324 if (nextPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2325 *nextPtr = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2326 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2327 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2328 return XML_ERROR_PARTIAL_CHAR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2329 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2330 return XML_ERROR_JUNK_AFTER_DOC_ELEMENT;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2331 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2332 eventPtr = s = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2333 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2334 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2335
235
f7f07794d2df [/trunk] Changeset 248 by mikael
mikael
parents: 25
diff changeset
2336 /*
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2337 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2338 enum XML_Error errorProcessor(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2339 const char *s,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2340 const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2341 const char **nextPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2342 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2343 return errorCode;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2344 }
235
f7f07794d2df [/trunk] Changeset 248 by mikael
mikael
parents: 25
diff changeset
2345 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2346
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2347 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2348 storeAttributeValue(XML_Parser parser, const ENCODING *enc, int isCdata,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2349 const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2350 STRING_POOL *pool)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2351 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2352 enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, end, pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2353 if (result)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2354 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2355 if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2356 poolChop(pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2357 if (!poolAppendChar(pool, XML_T('\0')))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2358 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2359 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2360 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2361
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2362 static enum XML_Error
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2363 appendAttributeValue(XML_Parser parser, const ENCODING *enc, int isCdata,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2364 const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2365 STRING_POOL *pool)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2366 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2367 const ENCODING *internalEnc = ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding();
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2368 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2369 const char *next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2370 int tok = XmlAttributeValueTok(enc, ptr, end, &next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2371 switch (tok) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2372 case XML_TOK_NONE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2373 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2374 case XML_TOK_INVALID:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2375 if (enc == encoding)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2376 eventPtr = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2377 return XML_ERROR_INVALID_TOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2378 case XML_TOK_PARTIAL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2379 if (enc == encoding)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2380 eventPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2381 return XML_ERROR_INVALID_TOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2382 case XML_TOK_CHAR_REF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2383 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2384 XML_Char buf[XML_ENCODE_MAX];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2385 int i;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2386 int n = XmlCharRefNumber(enc, ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2387 if (n < 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2388 if (enc == encoding)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2389 eventPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2390 return XML_ERROR_BAD_CHAR_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2391 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2392 if (!isCdata
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2393 && n == 0x20 /* space */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2394 && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2395 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2396 n = XmlEncode(n, (ICHAR *)buf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2397 if (!n) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2398 if (enc == encoding)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2399 eventPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2400 return XML_ERROR_BAD_CHAR_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2401 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2402 for (i = 0; i < n; i++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2403 if (!poolAppendChar(pool, buf[i]))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2404 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2405 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2406 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2407 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2408 case XML_TOK_DATA_CHARS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2409 if (!poolAppend(pool, enc, ptr, next))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2410 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2411 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2412 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2413 case XML_TOK_TRAILING_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2414 next = ptr + enc->minBytesPerChar;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2415 /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2416 case XML_TOK_ATTRIBUTE_VALUE_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2417 case XML_TOK_DATA_NEWLINE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2418 if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2419 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2420 if (!poolAppendChar(pool, 0x20))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2421 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2422 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2423 case XML_TOK_ENTITY_REF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2424 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2425 const XML_Char *name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2426 ENTITY *entity;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2427 XML_Char ch = XmlPredefinedEntityName(enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2428 ptr + enc->minBytesPerChar,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2429 next - enc->minBytesPerChar);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2430 if (ch) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2431 if (!poolAppendChar(pool, ch))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2432 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2433 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2434 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2435 name = poolStoreString(&temp2Pool, enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2436 ptr + enc->minBytesPerChar,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2437 next - enc->minBytesPerChar);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2438 if (!name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2439 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2440 entity = (ENTITY *)lookup(&dtd.generalEntities, name, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2441 poolDiscard(&temp2Pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2442 if (!entity) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2443 if (dtd.complete) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2444 if (enc == encoding)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2445 eventPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2446 return XML_ERROR_UNDEFINED_ENTITY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2447 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2448 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2449 else if (entity->open) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2450 if (enc == encoding)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2451 eventPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2452 return XML_ERROR_RECURSIVE_ENTITY_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2453 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2454 else if (entity->notation) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2455 if (enc == encoding)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2456 eventPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2457 return XML_ERROR_BINARY_ENTITY_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2458 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2459 else if (!entity->textPtr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2460 if (enc == encoding)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2461 eventPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2462 return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2463 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2464 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2465 enum XML_Error result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2466 const XML_Char *textEnd = entity->textPtr + entity->textLen;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2467 entity->open = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2468 result = appendAttributeValue(parser, internalEnc, isCdata, (char *)entity->textPtr, (char *)textEnd, pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2469 entity->open = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2470 if (result)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2471 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2472 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2473 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2474 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2475 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2476 abort();
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2477 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2478 ptr = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2479 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2480 /* not reached */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2481 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2482
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2483 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2484 enum XML_Error storeEntityValue(XML_Parser parser,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2485 const char *entityTextPtr,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2486 const char *entityTextEnd)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2487 {
235
f7f07794d2df [/trunk] Changeset 248 by mikael
mikael
parents: 25
diff changeset
2488 /* const ENCODING *internalEnc = ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding(); */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2489 STRING_POOL *pool = &(dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2490 entityTextPtr += encoding->minBytesPerChar;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2491 entityTextEnd -= encoding->minBytesPerChar;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2492 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2493 const char *next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2494 int tok = XmlEntityValueTok(encoding, entityTextPtr, entityTextEnd, &next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2495 switch (tok) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2496 case XML_TOK_PARAM_ENTITY_REF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2497 eventPtr = entityTextPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2498 return XML_ERROR_SYNTAX;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2499 case XML_TOK_NONE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2500 if (declEntity) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2501 declEntity->textPtr = pool->start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2502 declEntity->textLen = pool->ptr - pool->start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2503 poolFinish(pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2504 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2505 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2506 poolDiscard(pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2507 return XML_ERROR_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2508 case XML_TOK_ENTITY_REF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2509 case XML_TOK_DATA_CHARS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2510 if (!poolAppend(pool, encoding, entityTextPtr, next))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2511 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2512 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2513 case XML_TOK_TRAILING_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2514 next = entityTextPtr + encoding->minBytesPerChar;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2515 /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2516 case XML_TOK_DATA_NEWLINE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2517 if (pool->end == pool->ptr && !poolGrow(pool))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2518 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2519 *(pool->ptr)++ = 0xA;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2520 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2521 case XML_TOK_CHAR_REF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2522 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2523 XML_Char buf[XML_ENCODE_MAX];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2524 int i;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2525 int n = XmlCharRefNumber(encoding, entityTextPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2526 if (n < 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2527 eventPtr = entityTextPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2528 return XML_ERROR_BAD_CHAR_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2529 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2530 n = XmlEncode(n, (ICHAR *)buf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2531 if (!n) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2532 eventPtr = entityTextPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2533 return XML_ERROR_BAD_CHAR_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2534 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2535 for (i = 0; i < n; i++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2536 if (pool->end == pool->ptr && !poolGrow(pool))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2537 return XML_ERROR_NO_MEMORY;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2538 *(pool->ptr)++ = buf[i];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2539 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2540 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2541 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2542 case XML_TOK_PARTIAL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2543 eventPtr = entityTextPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2544 return XML_ERROR_INVALID_TOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2545 case XML_TOK_INVALID:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2546 eventPtr = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2547 return XML_ERROR_INVALID_TOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2548 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2549 abort();
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2550 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2551 entityTextPtr = next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2552 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2553 /* not reached */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2554 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2555
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2556 static void
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2557 normalizeLines(XML_Char *s)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2558 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2559 XML_Char *p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2560 for (;; s++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2561 if (*s == XML_T('\0'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2562 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2563 if (*s == 0xD)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2564 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2565 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2566 p = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2567 do {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2568 if (*s == 0xD) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2569 *p++ = 0xA;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2570 if (*++s == 0xA)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2571 s++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2572 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2573 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2574 *p++ = *s++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2575 } while (*s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2576 *p = XML_T('\0');
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2577 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2578
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2579 static int
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2580 reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, const char *start, const char *end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2581 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2582 const XML_Char *target;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2583 XML_Char *data;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2584 const char *tem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2585 if (!processingInstructionHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2586 if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2587 reportDefault(parser, enc, start, end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2588 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2589 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2590 start += enc->minBytesPerChar * 2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2591 tem = start + XmlNameLength(enc, start);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2592 target = poolStoreString(&tempPool, enc, start, tem);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2593 if (!target)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2594 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2595 poolFinish(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2596 data = poolStoreString(&tempPool, enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2597 XmlSkipS(enc, tem),
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2598 end - enc->minBytesPerChar*2);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2599 if (!data)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2600 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2601 normalizeLines(data);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2602 processingInstructionHandler(handlerArg, target, data);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2603 poolClear(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2604 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2605 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2606
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2607 static int
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2608 reportComment(XML_Parser parser, const ENCODING *enc, const char *start, const char *end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2609 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2610 XML_Char *data;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2611 if (!commentHandler) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2612 if (defaultHandler)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2613 reportDefault(parser, enc, start, end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2614 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2615 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2616 data = poolStoreString(&tempPool,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2617 enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2618 start + enc->minBytesPerChar * 4,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2619 end - enc->minBytesPerChar * 3);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2620 if (!data)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2621 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2622 normalizeLines(data);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2623 commentHandler(handlerArg, data);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2624 poolClear(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2625 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2626 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2627
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2628 static void
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2629 reportDefault(XML_Parser parser, const ENCODING *enc, const char *s, const char *end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2630 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2631 if (MUST_CONVERT(enc, s)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2632 const char **eventPP;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2633 const char **eventEndPP;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2634 if (enc == encoding) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2635 eventPP = &eventPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2636 eventEndPP = &eventEndPtr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2637 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2638 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2639 eventPP = &(openInternalEntities->internalEventPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2640 eventEndPP = &(openInternalEntities->internalEventEndPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2641 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2642 do {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2643 ICHAR *dataPtr = (ICHAR *)dataBuf;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2644 XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2645 *eventEndPP = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2646 defaultHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2647 *eventPP = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2648 } while (s != end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2649 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2650 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2651 defaultHandler(handlerArg, (XML_Char *)s, (XML_Char *)end - (XML_Char *)s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2652 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2653
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2654
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2655 static int
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2656 defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, int isCdata, const XML_Char *value)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2657 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2658 DEFAULT_ATTRIBUTE *att;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2659 if (type->nDefaultAtts == type->allocDefaultAtts) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2660 if (type->allocDefaultAtts == 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2661 type->allocDefaultAtts = 8;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2662 type->defaultAtts = malloc(type->allocDefaultAtts*sizeof(DEFAULT_ATTRIBUTE));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2663 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2664 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2665 type->allocDefaultAtts *= 2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2666 type->defaultAtts = realloc(type->defaultAtts,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2667 type->allocDefaultAtts*sizeof(DEFAULT_ATTRIBUTE));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2668 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2669 if (!type->defaultAtts)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2670 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2671 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2672 att = type->defaultAtts + type->nDefaultAtts;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2673 att->id = attId;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2674 att->value = value;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2675 att->isCdata = isCdata;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2676 if (!isCdata)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2677 attId->maybeTokenized = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2678 type->nDefaultAtts += 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2679 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2680 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2681
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2682 static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2683 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2684 const XML_Char *name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2685 for (name = elementType->name; *name; name++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2686 if (*name == XML_T(':')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2687 PREFIX *prefix;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2688 const XML_Char *s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2689 for (s = elementType->name; s != name; s++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2690 if (!poolAppendChar(&dtd.pool, *s))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2691 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2692 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2693 if (!poolAppendChar(&dtd.pool, XML_T('\0')))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2694 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2695 prefix = (PREFIX *)lookup(&dtd.prefixes, poolStart(&dtd.pool), sizeof(PREFIX));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2696 if (!prefix)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2697 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2698 if (prefix->name == poolStart(&dtd.pool))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2699 poolFinish(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2700 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2701 poolDiscard(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2702 elementType->prefix = prefix;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2703
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2704 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2705 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2706 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2707 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2708
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2709 static ATTRIBUTE_ID *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2710 getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, const char *end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2711 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2712 ATTRIBUTE_ID *id;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2713 const XML_Char *name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2714 if (!poolAppendChar(&dtd.pool, XML_T('\0')))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2715 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2716 name = poolStoreString(&dtd.pool, enc, start, end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2717 if (!name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2718 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2719 ++name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2720 id = (ATTRIBUTE_ID *)lookup(&dtd.attributeIds, name, sizeof(ATTRIBUTE_ID));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2721 if (!id)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2722 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2723 if (id->name != name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2724 poolDiscard(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2725 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2726 poolFinish(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2727 if (!ns)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2728 ;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2729 else if (name[0] == 'x'
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2730 && name[1] == 'm'
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2731 && name[2] == 'l'
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2732 && name[3] == 'n'
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2733 && name[4] == 's'
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2734 && (name[5] == XML_T('\0') || name[5] == XML_T(':'))) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2735 if (name[5] == '\0')
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2736 id->prefix = &dtd.defaultPrefix;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2737 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2738 id->prefix = (PREFIX *)lookup(&dtd.prefixes, name + 6, sizeof(PREFIX));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2739 id->xmlns = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2740 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2741 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2742 int i;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2743 for (i = 0; name[i]; i++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2744 if (name[i] == XML_T(':')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2745 int j;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2746 for (j = 0; j < i; j++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2747 if (!poolAppendChar(&dtd.pool, name[j]))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2748 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2749 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2750 if (!poolAppendChar(&dtd.pool, XML_T('\0')))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2751 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2752 id->prefix = (PREFIX *)lookup(&dtd.prefixes, poolStart(&dtd.pool), sizeof(PREFIX));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2753 if (id->prefix->name == poolStart(&dtd.pool))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2754 poolFinish(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2755 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2756 poolDiscard(&dtd.pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2757 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2758 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2759 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2760 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2761 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2762 return id;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2763 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2764
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2765 #define CONTEXT_SEP XML_T('\f')
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2766
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2767 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2768 const XML_Char *getContext(XML_Parser parser)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2769 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2770 HASH_TABLE_ITER iter;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2771 int needSep = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2772
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2773 if (dtd.defaultPrefix.binding) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2774 int i;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2775 int len;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2776 if (!poolAppendChar(&tempPool, XML_T('=')))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2777 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2778 len = dtd.defaultPrefix.binding->uriLen;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2779 if (namespaceSeparator != XML_T('\0'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2780 len--;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2781 for (i = 0; i < len; i++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2782 if (!poolAppendChar(&tempPool, dtd.defaultPrefix.binding->uri[i]))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2783 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2784 needSep = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2785 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2786
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2787 hashTableIterInit(&iter, &(dtd.prefixes));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2788 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2789 int i;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2790 int len;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2791 const XML_Char *s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2792 PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2793 if (!prefix)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2794 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2795 if (!prefix->binding)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2796 continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2797 if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2798 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2799 for (s = prefix->name; *s; s++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2800 if (!poolAppendChar(&tempPool, *s))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2801 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2802 if (!poolAppendChar(&tempPool, XML_T('=')))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2803 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2804 len = prefix->binding->uriLen;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2805 if (namespaceSeparator != XML_T('\0'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2806 len--;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2807 for (i = 0; i < len; i++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2808 if (!poolAppendChar(&tempPool, prefix->binding->uri[i]))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2809 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2810 needSep = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2811 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2812
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2813
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2814 hashTableIterInit(&iter, &(dtd.generalEntities));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2815 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2816 const XML_Char *s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2817 ENTITY *e = (ENTITY *)hashTableIterNext(&iter);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2818 if (!e)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2819 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2820 if (!e->open)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2821 continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2822 if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2823 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2824 for (s = e->name; *s; s++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2825 if (!poolAppendChar(&tempPool, *s))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2826 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2827 needSep = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2828 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2829
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2830 if (!poolAppendChar(&tempPool, XML_T('\0')))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2831 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2832 return tempPool.start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2833 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2834
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2835 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2836 int setContext(XML_Parser parser, const XML_Char *context)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2837 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2838 const XML_Char *s = context;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2839
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2840 while (*context != XML_T('\0')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2841 if (*s == CONTEXT_SEP || *s == XML_T('\0')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2842 ENTITY *e;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2843 if (!poolAppendChar(&tempPool, XML_T('\0')))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2844 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2845 e = (ENTITY *)lookup(&dtd.generalEntities, poolStart(&tempPool), 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2846 if (e)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2847 e->open = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2848 if (*s != XML_T('\0'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2849 s++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2850 context = s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2851 poolDiscard(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2852 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2853 else if (*s == '=') {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2854 PREFIX *prefix;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2855 if (poolLength(&tempPool) == 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2856 prefix = &dtd.defaultPrefix;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2857 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2858 if (!poolAppendChar(&tempPool, XML_T('\0')))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2859 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2860 prefix = (PREFIX *)lookup(&dtd.prefixes, poolStart(&tempPool), sizeof(PREFIX));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2861 if (!prefix)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2862 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2863 if (prefix->name == poolStart(&tempPool))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2864 poolFinish(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2865 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2866 poolDiscard(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2867 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2868 for (context = s + 1; *context != CONTEXT_SEP && *context != XML_T('\0'); context++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2869 if (!poolAppendChar(&tempPool, *context))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2870 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2871 if (!poolAppendChar(&tempPool, XML_T('\0')))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2872 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2873 if (!addBinding(parser, prefix, 0, poolStart(&tempPool), &inheritedBindings))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2874 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2875 poolDiscard(&tempPool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2876 if (*context != XML_T('\0'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2877 ++context;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2878 s = context;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2879 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2880 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2881 if (!poolAppendChar(&tempPool, *s))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2882 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2883 s++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2884 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2885 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2886 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2887 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2888
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2889
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2890 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2891 void normalizePublicId(XML_Char *publicId)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2892 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2893 XML_Char *p = publicId;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2894 XML_Char *s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2895 for (s = publicId; *s; s++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2896 switch (*s) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2897 case 0x20:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2898 case 0xD:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2899 case 0xA:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2900 if (p != publicId && p[-1] != 0x20)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2901 *p++ = 0x20;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2902 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2903 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2904 *p++ = *s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2905 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2906 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2907 if (p != publicId && p[-1] == 0x20)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2908 --p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2909 *p = XML_T('\0');
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2910 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2911
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2912 static int dtdInit(DTD *p)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2913 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2914 poolInit(&(p->pool));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2915 hashTableInit(&(p->generalEntities));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2916 hashTableInit(&(p->elementTypes));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2917 hashTableInit(&(p->attributeIds));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2918 hashTableInit(&(p->prefixes));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2919 p->complete = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2920 p->standalone = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2921 p->base = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2922 p->defaultPrefix.name = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2923 p->defaultPrefix.binding = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2924 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2925 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2926
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2927 static void dtdDestroy(DTD *p)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2928 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2929 HASH_TABLE_ITER iter;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2930 hashTableIterInit(&iter, &(p->elementTypes));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2931 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2932 ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2933 if (!e)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2934 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2935 if (e->allocDefaultAtts != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2936 free(e->defaultAtts);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2937 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2938 hashTableDestroy(&(p->generalEntities));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2939 hashTableDestroy(&(p->elementTypes));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2940 hashTableDestroy(&(p->attributeIds));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2941 hashTableDestroy(&(p->prefixes));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2942 poolDestroy(&(p->pool));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2943 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2944
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2945 /* Do a deep copy of the DTD. Return 0 for out of memory; non-zero otherwise.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2946 The new DTD has already been initialized. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2947
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2948 static int dtdCopy(DTD *newDtd, const DTD *oldDtd)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2949 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2950 HASH_TABLE_ITER iter;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2951
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2952 if (oldDtd->base) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2953 const XML_Char *tem = poolCopyString(&(newDtd->pool), oldDtd->base);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2954 if (!tem)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2955 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2956 newDtd->base = tem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2957 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2958
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2959 /* Copy the prefix table. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2960
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2961 hashTableIterInit(&iter, &(oldDtd->prefixes));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2962 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2963 const XML_Char *name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2964 const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2965 if (!oldP)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2966 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2967 name = poolCopyString(&(newDtd->pool), oldP->name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2968 if (!name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2969 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2970 if (!lookup(&(newDtd->prefixes), name, sizeof(PREFIX)))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2971 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2972 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2973
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2974 hashTableIterInit(&iter, &(oldDtd->attributeIds));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2975
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2976 /* Copy the attribute id table. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2977
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2978 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2979 ATTRIBUTE_ID *newA;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2980 const XML_Char *name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2981 const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2982
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2983 if (!oldA)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2984 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2985 /* Remember to allocate the scratch byte before the name. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2986 if (!poolAppendChar(&(newDtd->pool), XML_T('\0')))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2987 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2988 name = poolCopyString(&(newDtd->pool), oldA->name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2989 if (!name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2990 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2991 ++name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2992 newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name, sizeof(ATTRIBUTE_ID));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2993 if (!newA)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2994 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2995 newA->maybeTokenized = oldA->maybeTokenized;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2996 if (oldA->prefix) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2997 newA->xmlns = oldA->xmlns;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2998 if (oldA->prefix == &oldDtd->defaultPrefix)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2999 newA->prefix = &newDtd->defaultPrefix;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3000 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3001 newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes), oldA->prefix->name, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3002 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3003 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3004
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3005 /* Copy the element type table. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3006
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3007 hashTableIterInit(&iter, &(oldDtd->elementTypes));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3008
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3009 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3010 int i;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3011 ELEMENT_TYPE *newE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3012 const XML_Char *name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3013 const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3014 if (!oldE)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3015 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3016 name = poolCopyString(&(newDtd->pool), oldE->name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3017 if (!name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3018 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3019 newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name, sizeof(ELEMENT_TYPE));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3020 if (!newE)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3021 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3022 if (oldE->nDefaultAtts) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3023 newE->defaultAtts = (DEFAULT_ATTRIBUTE *)malloc(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3024 if (!newE->defaultAtts)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3025 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3026 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3027 newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3028 if (oldE->prefix)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3029 newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes), oldE->prefix->name, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3030 for (i = 0; i < newE->nDefaultAtts; i++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3031 newE->defaultAtts[i].id = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3032 newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3033 if (oldE->defaultAtts[i].value) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3034 newE->defaultAtts[i].value = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3035 if (!newE->defaultAtts[i].value)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3036 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3037 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3038 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3039 newE->defaultAtts[i].value = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3040 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3041 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3042
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3043 /* Copy the entity table. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3044
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3045 hashTableIterInit(&iter, &(oldDtd->generalEntities));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3046
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3047 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3048 ENTITY *newE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3049 const XML_Char *name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3050 const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3051 if (!oldE)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3052 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3053 name = poolCopyString(&(newDtd->pool), oldE->name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3054 if (!name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3055 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3056 newE = (ENTITY *)lookup(&(newDtd->generalEntities), name, sizeof(ENTITY));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3057 if (!newE)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3058 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3059 if (oldE->systemId) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3060 const XML_Char *tem = poolCopyString(&(newDtd->pool), oldE->systemId);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3061 if (!tem)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3062 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3063 newE->systemId = tem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3064 if (oldE->base) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3065 if (oldE->base == oldDtd->base)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3066 newE->base = newDtd->base;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3067 tem = poolCopyString(&(newDtd->pool), oldE->base);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3068 if (!tem)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3069 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3070 newE->base = tem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3071 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3072 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3073 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3074 const XML_Char *tem = poolCopyStringN(&(newDtd->pool), oldE->textPtr, oldE->textLen);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3075 if (!tem)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3076 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3077 newE->textPtr = tem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3078 newE->textLen = oldE->textLen;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3079 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3080 if (oldE->notation) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3081 const XML_Char *tem = poolCopyString(&(newDtd->pool), oldE->notation);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3082 if (!tem)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3083 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3084 newE->notation = tem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3085 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3086 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3087
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3088 newDtd->complete = oldDtd->complete;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3089 newDtd->standalone = oldDtd->standalone;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3090 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3091 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3092
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3093 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3094 void poolInit(STRING_POOL *pool)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3095 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3096 pool->blocks = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3097 pool->freeBlocks = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3098 pool->start = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3099 pool->ptr = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3100 pool->end = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3101 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3102
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3103 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3104 void poolClear(STRING_POOL *pool)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3105 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3106 if (!pool->freeBlocks)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3107 pool->freeBlocks = pool->blocks;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3108 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3109 BLOCK *p = pool->blocks;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3110 while (p) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3111 BLOCK *tem = p->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3112 p->next = pool->freeBlocks;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3113 pool->freeBlocks = p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3114 p = tem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3115 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3116 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3117 pool->blocks = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3118 pool->start = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3119 pool->ptr = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3120 pool->end = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3121 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3122
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3123 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3124 void poolDestroy(STRING_POOL *pool)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3125 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3126 BLOCK *p = pool->blocks;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3127 while (p) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3128 BLOCK *tem = p->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3129 free(p);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3130 p = tem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3131 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3132 pool->blocks = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3133 p = pool->freeBlocks;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3134 while (p) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3135 BLOCK *tem = p->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3136 free(p);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3137 p = tem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3138 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3139 pool->freeBlocks = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3140 pool->ptr = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3141 pool->start = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3142 pool->end = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3143 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3144
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3145 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3146 XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3147 const char *ptr, const char *end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3148 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3149 if (!pool->ptr && !poolGrow(pool))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3150 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3151 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3152 XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3153 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3154 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3155 if (!poolGrow(pool))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3156 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3157 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3158 return pool->start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3159 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3160
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3161 static const XML_Char *poolCopyString(STRING_POOL *pool, const XML_Char *s)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3162 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3163 do {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3164 if (!poolAppendChar(pool, *s))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3165 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3166 } while (*s++);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3167 s = pool->start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3168 poolFinish(pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3169 return s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3170 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3171
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3172 static const XML_Char *poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3173 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3174 if (!pool->ptr && !poolGrow(pool))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3175 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3176 for (; n > 0; --n, s++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3177 if (!poolAppendChar(pool, *s))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3178 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3179
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3180 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3181 s = pool->start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3182 poolFinish(pool);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3183 return s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3184 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3185
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3186 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3187 XML_Char *poolStoreString(STRING_POOL *pool, const ENCODING *enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3188 const char *ptr, const char *end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3189 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3190 if (!poolAppend(pool, enc, ptr, end))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3191 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3192 if (pool->ptr == pool->end && !poolGrow(pool))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3193 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3194 *(pool->ptr)++ = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3195 return pool->start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3196 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3197
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3198 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3199 int poolGrow(STRING_POOL *pool)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3200 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3201 if (pool->freeBlocks) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3202 if (pool->start == 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3203 pool->blocks = pool->freeBlocks;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3204 pool->freeBlocks = pool->freeBlocks->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3205 pool->blocks->next = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3206 pool->start = pool->blocks->s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3207 pool->end = pool->start + pool->blocks->size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3208 pool->ptr = pool->start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3209 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3210 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3211 if (pool->end - pool->start < pool->freeBlocks->size) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3212 BLOCK *tem = pool->freeBlocks->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3213 pool->freeBlocks->next = pool->blocks;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3214 pool->blocks = pool->freeBlocks;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3215 pool->freeBlocks = tem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3216 memcpy(pool->blocks->s, pool->start, (pool->end - pool->start) * sizeof(XML_Char));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3217 pool->ptr = pool->blocks->s + (pool->ptr - pool->start);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3218 pool->start = pool->blocks->s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3219 pool->end = pool->start + pool->blocks->size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3220 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3221 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3222 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3223 if (pool->blocks && pool->start == pool->blocks->s) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3224 int blockSize = (pool->end - pool->start)*2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3225 pool->blocks = realloc(pool->blocks, offsetof(BLOCK, s) + blockSize * sizeof(XML_Char));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3226 if (!pool->blocks)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3227 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3228 pool->blocks->size = blockSize;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3229 pool->ptr = pool->blocks->s + (pool->ptr - pool->start);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3230 pool->start = pool->blocks->s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3231 pool->end = pool->start + blockSize;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3232 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3233 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3234 BLOCK *tem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3235 int blockSize = pool->end - pool->start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3236 if (blockSize < INIT_BLOCK_SIZE)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3237 blockSize = INIT_BLOCK_SIZE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3238 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3239 blockSize *= 2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3240 tem = malloc(offsetof(BLOCK, s) + blockSize * sizeof(XML_Char));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3241 if (!tem)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3242 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3243 tem->size = blockSize;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3244 tem->next = pool->blocks;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3245 pool->blocks = tem;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3246 memcpy(tem->s, pool->start, (pool->ptr - pool->start) * sizeof(XML_Char));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3247 pool->ptr = tem->s + (pool->ptr - pool->start);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3248 pool->start = tem->s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3249 pool->end = tem->s + blockSize;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3250 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3251 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3252 }