blob: 44772e21dd337b00e3fc53b1626721672ab08102 [file] [log] [blame]
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
2 See the file COPYING for copying permission.
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00003*/
4
Gregory P. Smith64359d22012-07-14 14:12:35 -07005#include <stddef.h>
6
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00007#ifdef COMPILED_FROM_DSP
Martin v. Löwisfc03a942003-01-25 22:41:29 +00008#include "winconfig.h"
9#elif defined(MACOS_CLASSIC)
10#include "macconfig.h"
Gregory P. Smith64359d22012-07-14 14:12:35 -070011#elif defined(__amigaos__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000012#include "amigaconfig.h"
Gregory P. Smith64359d22012-07-14 14:12:35 -070013#elif defined(__WATCOMC__)
14#include "watcomconfig.h"
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +000015#else
Fred Drake08317ae2003-10-21 15:38:55 +000016#ifdef HAVE_EXPAT_CONFIG_H
Martin v. Löwisfc03a942003-01-25 22:41:29 +000017#include <expat_config.h>
Fred Drake08317ae2003-10-21 15:38:55 +000018#endif
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +000019#endif /* ndef COMPILED_FROM_DSP */
20
Fred Drake31d485c2004-08-03 07:06:22 +000021#include "expat_external.h"
Martin v. Löwisfc03a942003-01-25 22:41:29 +000022#include "internal.h"
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +000023#include "xmlrole.h"
24#include "ascii.h"
25
26/* Doesn't check:
27
28 that ,| are not mixed in a model group
29 content of literals
30
31*/
32
Martin v. Löwisfc03a942003-01-25 22:41:29 +000033static const char KW_ANY[] = {
34 ASCII_A, ASCII_N, ASCII_Y, '\0' };
35static const char KW_ATTLIST[] = {
36 ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' };
37static const char KW_CDATA[] = {
38 ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
39static const char KW_DOCTYPE[] = {
40 ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' };
41static const char KW_ELEMENT[] = {
42 ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' };
43static const char KW_EMPTY[] = {
44 ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' };
45static const char KW_ENTITIES[] = {
46 ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S,
47 '\0' };
48static const char KW_ENTITY[] = {
49 ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };
50static const char KW_FIXED[] = {
51 ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' };
52static const char KW_ID[] = {
53 ASCII_I, ASCII_D, '\0' };
54static const char KW_IDREF[] = {
55 ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };
56static const char KW_IDREFS[] = {
57 ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };
Gregory P. Smith64359d22012-07-14 14:12:35 -070058#ifdef XML_DTD
Martin v. Löwisfc03a942003-01-25 22:41:29 +000059static const char KW_IGNORE[] = {
60 ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' };
Gregory P. Smith64359d22012-07-14 14:12:35 -070061#endif
Martin v. Löwisfc03a942003-01-25 22:41:29 +000062static const char KW_IMPLIED[] = {
63 ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' };
Gregory P. Smith64359d22012-07-14 14:12:35 -070064#ifdef XML_DTD
Martin v. Löwisfc03a942003-01-25 22:41:29 +000065static const char KW_INCLUDE[] = {
66 ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' };
Gregory P. Smith64359d22012-07-14 14:12:35 -070067#endif
Martin v. Löwisfc03a942003-01-25 22:41:29 +000068static const char KW_NDATA[] = {
69 ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
70static const char KW_NMTOKEN[] = {
71 ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };
72static const char KW_NMTOKENS[] = {
73 ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S,
74 '\0' };
75static const char KW_NOTATION[] =
76 { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N,
77 '\0' };
78static const char KW_PCDATA[] = {
79 ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
80static const char KW_PUBLIC[] = {
81 ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' };
82static const char KW_REQUIRED[] = {
83 ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D,
84 '\0' };
85static const char KW_SYSTEM[] = {
86 ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' };
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +000087
88#ifndef MIN_BYTES_PER_CHAR
89#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
90#endif
91
92#ifdef XML_DTD
93#define setTopLevel(state) \
94 ((state)->handler = ((state)->documentEntity \
95 ? internalSubset \
96 : externalSubset1))
97#else /* not XML_DTD */
98#define setTopLevel(state) ((state)->handler = internalSubset)
99#endif /* not XML_DTD */
100
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000101typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state,
102 int tok,
103 const char *ptr,
104 const char *end,
105 const ENCODING *enc);
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000106
107static PROLOG_HANDLER
108 prolog0, prolog1, prolog2,
109 doctype0, doctype1, doctype2, doctype3, doctype4, doctype5,
110 internalSubset,
111 entity0, entity1, entity2, entity3, entity4, entity5, entity6,
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000112 entity7, entity8, entity9, entity10,
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000113 notation0, notation1, notation2, notation3, notation4,
114 attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6,
115 attlist7, attlist8, attlist9,
116 element0, element1, element2, element3, element4, element5, element6,
117 element7,
118#ifdef XML_DTD
119 externalSubset0, externalSubset1,
120 condSect0, condSect1, condSect2,
121#endif /* XML_DTD */
122 declClose,
123 error;
124
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000125static int FASTCALL common(PROLOG_STATE *state, int tok);
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000126
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000127static int PTRCALL
128prolog0(PROLOG_STATE *state,
129 int tok,
130 const char *ptr,
131 const char *end,
132 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000133{
134 switch (tok) {
135 case XML_TOK_PROLOG_S:
136 state->handler = prolog1;
137 return XML_ROLE_NONE;
138 case XML_TOK_XML_DECL:
139 state->handler = prolog1;
140 return XML_ROLE_XML_DECL;
141 case XML_TOK_PI:
142 state->handler = prolog1;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000143 return XML_ROLE_PI;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000144 case XML_TOK_COMMENT:
145 state->handler = prolog1;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000146 return XML_ROLE_COMMENT;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000147 case XML_TOK_BOM:
148 return XML_ROLE_NONE;
149 case XML_TOK_DECL_OPEN:
150 if (!XmlNameMatchesAscii(enc,
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000151 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
152 end,
153 KW_DOCTYPE))
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000154 break;
155 state->handler = doctype0;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000156 return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000157 case XML_TOK_INSTANCE_START:
158 state->handler = error;
159 return XML_ROLE_INSTANCE_START;
160 }
161 return common(state, tok);
162}
163
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000164static int PTRCALL
165prolog1(PROLOG_STATE *state,
166 int tok,
167 const char *ptr,
168 const char *end,
169 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000170{
171 switch (tok) {
172 case XML_TOK_PROLOG_S:
173 return XML_ROLE_NONE;
174 case XML_TOK_PI:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000175 return XML_ROLE_PI;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000176 case XML_TOK_COMMENT:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000177 return XML_ROLE_COMMENT;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000178 case XML_TOK_BOM:
179 return XML_ROLE_NONE;
180 case XML_TOK_DECL_OPEN:
181 if (!XmlNameMatchesAscii(enc,
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000182 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
183 end,
184 KW_DOCTYPE))
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000185 break;
186 state->handler = doctype0;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000187 return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000188 case XML_TOK_INSTANCE_START:
189 state->handler = error;
190 return XML_ROLE_INSTANCE_START;
191 }
192 return common(state, tok);
193}
194
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000195static int PTRCALL
196prolog2(PROLOG_STATE *state,
197 int tok,
198 const char *ptr,
199 const char *end,
200 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000201{
202 switch (tok) {
203 case XML_TOK_PROLOG_S:
204 return XML_ROLE_NONE;
205 case XML_TOK_PI:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000206 return XML_ROLE_PI;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000207 case XML_TOK_COMMENT:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000208 return XML_ROLE_COMMENT;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000209 case XML_TOK_INSTANCE_START:
210 state->handler = error;
211 return XML_ROLE_INSTANCE_START;
212 }
213 return common(state, tok);
214}
215
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000216static int PTRCALL
217doctype0(PROLOG_STATE *state,
218 int tok,
219 const char *ptr,
220 const char *end,
221 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000222{
223 switch (tok) {
224 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000225 return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000226 case XML_TOK_NAME:
227 case XML_TOK_PREFIXED_NAME:
228 state->handler = doctype1;
229 return XML_ROLE_DOCTYPE_NAME;
230 }
231 return common(state, tok);
232}
233
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000234static int PTRCALL
235doctype1(PROLOG_STATE *state,
236 int tok,
237 const char *ptr,
238 const char *end,
239 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000240{
241 switch (tok) {
242 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000243 return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000244 case XML_TOK_OPEN_BRACKET:
245 state->handler = internalSubset;
246 return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
247 case XML_TOK_DECL_CLOSE:
248 state->handler = prolog2;
249 return XML_ROLE_DOCTYPE_CLOSE;
250 case XML_TOK_NAME:
251 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
252 state->handler = doctype3;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000253 return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000254 }
255 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
256 state->handler = doctype2;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000257 return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000258 }
259 break;
260 }
261 return common(state, tok);
262}
263
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000264static int PTRCALL
265doctype2(PROLOG_STATE *state,
266 int tok,
267 const char *ptr,
268 const char *end,
269 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000270{
271 switch (tok) {
272 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000273 return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000274 case XML_TOK_LITERAL:
275 state->handler = doctype3;
276 return XML_ROLE_DOCTYPE_PUBLIC_ID;
277 }
278 return common(state, tok);
279}
280
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000281static int PTRCALL
282doctype3(PROLOG_STATE *state,
283 int tok,
284 const char *ptr,
285 const char *end,
286 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000287{
288 switch (tok) {
289 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000290 return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000291 case XML_TOK_LITERAL:
292 state->handler = doctype4;
293 return XML_ROLE_DOCTYPE_SYSTEM_ID;
294 }
295 return common(state, tok);
296}
297
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000298static int PTRCALL
299doctype4(PROLOG_STATE *state,
300 int tok,
301 const char *ptr,
302 const char *end,
303 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000304{
305 switch (tok) {
306 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000307 return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000308 case XML_TOK_OPEN_BRACKET:
309 state->handler = internalSubset;
310 return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
311 case XML_TOK_DECL_CLOSE:
312 state->handler = prolog2;
313 return XML_ROLE_DOCTYPE_CLOSE;
314 }
315 return common(state, tok);
316}
317
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000318static int PTRCALL
319doctype5(PROLOG_STATE *state,
320 int tok,
321 const char *ptr,
322 const char *end,
323 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000324{
325 switch (tok) {
326 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000327 return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000328 case XML_TOK_DECL_CLOSE:
329 state->handler = prolog2;
330 return XML_ROLE_DOCTYPE_CLOSE;
331 }
332 return common(state, tok);
333}
334
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000335static int PTRCALL
336internalSubset(PROLOG_STATE *state,
337 int tok,
338 const char *ptr,
339 const char *end,
340 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000341{
342 switch (tok) {
343 case XML_TOK_PROLOG_S:
344 return XML_ROLE_NONE;
345 case XML_TOK_DECL_OPEN:
346 if (XmlNameMatchesAscii(enc,
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000347 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
348 end,
349 KW_ENTITY)) {
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000350 state->handler = entity0;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000351 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000352 }
353 if (XmlNameMatchesAscii(enc,
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000354 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
355 end,
356 KW_ATTLIST)) {
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000357 state->handler = attlist0;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000358 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000359 }
360 if (XmlNameMatchesAscii(enc,
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000361 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
362 end,
363 KW_ELEMENT)) {
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000364 state->handler = element0;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000365 return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000366 }
367 if (XmlNameMatchesAscii(enc,
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000368 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
369 end,
370 KW_NOTATION)) {
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000371 state->handler = notation0;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000372 return XML_ROLE_NOTATION_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000373 }
374 break;
375 case XML_TOK_PI:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000376 return XML_ROLE_PI;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000377 case XML_TOK_COMMENT:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000378 return XML_ROLE_COMMENT;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000379 case XML_TOK_PARAM_ENTITY_REF:
380 return XML_ROLE_PARAM_ENTITY_REF;
381 case XML_TOK_CLOSE_BRACKET:
382 state->handler = doctype5;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000383 return XML_ROLE_DOCTYPE_NONE;
Fred Drake31d485c2004-08-03 07:06:22 +0000384 case XML_TOK_NONE:
385 return XML_ROLE_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000386 }
387 return common(state, tok);
388}
389
390#ifdef XML_DTD
391
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000392static int PTRCALL
393externalSubset0(PROLOG_STATE *state,
394 int tok,
395 const char *ptr,
396 const char *end,
397 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000398{
399 state->handler = externalSubset1;
400 if (tok == XML_TOK_XML_DECL)
401 return XML_ROLE_TEXT_DECL;
402 return externalSubset1(state, tok, ptr, end, enc);
403}
404
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000405static int PTRCALL
406externalSubset1(PROLOG_STATE *state,
407 int tok,
408 const char *ptr,
409 const char *end,
410 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000411{
412 switch (tok) {
413 case XML_TOK_COND_SECT_OPEN:
414 state->handler = condSect0;
415 return XML_ROLE_NONE;
416 case XML_TOK_COND_SECT_CLOSE:
417 if (state->includeLevel == 0)
418 break;
419 state->includeLevel -= 1;
420 return XML_ROLE_NONE;
421 case XML_TOK_PROLOG_S:
422 return XML_ROLE_NONE;
423 case XML_TOK_CLOSE_BRACKET:
424 break;
425 case XML_TOK_NONE:
426 if (state->includeLevel)
427 break;
428 return XML_ROLE_NONE;
429 default:
430 return internalSubset(state, tok, ptr, end, enc);
431 }
432 return common(state, tok);
433}
434
435#endif /* XML_DTD */
436
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000437static int PTRCALL
438entity0(PROLOG_STATE *state,
439 int tok,
440 const char *ptr,
441 const char *end,
442 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000443{
444 switch (tok) {
445 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000446 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000447 case XML_TOK_PERCENT:
448 state->handler = entity1;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000449 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000450 case XML_TOK_NAME:
451 state->handler = entity2;
452 return XML_ROLE_GENERAL_ENTITY_NAME;
453 }
454 return common(state, tok);
455}
456
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000457static int PTRCALL
458entity1(PROLOG_STATE *state,
459 int tok,
460 const char *ptr,
461 const char *end,
462 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000463{
464 switch (tok) {
465 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000466 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000467 case XML_TOK_NAME:
468 state->handler = entity7;
469 return XML_ROLE_PARAM_ENTITY_NAME;
470 }
471 return common(state, tok);
472}
473
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000474static int PTRCALL
475entity2(PROLOG_STATE *state,
476 int tok,
477 const char *ptr,
478 const char *end,
479 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000480{
481 switch (tok) {
482 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000483 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000484 case XML_TOK_NAME:
485 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
486 state->handler = entity4;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000487 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000488 }
489 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
490 state->handler = entity3;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000491 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000492 }
493 break;
494 case XML_TOK_LITERAL:
495 state->handler = declClose;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000496 state->role_none = XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000497 return XML_ROLE_ENTITY_VALUE;
498 }
499 return common(state, tok);
500}
501
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000502static int PTRCALL
503entity3(PROLOG_STATE *state,
504 int tok,
505 const char *ptr,
506 const char *end,
507 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000508{
509 switch (tok) {
510 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000511 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000512 case XML_TOK_LITERAL:
513 state->handler = entity4;
514 return XML_ROLE_ENTITY_PUBLIC_ID;
515 }
516 return common(state, tok);
517}
518
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000519static int PTRCALL
520entity4(PROLOG_STATE *state,
521 int tok,
522 const char *ptr,
523 const char *end,
524 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000525{
526 switch (tok) {
527 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000528 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000529 case XML_TOK_LITERAL:
530 state->handler = entity5;
531 return XML_ROLE_ENTITY_SYSTEM_ID;
532 }
533 return common(state, tok);
534}
535
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000536static int PTRCALL
537entity5(PROLOG_STATE *state,
538 int tok,
539 const char *ptr,
540 const char *end,
541 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000542{
543 switch (tok) {
544 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000545 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000546 case XML_TOK_DECL_CLOSE:
547 setTopLevel(state);
548 return XML_ROLE_ENTITY_COMPLETE;
549 case XML_TOK_NAME:
550 if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
551 state->handler = entity6;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000552 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000553 }
554 break;
555 }
556 return common(state, tok);
557}
558
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000559static int PTRCALL
560entity6(PROLOG_STATE *state,
561 int tok,
562 const char *ptr,
563 const char *end,
564 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000565{
566 switch (tok) {
567 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000568 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000569 case XML_TOK_NAME:
570 state->handler = declClose;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000571 state->role_none = XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000572 return XML_ROLE_ENTITY_NOTATION_NAME;
573 }
574 return common(state, tok);
575}
576
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000577static int PTRCALL
578entity7(PROLOG_STATE *state,
579 int tok,
580 const char *ptr,
581 const char *end,
582 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000583{
584 switch (tok) {
585 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000586 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000587 case XML_TOK_NAME:
588 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
589 state->handler = entity9;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000590 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000591 }
592 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
593 state->handler = entity8;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000594 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000595 }
596 break;
597 case XML_TOK_LITERAL:
598 state->handler = declClose;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000599 state->role_none = XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000600 return XML_ROLE_ENTITY_VALUE;
601 }
602 return common(state, tok);
603}
604
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000605static int PTRCALL
606entity8(PROLOG_STATE *state,
607 int tok,
608 const char *ptr,
609 const char *end,
610 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000611{
612 switch (tok) {
613 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000614 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000615 case XML_TOK_LITERAL:
616 state->handler = entity9;
617 return XML_ROLE_ENTITY_PUBLIC_ID;
618 }
619 return common(state, tok);
620}
621
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000622static int PTRCALL
623entity9(PROLOG_STATE *state,
624 int tok,
625 const char *ptr,
626 const char *end,
627 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000628{
629 switch (tok) {
630 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000631 return XML_ROLE_ENTITY_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000632 case XML_TOK_LITERAL:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000633 state->handler = entity10;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000634 return XML_ROLE_ENTITY_SYSTEM_ID;
635 }
636 return common(state, tok);
637}
638
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000639static int PTRCALL
640entity10(PROLOG_STATE *state,
641 int tok,
642 const char *ptr,
643 const char *end,
644 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000645{
646 switch (tok) {
647 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000648 return XML_ROLE_ENTITY_NONE;
649 case XML_TOK_DECL_CLOSE:
650 setTopLevel(state);
651 return XML_ROLE_ENTITY_COMPLETE;
652 }
653 return common(state, tok);
654}
655
656static int PTRCALL
657notation0(PROLOG_STATE *state,
658 int tok,
659 const char *ptr,
660 const char *end,
661 const ENCODING *enc)
662{
663 switch (tok) {
664 case XML_TOK_PROLOG_S:
665 return XML_ROLE_NOTATION_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000666 case XML_TOK_NAME:
667 state->handler = notation1;
668 return XML_ROLE_NOTATION_NAME;
669 }
670 return common(state, tok);
671}
672
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000673static int PTRCALL
674notation1(PROLOG_STATE *state,
675 int tok,
676 const char *ptr,
677 const char *end,
678 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000679{
680 switch (tok) {
681 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000682 return XML_ROLE_NOTATION_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000683 case XML_TOK_NAME:
684 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
685 state->handler = notation3;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000686 return XML_ROLE_NOTATION_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000687 }
688 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
689 state->handler = notation2;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000690 return XML_ROLE_NOTATION_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000691 }
692 break;
693 }
694 return common(state, tok);
695}
696
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000697static int PTRCALL
698notation2(PROLOG_STATE *state,
699 int tok,
700 const char *ptr,
701 const char *end,
702 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000703{
704 switch (tok) {
705 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000706 return XML_ROLE_NOTATION_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000707 case XML_TOK_LITERAL:
708 state->handler = notation4;
709 return XML_ROLE_NOTATION_PUBLIC_ID;
710 }
711 return common(state, tok);
712}
713
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000714static int PTRCALL
715notation3(PROLOG_STATE *state,
716 int tok,
717 const char *ptr,
718 const char *end,
719 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000720{
721 switch (tok) {
722 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000723 return XML_ROLE_NOTATION_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000724 case XML_TOK_LITERAL:
725 state->handler = declClose;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000726 state->role_none = XML_ROLE_NOTATION_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000727 return XML_ROLE_NOTATION_SYSTEM_ID;
728 }
729 return common(state, tok);
730}
731
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000732static int PTRCALL
733notation4(PROLOG_STATE *state,
734 int tok,
735 const char *ptr,
736 const char *end,
737 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000738{
739 switch (tok) {
740 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000741 return XML_ROLE_NOTATION_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000742 case XML_TOK_LITERAL:
743 state->handler = declClose;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000744 state->role_none = XML_ROLE_NOTATION_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000745 return XML_ROLE_NOTATION_SYSTEM_ID;
746 case XML_TOK_DECL_CLOSE:
747 setTopLevel(state);
748 return XML_ROLE_NOTATION_NO_SYSTEM_ID;
749 }
750 return common(state, tok);
751}
752
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000753static int PTRCALL
754attlist0(PROLOG_STATE *state,
755 int tok,
756 const char *ptr,
757 const char *end,
758 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000759{
760 switch (tok) {
761 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000762 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000763 case XML_TOK_NAME:
764 case XML_TOK_PREFIXED_NAME:
765 state->handler = attlist1;
766 return XML_ROLE_ATTLIST_ELEMENT_NAME;
767 }
768 return common(state, tok);
769}
770
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000771static int PTRCALL
772attlist1(PROLOG_STATE *state,
773 int tok,
774 const char *ptr,
775 const char *end,
776 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000777{
778 switch (tok) {
779 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000780 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000781 case XML_TOK_DECL_CLOSE:
782 setTopLevel(state);
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000783 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000784 case XML_TOK_NAME:
785 case XML_TOK_PREFIXED_NAME:
786 state->handler = attlist2;
787 return XML_ROLE_ATTRIBUTE_NAME;
788 }
789 return common(state, tok);
790}
791
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000792static int PTRCALL
793attlist2(PROLOG_STATE *state,
794 int tok,
795 const char *ptr,
796 const char *end,
797 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000798{
799 switch (tok) {
800 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000801 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000802 case XML_TOK_NAME:
803 {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000804 static const char * const types[] = {
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000805 KW_CDATA,
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000806 KW_ID,
807 KW_IDREF,
808 KW_IDREFS,
809 KW_ENTITY,
810 KW_ENTITIES,
811 KW_NMTOKEN,
812 KW_NMTOKENS,
813 };
814 int i;
815 for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++)
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000816 if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
817 state->handler = attlist8;
818 return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
819 }
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000820 }
821 if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
822 state->handler = attlist5;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000823 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000824 }
825 break;
826 case XML_TOK_OPEN_PAREN:
827 state->handler = attlist3;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000828 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000829 }
830 return common(state, tok);
831}
832
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000833static int PTRCALL
834attlist3(PROLOG_STATE *state,
835 int tok,
836 const char *ptr,
837 const char *end,
838 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000839{
840 switch (tok) {
841 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000842 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000843 case XML_TOK_NMTOKEN:
844 case XML_TOK_NAME:
845 case XML_TOK_PREFIXED_NAME:
846 state->handler = attlist4;
847 return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
848 }
849 return common(state, tok);
850}
851
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000852static int PTRCALL
853attlist4(PROLOG_STATE *state,
854 int tok,
855 const char *ptr,
856 const char *end,
857 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000858{
859 switch (tok) {
860 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000861 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000862 case XML_TOK_CLOSE_PAREN:
863 state->handler = attlist8;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000864 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000865 case XML_TOK_OR:
866 state->handler = attlist3;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000867 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000868 }
869 return common(state, tok);
870}
871
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000872static int PTRCALL
873attlist5(PROLOG_STATE *state,
874 int tok,
875 const char *ptr,
876 const char *end,
877 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000878{
879 switch (tok) {
880 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000881 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000882 case XML_TOK_OPEN_PAREN:
883 state->handler = attlist6;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000884 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000885 }
886 return common(state, tok);
887}
888
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000889static int PTRCALL
890attlist6(PROLOG_STATE *state,
891 int tok,
892 const char *ptr,
893 const char *end,
894 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000895{
896 switch (tok) {
897 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000898 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000899 case XML_TOK_NAME:
900 state->handler = attlist7;
901 return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
902 }
903 return common(state, tok);
904}
905
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000906static int PTRCALL
907attlist7(PROLOG_STATE *state,
908 int tok,
909 const char *ptr,
910 const char *end,
911 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000912{
913 switch (tok) {
914 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000915 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000916 case XML_TOK_CLOSE_PAREN:
917 state->handler = attlist8;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000918 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000919 case XML_TOK_OR:
920 state->handler = attlist6;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000921 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000922 }
923 return common(state, tok);
924}
925
926/* default value */
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000927static int PTRCALL
928attlist8(PROLOG_STATE *state,
929 int tok,
930 const char *ptr,
931 const char *end,
932 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000933{
934 switch (tok) {
935 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000936 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000937 case XML_TOK_POUND_NAME:
938 if (XmlNameMatchesAscii(enc,
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000939 ptr + MIN_BYTES_PER_CHAR(enc),
940 end,
941 KW_IMPLIED)) {
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000942 state->handler = attlist1;
943 return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
944 }
945 if (XmlNameMatchesAscii(enc,
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000946 ptr + MIN_BYTES_PER_CHAR(enc),
947 end,
948 KW_REQUIRED)) {
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000949 state->handler = attlist1;
950 return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
951 }
952 if (XmlNameMatchesAscii(enc,
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000953 ptr + MIN_BYTES_PER_CHAR(enc),
954 end,
955 KW_FIXED)) {
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000956 state->handler = attlist9;
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000957 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000958 }
959 break;
960 case XML_TOK_LITERAL:
961 state->handler = attlist1;
962 return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
963 }
964 return common(state, tok);
965}
966
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000967static int PTRCALL
968attlist9(PROLOG_STATE *state,
969 int tok,
970 const char *ptr,
971 const char *end,
972 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000973{
974 switch (tok) {
975 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000976 return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000977 case XML_TOK_LITERAL:
978 state->handler = attlist1;
979 return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
980 }
981 return common(state, tok);
982}
983
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000984static int PTRCALL
985element0(PROLOG_STATE *state,
986 int tok,
987 const char *ptr,
988 const char *end,
989 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000990{
991 switch (tok) {
992 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +0000993 return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +0000994 case XML_TOK_NAME:
995 case XML_TOK_PREFIXED_NAME:
996 state->handler = element1;
997 return XML_ROLE_ELEMENT_NAME;
998 }
999 return common(state, tok);
1000}
1001
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001002static int PTRCALL
1003element1(PROLOG_STATE *state,
1004 int tok,
1005 const char *ptr,
1006 const char *end,
1007 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001008{
1009 switch (tok) {
1010 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001011 return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001012 case XML_TOK_NAME:
1013 if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
1014 state->handler = declClose;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001015 state->role_none = XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001016 return XML_ROLE_CONTENT_EMPTY;
1017 }
1018 if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
1019 state->handler = declClose;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001020 state->role_none = XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001021 return XML_ROLE_CONTENT_ANY;
1022 }
1023 break;
1024 case XML_TOK_OPEN_PAREN:
1025 state->handler = element2;
1026 state->level = 1;
1027 return XML_ROLE_GROUP_OPEN;
1028 }
1029 return common(state, tok);
1030}
1031
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001032static int PTRCALL
1033element2(PROLOG_STATE *state,
1034 int tok,
1035 const char *ptr,
1036 const char *end,
1037 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001038{
1039 switch (tok) {
1040 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001041 return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001042 case XML_TOK_POUND_NAME:
1043 if (XmlNameMatchesAscii(enc,
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001044 ptr + MIN_BYTES_PER_CHAR(enc),
1045 end,
1046 KW_PCDATA)) {
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001047 state->handler = element3;
1048 return XML_ROLE_CONTENT_PCDATA;
1049 }
1050 break;
1051 case XML_TOK_OPEN_PAREN:
1052 state->level = 2;
1053 state->handler = element6;
1054 return XML_ROLE_GROUP_OPEN;
1055 case XML_TOK_NAME:
1056 case XML_TOK_PREFIXED_NAME:
1057 state->handler = element7;
1058 return XML_ROLE_CONTENT_ELEMENT;
1059 case XML_TOK_NAME_QUESTION:
1060 state->handler = element7;
1061 return XML_ROLE_CONTENT_ELEMENT_OPT;
1062 case XML_TOK_NAME_ASTERISK:
1063 state->handler = element7;
1064 return XML_ROLE_CONTENT_ELEMENT_REP;
1065 case XML_TOK_NAME_PLUS:
1066 state->handler = element7;
1067 return XML_ROLE_CONTENT_ELEMENT_PLUS;
1068 }
1069 return common(state, tok);
1070}
1071
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001072static int PTRCALL
1073element3(PROLOG_STATE *state,
1074 int tok,
1075 const char *ptr,
1076 const char *end,
1077 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001078{
1079 switch (tok) {
1080 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001081 return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001082 case XML_TOK_CLOSE_PAREN:
1083 state->handler = declClose;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001084 state->role_none = XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001085 return XML_ROLE_GROUP_CLOSE;
1086 case XML_TOK_CLOSE_PAREN_ASTERISK:
1087 state->handler = declClose;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001088 state->role_none = XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001089 return XML_ROLE_GROUP_CLOSE_REP;
1090 case XML_TOK_OR:
1091 state->handler = element4;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001092 return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001093 }
1094 return common(state, tok);
1095}
1096
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001097static int PTRCALL
1098element4(PROLOG_STATE *state,
1099 int tok,
1100 const char *ptr,
1101 const char *end,
1102 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001103{
1104 switch (tok) {
1105 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001106 return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001107 case XML_TOK_NAME:
1108 case XML_TOK_PREFIXED_NAME:
1109 state->handler = element5;
1110 return XML_ROLE_CONTENT_ELEMENT;
1111 }
1112 return common(state, tok);
1113}
1114
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001115static int PTRCALL
1116element5(PROLOG_STATE *state,
1117 int tok,
1118 const char *ptr,
1119 const char *end,
1120 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001121{
1122 switch (tok) {
1123 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001124 return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001125 case XML_TOK_CLOSE_PAREN_ASTERISK:
1126 state->handler = declClose;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001127 state->role_none = XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001128 return XML_ROLE_GROUP_CLOSE_REP;
1129 case XML_TOK_OR:
1130 state->handler = element4;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001131 return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001132 }
1133 return common(state, tok);
1134}
1135
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001136static int PTRCALL
1137element6(PROLOG_STATE *state,
1138 int tok,
1139 const char *ptr,
1140 const char *end,
1141 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001142{
1143 switch (tok) {
1144 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001145 return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001146 case XML_TOK_OPEN_PAREN:
1147 state->level += 1;
1148 return XML_ROLE_GROUP_OPEN;
1149 case XML_TOK_NAME:
1150 case XML_TOK_PREFIXED_NAME:
1151 state->handler = element7;
1152 return XML_ROLE_CONTENT_ELEMENT;
1153 case XML_TOK_NAME_QUESTION:
1154 state->handler = element7;
1155 return XML_ROLE_CONTENT_ELEMENT_OPT;
1156 case XML_TOK_NAME_ASTERISK:
1157 state->handler = element7;
1158 return XML_ROLE_CONTENT_ELEMENT_REP;
1159 case XML_TOK_NAME_PLUS:
1160 state->handler = element7;
1161 return XML_ROLE_CONTENT_ELEMENT_PLUS;
1162 }
1163 return common(state, tok);
1164}
1165
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001166static int PTRCALL
1167element7(PROLOG_STATE *state,
1168 int tok,
1169 const char *ptr,
1170 const char *end,
1171 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001172{
1173 switch (tok) {
1174 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001175 return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001176 case XML_TOK_CLOSE_PAREN:
1177 state->level -= 1;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001178 if (state->level == 0) {
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001179 state->handler = declClose;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001180 state->role_none = XML_ROLE_ELEMENT_NONE;
1181 }
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001182 return XML_ROLE_GROUP_CLOSE;
1183 case XML_TOK_CLOSE_PAREN_ASTERISK:
1184 state->level -= 1;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001185 if (state->level == 0) {
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001186 state->handler = declClose;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001187 state->role_none = XML_ROLE_ELEMENT_NONE;
1188 }
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001189 return XML_ROLE_GROUP_CLOSE_REP;
1190 case XML_TOK_CLOSE_PAREN_QUESTION:
1191 state->level -= 1;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001192 if (state->level == 0) {
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001193 state->handler = declClose;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001194 state->role_none = XML_ROLE_ELEMENT_NONE;
1195 }
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001196 return XML_ROLE_GROUP_CLOSE_OPT;
1197 case XML_TOK_CLOSE_PAREN_PLUS:
1198 state->level -= 1;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001199 if (state->level == 0) {
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001200 state->handler = declClose;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001201 state->role_none = XML_ROLE_ELEMENT_NONE;
1202 }
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001203 return XML_ROLE_GROUP_CLOSE_PLUS;
1204 case XML_TOK_COMMA:
1205 state->handler = element6;
1206 return XML_ROLE_GROUP_SEQUENCE;
1207 case XML_TOK_OR:
1208 state->handler = element6;
1209 return XML_ROLE_GROUP_CHOICE;
1210 }
1211 return common(state, tok);
1212}
1213
1214#ifdef XML_DTD
1215
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001216static int PTRCALL
1217condSect0(PROLOG_STATE *state,
1218 int tok,
1219 const char *ptr,
1220 const char *end,
1221 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001222{
1223 switch (tok) {
1224 case XML_TOK_PROLOG_S:
1225 return XML_ROLE_NONE;
1226 case XML_TOK_NAME:
1227 if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {
1228 state->handler = condSect1;
1229 return XML_ROLE_NONE;
1230 }
1231 if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {
1232 state->handler = condSect2;
1233 return XML_ROLE_NONE;
1234 }
1235 break;
1236 }
1237 return common(state, tok);
1238}
1239
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001240static int PTRCALL
1241condSect1(PROLOG_STATE *state,
1242 int tok,
1243 const char *ptr,
1244 const char *end,
1245 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001246{
1247 switch (tok) {
1248 case XML_TOK_PROLOG_S:
1249 return XML_ROLE_NONE;
1250 case XML_TOK_OPEN_BRACKET:
1251 state->handler = externalSubset1;
1252 state->includeLevel += 1;
1253 return XML_ROLE_NONE;
1254 }
1255 return common(state, tok);
1256}
1257
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001258static int PTRCALL
1259condSect2(PROLOG_STATE *state,
1260 int tok,
1261 const char *ptr,
1262 const char *end,
1263 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001264{
1265 switch (tok) {
1266 case XML_TOK_PROLOG_S:
1267 return XML_ROLE_NONE;
1268 case XML_TOK_OPEN_BRACKET:
1269 state->handler = externalSubset1;
1270 return XML_ROLE_IGNORE_SECT;
1271 }
1272 return common(state, tok);
1273}
1274
1275#endif /* XML_DTD */
1276
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001277static int PTRCALL
1278declClose(PROLOG_STATE *state,
1279 int tok,
1280 const char *ptr,
1281 const char *end,
1282 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001283{
1284 switch (tok) {
1285 case XML_TOK_PROLOG_S:
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001286 return state->role_none;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001287 case XML_TOK_DECL_CLOSE:
1288 setTopLevel(state);
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001289 return state->role_none;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001290 }
1291 return common(state, tok);
1292}
1293
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001294static int PTRCALL
1295error(PROLOG_STATE *state,
1296 int tok,
1297 const char *ptr,
1298 const char *end,
1299 const ENCODING *enc)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001300{
1301 return XML_ROLE_NONE;
1302}
1303
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001304static int FASTCALL
1305common(PROLOG_STATE *state, int tok)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001306{
1307#ifdef XML_DTD
1308 if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)
1309 return XML_ROLE_INNER_PARAM_ENTITY_REF;
1310#endif
1311 state->handler = error;
1312 return XML_ROLE_ERROR;
1313}
1314
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001315void
1316XmlPrologStateInit(PROLOG_STATE *state)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001317{
1318 state->handler = prolog0;
1319#ifdef XML_DTD
1320 state->documentEntity = 1;
1321 state->includeLevel = 0;
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001322 state->inEntityValue = 0;
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001323#endif /* XML_DTD */
1324}
1325
1326#ifdef XML_DTD
1327
Martin v. Löwisfc03a942003-01-25 22:41:29 +00001328void
1329XmlPrologStateInitExternalEntity(PROLOG_STATE *state)
Martin v. Löwis1dbb1ca2002-02-11 23:13:04 +00001330{
1331 state->handler = externalSubset0;
1332 state->documentEntity = 0;
1333 state->includeLevel = 0;
1334}
1335
1336#endif /* XML_DTD */