1104349Sphk/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
2104349Sphk   See the file COPYING for copying permission.
3104349Sphk*/
4104349Sphk
5178848Scokane#include <stddef.h>
6178848Scokane
7104349Sphk#ifdef COMPILED_FROM_DSP
8104349Sphk#include "winconfig.h"
9104349Sphk#elif defined(MACOS_CLASSIC)
10104349Sphk#include "macconfig.h"
11247513Sdelphij#elif defined(__amigaos__)
12178848Scokane#include "amigaconfig.h"
13178848Scokane#elif defined(__WATCOMC__)
14178848Scokane#include "watcomconfig.h"
15104349Sphk#else
16178848Scokane#ifdef HAVE_EXPAT_CONFIG_H
17104349Sphk#include <expat_config.h>
18178848Scokane#endif
19104349Sphk#endif /* ndef COMPILED_FROM_DSP */
20104349Sphk
21178848Scokane#include "expat_external.h"
22104349Sphk#include "internal.h"
23104349Sphk#include "xmlrole.h"
24104349Sphk#include "ascii.h"
25104349Sphk
26104349Sphk/* Doesn't check:
27104349Sphk
28104349Sphk that ,| are not mixed in a model group
29104349Sphk content of literals
30104349Sphk
31104349Sphk*/
32104349Sphk
33104349Sphkstatic const char KW_ANY[] = {
34104349Sphk    ASCII_A, ASCII_N, ASCII_Y, '\0' };
35104349Sphkstatic const char KW_ATTLIST[] = {
36104349Sphk    ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' };
37104349Sphkstatic const char KW_CDATA[] = {
38104349Sphk    ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
39104349Sphkstatic const char KW_DOCTYPE[] = {
40104349Sphk    ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' };
41104349Sphkstatic const char KW_ELEMENT[] = {
42104349Sphk    ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' };
43104349Sphkstatic const char KW_EMPTY[] = {
44104349Sphk    ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' };
45104349Sphkstatic const char KW_ENTITIES[] = {
46104349Sphk    ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S,
47104349Sphk    '\0' };
48104349Sphkstatic const char KW_ENTITY[] = {
49104349Sphk    ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };
50104349Sphkstatic const char KW_FIXED[] = {
51104349Sphk    ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' };
52104349Sphkstatic const char KW_ID[] = {
53104349Sphk    ASCII_I, ASCII_D, '\0' };
54104349Sphkstatic const char KW_IDREF[] = {
55104349Sphk    ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };
56104349Sphkstatic const char KW_IDREFS[] = {
57104349Sphk    ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };
58178848Scokane#ifdef XML_DTD
59104349Sphkstatic const char KW_IGNORE[] = {
60104349Sphk    ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' };
61178848Scokane#endif
62104349Sphkstatic const char KW_IMPLIED[] = {
63104349Sphk    ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' };
64178848Scokane#ifdef XML_DTD
65104349Sphkstatic const char KW_INCLUDE[] = {
66104349Sphk    ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' };
67178848Scokane#endif
68104349Sphkstatic const char KW_NDATA[] = {
69104349Sphk    ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
70104349Sphkstatic const char KW_NMTOKEN[] = {
71104349Sphk    ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };
72104349Sphkstatic const char KW_NMTOKENS[] = {
73104349Sphk    ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S,
74104349Sphk    '\0' };
75104349Sphkstatic const char KW_NOTATION[] =
76104349Sphk    { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N,
77104349Sphk      '\0' };
78104349Sphkstatic const char KW_PCDATA[] = {
79104349Sphk    ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
80104349Sphkstatic const char KW_PUBLIC[] = {
81104349Sphk    ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' };
82104349Sphkstatic const char KW_REQUIRED[] = {
83104349Sphk    ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D,
84104349Sphk    '\0' };
85104349Sphkstatic const char KW_SYSTEM[] = {
86104349Sphk    ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' };
87104349Sphk
88104349Sphk#ifndef MIN_BYTES_PER_CHAR
89104349Sphk#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
90104349Sphk#endif
91104349Sphk
92104349Sphk#ifdef XML_DTD
93104349Sphk#define setTopLevel(state) \
94104349Sphk  ((state)->handler = ((state)->documentEntity \
95104349Sphk                       ? internalSubset \
96104349Sphk                       : externalSubset1))
97104349Sphk#else /* not XML_DTD */
98104349Sphk#define setTopLevel(state) ((state)->handler = internalSubset)
99104349Sphk#endif /* not XML_DTD */
100104349Sphk
101178848Scokanetypedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state,
102178848Scokane                                   int tok,
103178848Scokane                                   const char *ptr,
104178848Scokane                                   const char *end,
105178848Scokane                                   const ENCODING *enc);
106104349Sphk
107104349Sphkstatic PROLOG_HANDLER
108104349Sphk  prolog0, prolog1, prolog2,
109104349Sphk  doctype0, doctype1, doctype2, doctype3, doctype4, doctype5,
110104349Sphk  internalSubset,
111104349Sphk  entity0, entity1, entity2, entity3, entity4, entity5, entity6,
112104349Sphk  entity7, entity8, entity9, entity10,
113104349Sphk  notation0, notation1, notation2, notation3, notation4,
114104349Sphk  attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6,
115104349Sphk  attlist7, attlist8, attlist9,
116104349Sphk  element0, element1, element2, element3, element4, element5, element6,
117104349Sphk  element7,
118104349Sphk#ifdef XML_DTD
119104349Sphk  externalSubset0, externalSubset1,
120104349Sphk  condSect0, condSect1, condSect2,
121104349Sphk#endif /* XML_DTD */
122104349Sphk  declClose,
123104349Sphk  error;
124104349Sphk
125104349Sphkstatic int FASTCALL common(PROLOG_STATE *state, int tok);
126104349Sphk
127178848Scokanestatic int PTRCALL
128104349Sphkprolog0(PROLOG_STATE *state,
129104349Sphk        int tok,
130104349Sphk        const char *ptr,
131104349Sphk        const char *end,
132104349Sphk        const ENCODING *enc)
133104349Sphk{
134104349Sphk  switch (tok) {
135104349Sphk  case XML_TOK_PROLOG_S:
136104349Sphk    state->handler = prolog1;
137104349Sphk    return XML_ROLE_NONE;
138104349Sphk  case XML_TOK_XML_DECL:
139104349Sphk    state->handler = prolog1;
140104349Sphk    return XML_ROLE_XML_DECL;
141104349Sphk  case XML_TOK_PI:
142104349Sphk    state->handler = prolog1;
143104349Sphk    return XML_ROLE_PI;
144104349Sphk  case XML_TOK_COMMENT:
145104349Sphk    state->handler = prolog1;
146104349Sphk    return XML_ROLE_COMMENT;
147104349Sphk  case XML_TOK_BOM:
148104349Sphk    return XML_ROLE_NONE;
149104349Sphk  case XML_TOK_DECL_OPEN:
150104349Sphk    if (!XmlNameMatchesAscii(enc,
151104349Sphk                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),
152104349Sphk                             end,
153104349Sphk                             KW_DOCTYPE))
154104349Sphk      break;
155104349Sphk    state->handler = doctype0;
156104349Sphk    return XML_ROLE_DOCTYPE_NONE;
157104349Sphk  case XML_TOK_INSTANCE_START:
158104349Sphk    state->handler = error;
159104349Sphk    return XML_ROLE_INSTANCE_START;
160104349Sphk  }
161104349Sphk  return common(state, tok);
162104349Sphk}
163104349Sphk
164178848Scokanestatic int PTRCALL
165104349Sphkprolog1(PROLOG_STATE *state,
166104349Sphk        int tok,
167104349Sphk        const char *ptr,
168104349Sphk        const char *end,
169104349Sphk        const ENCODING *enc)
170104349Sphk{
171104349Sphk  switch (tok) {
172104349Sphk  case XML_TOK_PROLOG_S:
173104349Sphk    return XML_ROLE_NONE;
174104349Sphk  case XML_TOK_PI:
175104349Sphk    return XML_ROLE_PI;
176104349Sphk  case XML_TOK_COMMENT:
177104349Sphk    return XML_ROLE_COMMENT;
178104349Sphk  case XML_TOK_BOM:
179104349Sphk    return XML_ROLE_NONE;
180104349Sphk  case XML_TOK_DECL_OPEN:
181104349Sphk    if (!XmlNameMatchesAscii(enc,
182104349Sphk                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),
183104349Sphk                             end,
184104349Sphk                             KW_DOCTYPE))
185104349Sphk      break;
186104349Sphk    state->handler = doctype0;
187104349Sphk    return XML_ROLE_DOCTYPE_NONE;
188104349Sphk  case XML_TOK_INSTANCE_START:
189104349Sphk    state->handler = error;
190104349Sphk    return XML_ROLE_INSTANCE_START;
191104349Sphk  }
192104349Sphk  return common(state, tok);
193104349Sphk}
194104349Sphk
195178848Scokanestatic int PTRCALL
196104349Sphkprolog2(PROLOG_STATE *state,
197104349Sphk        int tok,
198104349Sphk        const char *ptr,
199104349Sphk        const char *end,
200104349Sphk        const ENCODING *enc)
201104349Sphk{
202104349Sphk  switch (tok) {
203104349Sphk  case XML_TOK_PROLOG_S:
204104349Sphk    return XML_ROLE_NONE;
205104349Sphk  case XML_TOK_PI:
206104349Sphk    return XML_ROLE_PI;
207104349Sphk  case XML_TOK_COMMENT:
208104349Sphk    return XML_ROLE_COMMENT;
209104349Sphk  case XML_TOK_INSTANCE_START:
210104349Sphk    state->handler = error;
211104349Sphk    return XML_ROLE_INSTANCE_START;
212104349Sphk  }
213104349Sphk  return common(state, tok);
214104349Sphk}
215104349Sphk
216178848Scokanestatic int PTRCALL
217104349Sphkdoctype0(PROLOG_STATE *state,
218104349Sphk         int tok,
219104349Sphk         const char *ptr,
220104349Sphk         const char *end,
221104349Sphk         const ENCODING *enc)
222104349Sphk{
223104349Sphk  switch (tok) {
224104349Sphk  case XML_TOK_PROLOG_S:
225104349Sphk    return XML_ROLE_DOCTYPE_NONE;
226104349Sphk  case XML_TOK_NAME:
227104349Sphk  case XML_TOK_PREFIXED_NAME:
228104349Sphk    state->handler = doctype1;
229104349Sphk    return XML_ROLE_DOCTYPE_NAME;
230104349Sphk  }
231104349Sphk  return common(state, tok);
232104349Sphk}
233104349Sphk
234178848Scokanestatic int PTRCALL
235104349Sphkdoctype1(PROLOG_STATE *state,
236104349Sphk         int tok,
237104349Sphk         const char *ptr,
238104349Sphk         const char *end,
239104349Sphk         const ENCODING *enc)
240104349Sphk{
241104349Sphk  switch (tok) {
242104349Sphk  case XML_TOK_PROLOG_S:
243104349Sphk    return XML_ROLE_DOCTYPE_NONE;
244104349Sphk  case XML_TOK_OPEN_BRACKET:
245104349Sphk    state->handler = internalSubset;
246104349Sphk    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
247104349Sphk  case XML_TOK_DECL_CLOSE:
248104349Sphk    state->handler = prolog2;
249104349Sphk    return XML_ROLE_DOCTYPE_CLOSE;
250104349Sphk  case XML_TOK_NAME:
251104349Sphk    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
252104349Sphk      state->handler = doctype3;
253104349Sphk      return XML_ROLE_DOCTYPE_NONE;
254104349Sphk    }
255104349Sphk    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
256104349Sphk      state->handler = doctype2;
257104349Sphk      return XML_ROLE_DOCTYPE_NONE;
258104349Sphk    }
259104349Sphk    break;
260104349Sphk  }
261104349Sphk  return common(state, tok);
262104349Sphk}
263104349Sphk
264178848Scokanestatic int PTRCALL
265104349Sphkdoctype2(PROLOG_STATE *state,
266104349Sphk         int tok,
267104349Sphk         const char *ptr,
268104349Sphk         const char *end,
269104349Sphk         const ENCODING *enc)
270104349Sphk{
271104349Sphk  switch (tok) {
272104349Sphk  case XML_TOK_PROLOG_S:
273104349Sphk    return XML_ROLE_DOCTYPE_NONE;
274104349Sphk  case XML_TOK_LITERAL:
275104349Sphk    state->handler = doctype3;
276104349Sphk    return XML_ROLE_DOCTYPE_PUBLIC_ID;
277104349Sphk  }
278104349Sphk  return common(state, tok);
279104349Sphk}
280104349Sphk
281178848Scokanestatic int PTRCALL
282104349Sphkdoctype3(PROLOG_STATE *state,
283104349Sphk         int tok,
284104349Sphk         const char *ptr,
285104349Sphk         const char *end,
286104349Sphk         const ENCODING *enc)
287104349Sphk{
288104349Sphk  switch (tok) {
289104349Sphk  case XML_TOK_PROLOG_S:
290104349Sphk    return XML_ROLE_DOCTYPE_NONE;
291104349Sphk  case XML_TOK_LITERAL:
292104349Sphk    state->handler = doctype4;
293104349Sphk    return XML_ROLE_DOCTYPE_SYSTEM_ID;
294104349Sphk  }
295104349Sphk  return common(state, tok);
296104349Sphk}
297104349Sphk
298178848Scokanestatic int PTRCALL
299104349Sphkdoctype4(PROLOG_STATE *state,
300104349Sphk         int tok,
301104349Sphk         const char *ptr,
302104349Sphk         const char *end,
303104349Sphk         const ENCODING *enc)
304104349Sphk{
305104349Sphk  switch (tok) {
306104349Sphk  case XML_TOK_PROLOG_S:
307104349Sphk    return XML_ROLE_DOCTYPE_NONE;
308104349Sphk  case XML_TOK_OPEN_BRACKET:
309104349Sphk    state->handler = internalSubset;
310104349Sphk    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
311104349Sphk  case XML_TOK_DECL_CLOSE:
312104349Sphk    state->handler = prolog2;
313104349Sphk    return XML_ROLE_DOCTYPE_CLOSE;
314104349Sphk  }
315104349Sphk  return common(state, tok);
316104349Sphk}
317104349Sphk
318178848Scokanestatic int PTRCALL
319104349Sphkdoctype5(PROLOG_STATE *state,
320104349Sphk         int tok,
321104349Sphk         const char *ptr,
322104349Sphk         const char *end,
323104349Sphk         const ENCODING *enc)
324104349Sphk{
325104349Sphk  switch (tok) {
326104349Sphk  case XML_TOK_PROLOG_S:
327104349Sphk    return XML_ROLE_DOCTYPE_NONE;
328104349Sphk  case XML_TOK_DECL_CLOSE:
329104349Sphk    state->handler = prolog2;
330104349Sphk    return XML_ROLE_DOCTYPE_CLOSE;
331104349Sphk  }
332104349Sphk  return common(state, tok);
333104349Sphk}
334104349Sphk
335178848Scokanestatic int PTRCALL
336104349SphkinternalSubset(PROLOG_STATE *state,
337104349Sphk               int tok,
338104349Sphk               const char *ptr,
339104349Sphk               const char *end,
340104349Sphk               const ENCODING *enc)
341104349Sphk{
342104349Sphk  switch (tok) {
343104349Sphk  case XML_TOK_PROLOG_S:
344104349Sphk    return XML_ROLE_NONE;
345104349Sphk  case XML_TOK_DECL_OPEN:
346104349Sphk    if (XmlNameMatchesAscii(enc,
347104349Sphk                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),
348104349Sphk                            end,
349104349Sphk                            KW_ENTITY)) {
350104349Sphk      state->handler = entity0;
351104349Sphk      return XML_ROLE_ENTITY_NONE;
352104349Sphk    }
353104349Sphk    if (XmlNameMatchesAscii(enc,
354104349Sphk                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),
355104349Sphk                            end,
356104349Sphk                            KW_ATTLIST)) {
357104349Sphk      state->handler = attlist0;
358104349Sphk      return XML_ROLE_ATTLIST_NONE;
359104349Sphk    }
360104349Sphk    if (XmlNameMatchesAscii(enc,
361104349Sphk                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),
362104349Sphk                            end,
363104349Sphk                            KW_ELEMENT)) {
364104349Sphk      state->handler = element0;
365104349Sphk      return XML_ROLE_ELEMENT_NONE;
366104349Sphk    }
367104349Sphk    if (XmlNameMatchesAscii(enc,
368104349Sphk                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),
369104349Sphk                            end,
370104349Sphk                            KW_NOTATION)) {
371104349Sphk      state->handler = notation0;
372104349Sphk      return XML_ROLE_NOTATION_NONE;
373104349Sphk    }
374104349Sphk    break;
375104349Sphk  case XML_TOK_PI:
376104349Sphk    return XML_ROLE_PI;
377104349Sphk  case XML_TOK_COMMENT:
378104349Sphk    return XML_ROLE_COMMENT;
379104349Sphk  case XML_TOK_PARAM_ENTITY_REF:
380104349Sphk    return XML_ROLE_PARAM_ENTITY_REF;
381104349Sphk  case XML_TOK_CLOSE_BRACKET:
382104349Sphk    state->handler = doctype5;
383104349Sphk    return XML_ROLE_DOCTYPE_NONE;
384178848Scokane  case XML_TOK_NONE:
385178848Scokane    return XML_ROLE_NONE;
386104349Sphk  }
387104349Sphk  return common(state, tok);
388104349Sphk}
389104349Sphk
390104349Sphk#ifdef XML_DTD
391104349Sphk
392178848Scokanestatic int PTRCALL
393104349SphkexternalSubset0(PROLOG_STATE *state,
394104349Sphk                int tok,
395104349Sphk                const char *ptr,
396104349Sphk                const char *end,
397104349Sphk                const ENCODING *enc)
398104349Sphk{
399104349Sphk  state->handler = externalSubset1;
400104349Sphk  if (tok == XML_TOK_XML_DECL)
401104349Sphk    return XML_ROLE_TEXT_DECL;
402104349Sphk  return externalSubset1(state, tok, ptr, end, enc);
403104349Sphk}
404104349Sphk
405178848Scokanestatic int PTRCALL
406104349SphkexternalSubset1(PROLOG_STATE *state,
407104349Sphk                int tok,
408104349Sphk                const char *ptr,
409104349Sphk                const char *end,
410104349Sphk                const ENCODING *enc)
411104349Sphk{
412104349Sphk  switch (tok) {
413104349Sphk  case XML_TOK_COND_SECT_OPEN:
414104349Sphk    state->handler = condSect0;
415104349Sphk    return XML_ROLE_NONE;
416104349Sphk  case XML_TOK_COND_SECT_CLOSE:
417104349Sphk    if (state->includeLevel == 0)
418104349Sphk      break;
419104349Sphk    state->includeLevel -= 1;
420104349Sphk    return XML_ROLE_NONE;
421104349Sphk  case XML_TOK_PROLOG_S:
422104349Sphk    return XML_ROLE_NONE;
423104349Sphk  case XML_TOK_CLOSE_BRACKET:
424104349Sphk    break;
425104349Sphk  case XML_TOK_NONE:
426104349Sphk    if (state->includeLevel)
427104349Sphk      break;
428104349Sphk    return XML_ROLE_NONE;
429104349Sphk  default:
430104349Sphk    return internalSubset(state, tok, ptr, end, enc);
431104349Sphk  }
432104349Sphk  return common(state, tok);
433104349Sphk}
434104349Sphk
435104349Sphk#endif /* XML_DTD */
436104349Sphk
437178848Scokanestatic int PTRCALL
438104349Sphkentity0(PROLOG_STATE *state,
439104349Sphk        int tok,
440104349Sphk        const char *ptr,
441104349Sphk        const char *end,
442104349Sphk        const ENCODING *enc)
443104349Sphk{
444104349Sphk  switch (tok) {
445104349Sphk  case XML_TOK_PROLOG_S:
446104349Sphk    return XML_ROLE_ENTITY_NONE;
447104349Sphk  case XML_TOK_PERCENT:
448104349Sphk    state->handler = entity1;
449104349Sphk    return XML_ROLE_ENTITY_NONE;
450104349Sphk  case XML_TOK_NAME:
451104349Sphk    state->handler = entity2;
452104349Sphk    return XML_ROLE_GENERAL_ENTITY_NAME;
453104349Sphk  }
454104349Sphk  return common(state, tok);
455104349Sphk}
456104349Sphk
457178848Scokanestatic int PTRCALL
458104349Sphkentity1(PROLOG_STATE *state,
459104349Sphk        int tok,
460104349Sphk        const char *ptr,
461104349Sphk        const char *end,
462104349Sphk        const ENCODING *enc)
463104349Sphk{
464104349Sphk  switch (tok) {
465104349Sphk  case XML_TOK_PROLOG_S:
466104349Sphk    return XML_ROLE_ENTITY_NONE;
467104349Sphk  case XML_TOK_NAME:
468104349Sphk    state->handler = entity7;
469104349Sphk    return XML_ROLE_PARAM_ENTITY_NAME;
470104349Sphk  }
471104349Sphk  return common(state, tok);
472104349Sphk}
473104349Sphk
474178848Scokanestatic int PTRCALL
475104349Sphkentity2(PROLOG_STATE *state,
476104349Sphk        int tok,
477104349Sphk        const char *ptr,
478104349Sphk        const char *end,
479104349Sphk        const ENCODING *enc)
480104349Sphk{
481104349Sphk  switch (tok) {
482104349Sphk  case XML_TOK_PROLOG_S:
483104349Sphk    return XML_ROLE_ENTITY_NONE;
484104349Sphk  case XML_TOK_NAME:
485104349Sphk    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
486104349Sphk      state->handler = entity4;
487104349Sphk      return XML_ROLE_ENTITY_NONE;
488104349Sphk    }
489104349Sphk    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
490104349Sphk      state->handler = entity3;
491104349Sphk      return XML_ROLE_ENTITY_NONE;
492104349Sphk    }
493104349Sphk    break;
494104349Sphk  case XML_TOK_LITERAL:
495104349Sphk    state->handler = declClose;
496104349Sphk    state->role_none = XML_ROLE_ENTITY_NONE;
497104349Sphk    return XML_ROLE_ENTITY_VALUE;
498104349Sphk  }
499104349Sphk  return common(state, tok);
500104349Sphk}
501104349Sphk
502178848Scokanestatic int PTRCALL
503104349Sphkentity3(PROLOG_STATE *state,
504104349Sphk        int tok,
505104349Sphk        const char *ptr,
506104349Sphk        const char *end,
507104349Sphk        const ENCODING *enc)
508104349Sphk{
509104349Sphk  switch (tok) {
510104349Sphk  case XML_TOK_PROLOG_S:
511104349Sphk    return XML_ROLE_ENTITY_NONE;
512104349Sphk  case XML_TOK_LITERAL:
513104349Sphk    state->handler = entity4;
514104349Sphk    return XML_ROLE_ENTITY_PUBLIC_ID;
515104349Sphk  }
516104349Sphk  return common(state, tok);
517104349Sphk}
518104349Sphk
519178848Scokanestatic int PTRCALL
520104349Sphkentity4(PROLOG_STATE *state,
521104349Sphk        int tok,
522104349Sphk        const char *ptr,
523104349Sphk        const char *end,
524104349Sphk        const ENCODING *enc)
525104349Sphk{
526104349Sphk  switch (tok) {
527104349Sphk  case XML_TOK_PROLOG_S:
528104349Sphk    return XML_ROLE_ENTITY_NONE;
529104349Sphk  case XML_TOK_LITERAL:
530104349Sphk    state->handler = entity5;
531104349Sphk    return XML_ROLE_ENTITY_SYSTEM_ID;
532104349Sphk  }
533104349Sphk  return common(state, tok);
534104349Sphk}
535104349Sphk
536178848Scokanestatic int PTRCALL
537104349Sphkentity5(PROLOG_STATE *state,
538104349Sphk        int tok,
539104349Sphk        const char *ptr,
540104349Sphk        const char *end,
541104349Sphk        const ENCODING *enc)
542104349Sphk{
543104349Sphk  switch (tok) {
544104349Sphk  case XML_TOK_PROLOG_S:
545104349Sphk    return XML_ROLE_ENTITY_NONE;
546104349Sphk  case XML_TOK_DECL_CLOSE:
547104349Sphk    setTopLevel(state);
548104349Sphk    return XML_ROLE_ENTITY_COMPLETE;
549104349Sphk  case XML_TOK_NAME:
550104349Sphk    if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
551104349Sphk      state->handler = entity6;
552104349Sphk      return XML_ROLE_ENTITY_NONE;
553104349Sphk    }
554104349Sphk    break;
555104349Sphk  }
556104349Sphk  return common(state, tok);
557104349Sphk}
558104349Sphk
559178848Scokanestatic int PTRCALL
560104349Sphkentity6(PROLOG_STATE *state,
561104349Sphk        int tok,
562104349Sphk        const char *ptr,
563104349Sphk        const char *end,
564104349Sphk        const ENCODING *enc)
565104349Sphk{
566104349Sphk  switch (tok) {
567104349Sphk  case XML_TOK_PROLOG_S:
568104349Sphk    return XML_ROLE_ENTITY_NONE;
569104349Sphk  case XML_TOK_NAME:
570104349Sphk    state->handler = declClose;
571104349Sphk    state->role_none = XML_ROLE_ENTITY_NONE;
572104349Sphk    return XML_ROLE_ENTITY_NOTATION_NAME;
573104349Sphk  }
574104349Sphk  return common(state, tok);
575104349Sphk}
576104349Sphk
577178848Scokanestatic int PTRCALL
578104349Sphkentity7(PROLOG_STATE *state,
579104349Sphk        int tok,
580104349Sphk        const char *ptr,
581104349Sphk        const char *end,
582104349Sphk        const ENCODING *enc)
583104349Sphk{
584104349Sphk  switch (tok) {
585104349Sphk  case XML_TOK_PROLOG_S:
586104349Sphk    return XML_ROLE_ENTITY_NONE;
587104349Sphk  case XML_TOK_NAME:
588104349Sphk    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
589104349Sphk      state->handler = entity9;
590104349Sphk      return XML_ROLE_ENTITY_NONE;
591104349Sphk    }
592104349Sphk    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
593104349Sphk      state->handler = entity8;
594104349Sphk      return XML_ROLE_ENTITY_NONE;
595104349Sphk    }
596104349Sphk    break;
597104349Sphk  case XML_TOK_LITERAL:
598104349Sphk    state->handler = declClose;
599104349Sphk    state->role_none = XML_ROLE_ENTITY_NONE;
600104349Sphk    return XML_ROLE_ENTITY_VALUE;
601104349Sphk  }
602104349Sphk  return common(state, tok);
603104349Sphk}
604104349Sphk
605178848Scokanestatic int PTRCALL
606104349Sphkentity8(PROLOG_STATE *state,
607104349Sphk        int tok,
608104349Sphk        const char *ptr,
609104349Sphk        const char *end,
610104349Sphk        const ENCODING *enc)
611104349Sphk{
612104349Sphk  switch (tok) {
613104349Sphk  case XML_TOK_PROLOG_S:
614104349Sphk    return XML_ROLE_ENTITY_NONE;
615104349Sphk  case XML_TOK_LITERAL:
616104349Sphk    state->handler = entity9;
617104349Sphk    return XML_ROLE_ENTITY_PUBLIC_ID;
618104349Sphk  }
619104349Sphk  return common(state, tok);
620104349Sphk}
621104349Sphk
622178848Scokanestatic int PTRCALL
623104349Sphkentity9(PROLOG_STATE *state,
624104349Sphk        int tok,
625104349Sphk        const char *ptr,
626104349Sphk        const char *end,
627104349Sphk        const ENCODING *enc)
628104349Sphk{
629104349Sphk  switch (tok) {
630104349Sphk  case XML_TOK_PROLOG_S:
631104349Sphk    return XML_ROLE_ENTITY_NONE;
632104349Sphk  case XML_TOK_LITERAL:
633104349Sphk    state->handler = entity10;
634104349Sphk    return XML_ROLE_ENTITY_SYSTEM_ID;
635104349Sphk  }
636104349Sphk  return common(state, tok);
637104349Sphk}
638104349Sphk
639178848Scokanestatic int PTRCALL
640104349Sphkentity10(PROLOG_STATE *state,
641104349Sphk         int tok,
642104349Sphk         const char *ptr,
643104349Sphk         const char *end,
644104349Sphk         const ENCODING *enc)
645104349Sphk{
646104349Sphk  switch (tok) {
647104349Sphk  case XML_TOK_PROLOG_S:
648104349Sphk    return XML_ROLE_ENTITY_NONE;
649104349Sphk  case XML_TOK_DECL_CLOSE:
650104349Sphk    setTopLevel(state);
651104349Sphk    return XML_ROLE_ENTITY_COMPLETE;
652104349Sphk  }
653104349Sphk  return common(state, tok);
654104349Sphk}
655104349Sphk
656178848Scokanestatic int PTRCALL
657104349Sphknotation0(PROLOG_STATE *state,
658104349Sphk          int tok,
659104349Sphk          const char *ptr,
660104349Sphk          const char *end,
661104349Sphk          const ENCODING *enc)
662104349Sphk{
663104349Sphk  switch (tok) {
664104349Sphk  case XML_TOK_PROLOG_S:
665104349Sphk    return XML_ROLE_NOTATION_NONE;
666104349Sphk  case XML_TOK_NAME:
667104349Sphk    state->handler = notation1;
668104349Sphk    return XML_ROLE_NOTATION_NAME;
669104349Sphk  }
670104349Sphk  return common(state, tok);
671104349Sphk}
672104349Sphk
673178848Scokanestatic int PTRCALL
674104349Sphknotation1(PROLOG_STATE *state,
675104349Sphk          int tok,
676104349Sphk          const char *ptr,
677104349Sphk          const char *end,
678104349Sphk          const ENCODING *enc)
679104349Sphk{
680104349Sphk  switch (tok) {
681104349Sphk  case XML_TOK_PROLOG_S:
682104349Sphk    return XML_ROLE_NOTATION_NONE;
683104349Sphk  case XML_TOK_NAME:
684104349Sphk    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
685104349Sphk      state->handler = notation3;
686104349Sphk      return XML_ROLE_NOTATION_NONE;
687104349Sphk    }
688104349Sphk    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
689104349Sphk      state->handler = notation2;
690104349Sphk      return XML_ROLE_NOTATION_NONE;
691104349Sphk    }
692104349Sphk    break;
693104349Sphk  }
694104349Sphk  return common(state, tok);
695104349Sphk}
696104349Sphk
697178848Scokanestatic int PTRCALL
698104349Sphknotation2(PROLOG_STATE *state,
699104349Sphk          int tok,
700104349Sphk          const char *ptr,
701104349Sphk          const char *end,
702104349Sphk          const ENCODING *enc)
703104349Sphk{
704104349Sphk  switch (tok) {
705104349Sphk  case XML_TOK_PROLOG_S:
706104349Sphk    return XML_ROLE_NOTATION_NONE;
707104349Sphk  case XML_TOK_LITERAL:
708104349Sphk    state->handler = notation4;
709104349Sphk    return XML_ROLE_NOTATION_PUBLIC_ID;
710104349Sphk  }
711104349Sphk  return common(state, tok);
712104349Sphk}
713104349Sphk
714178848Scokanestatic int PTRCALL
715104349Sphknotation3(PROLOG_STATE *state,
716104349Sphk          int tok,
717104349Sphk          const char *ptr,
718104349Sphk          const char *end,
719104349Sphk          const ENCODING *enc)
720104349Sphk{
721104349Sphk  switch (tok) {
722104349Sphk  case XML_TOK_PROLOG_S:
723104349Sphk    return XML_ROLE_NOTATION_NONE;
724104349Sphk  case XML_TOK_LITERAL:
725104349Sphk    state->handler = declClose;
726104349Sphk    state->role_none = XML_ROLE_NOTATION_NONE;
727104349Sphk    return XML_ROLE_NOTATION_SYSTEM_ID;
728104349Sphk  }
729104349Sphk  return common(state, tok);
730104349Sphk}
731104349Sphk
732178848Scokanestatic int PTRCALL
733104349Sphknotation4(PROLOG_STATE *state,
734104349Sphk          int tok,
735104349Sphk          const char *ptr,
736104349Sphk          const char *end,
737104349Sphk          const ENCODING *enc)
738104349Sphk{
739104349Sphk  switch (tok) {
740104349Sphk  case XML_TOK_PROLOG_S:
741104349Sphk    return XML_ROLE_NOTATION_NONE;
742104349Sphk  case XML_TOK_LITERAL:
743104349Sphk    state->handler = declClose;
744104349Sphk    state->role_none = XML_ROLE_NOTATION_NONE;
745104349Sphk    return XML_ROLE_NOTATION_SYSTEM_ID;
746104349Sphk  case XML_TOK_DECL_CLOSE:
747104349Sphk    setTopLevel(state);
748104349Sphk    return XML_ROLE_NOTATION_NO_SYSTEM_ID;
749104349Sphk  }
750104349Sphk  return common(state, tok);
751104349Sphk}
752104349Sphk
753178848Scokanestatic int PTRCALL
754104349Sphkattlist0(PROLOG_STATE *state,
755104349Sphk         int tok,
756104349Sphk         const char *ptr,
757104349Sphk         const char *end,
758104349Sphk         const ENCODING *enc)
759104349Sphk{
760104349Sphk  switch (tok) {
761104349Sphk  case XML_TOK_PROLOG_S:
762104349Sphk    return XML_ROLE_ATTLIST_NONE;
763104349Sphk  case XML_TOK_NAME:
764104349Sphk  case XML_TOK_PREFIXED_NAME:
765104349Sphk    state->handler = attlist1;
766104349Sphk    return XML_ROLE_ATTLIST_ELEMENT_NAME;
767104349Sphk  }
768104349Sphk  return common(state, tok);
769104349Sphk}
770104349Sphk
771178848Scokanestatic int PTRCALL
772104349Sphkattlist1(PROLOG_STATE *state,
773104349Sphk         int tok,
774104349Sphk         const char *ptr,
775104349Sphk         const char *end,
776104349Sphk         const ENCODING *enc)
777104349Sphk{
778104349Sphk  switch (tok) {
779104349Sphk  case XML_TOK_PROLOG_S:
780104349Sphk    return XML_ROLE_ATTLIST_NONE;
781104349Sphk  case XML_TOK_DECL_CLOSE:
782104349Sphk    setTopLevel(state);
783104349Sphk    return XML_ROLE_ATTLIST_NONE;
784104349Sphk  case XML_TOK_NAME:
785104349Sphk  case XML_TOK_PREFIXED_NAME:
786104349Sphk    state->handler = attlist2;
787104349Sphk    return XML_ROLE_ATTRIBUTE_NAME;
788104349Sphk  }
789104349Sphk  return common(state, tok);
790104349Sphk}
791104349Sphk
792178848Scokanestatic int PTRCALL
793104349Sphkattlist2(PROLOG_STATE *state,
794104349Sphk         int tok,
795104349Sphk         const char *ptr,
796104349Sphk         const char *end,
797104349Sphk         const ENCODING *enc)
798104349Sphk{
799104349Sphk  switch (tok) {
800104349Sphk  case XML_TOK_PROLOG_S:
801104349Sphk    return XML_ROLE_ATTLIST_NONE;
802104349Sphk  case XML_TOK_NAME:
803104349Sphk    {
804178848Scokane      static const char * const types[] = {
805104349Sphk        KW_CDATA,
806104349Sphk        KW_ID,
807104349Sphk        KW_IDREF,
808104349Sphk        KW_IDREFS,
809104349Sphk        KW_ENTITY,
810104349Sphk        KW_ENTITIES,
811104349Sphk        KW_NMTOKEN,
812104349Sphk        KW_NMTOKENS,
813104349Sphk      };
814104349Sphk      int i;
815104349Sphk      for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++)
816104349Sphk        if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
817104349Sphk          state->handler = attlist8;
818104349Sphk          return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
819104349Sphk        }
820104349Sphk    }
821104349Sphk    if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
822104349Sphk      state->handler = attlist5;
823104349Sphk      return XML_ROLE_ATTLIST_NONE;
824104349Sphk    }
825104349Sphk    break;
826104349Sphk  case XML_TOK_OPEN_PAREN:
827104349Sphk    state->handler = attlist3;
828104349Sphk    return XML_ROLE_ATTLIST_NONE;
829104349Sphk  }
830104349Sphk  return common(state, tok);
831104349Sphk}
832104349Sphk
833178848Scokanestatic int PTRCALL
834104349Sphkattlist3(PROLOG_STATE *state,
835104349Sphk         int tok,
836104349Sphk         const char *ptr,
837104349Sphk         const char *end,
838104349Sphk         const ENCODING *enc)
839104349Sphk{
840104349Sphk  switch (tok) {
841104349Sphk  case XML_TOK_PROLOG_S:
842104349Sphk    return XML_ROLE_ATTLIST_NONE;
843104349Sphk  case XML_TOK_NMTOKEN:
844104349Sphk  case XML_TOK_NAME:
845104349Sphk  case XML_TOK_PREFIXED_NAME:
846104349Sphk    state->handler = attlist4;
847104349Sphk    return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
848104349Sphk  }
849104349Sphk  return common(state, tok);
850104349Sphk}
851104349Sphk
852178848Scokanestatic int PTRCALL
853104349Sphkattlist4(PROLOG_STATE *state,
854104349Sphk         int tok,
855104349Sphk         const char *ptr,
856104349Sphk         const char *end,
857104349Sphk         const ENCODING *enc)
858104349Sphk{
859104349Sphk  switch (tok) {
860104349Sphk  case XML_TOK_PROLOG_S:
861104349Sphk    return XML_ROLE_ATTLIST_NONE;
862104349Sphk  case XML_TOK_CLOSE_PAREN:
863104349Sphk    state->handler = attlist8;
864104349Sphk    return XML_ROLE_ATTLIST_NONE;
865104349Sphk  case XML_TOK_OR:
866104349Sphk    state->handler = attlist3;
867104349Sphk    return XML_ROLE_ATTLIST_NONE;
868104349Sphk  }
869104349Sphk  return common(state, tok);
870104349Sphk}
871104349Sphk
872178848Scokanestatic int PTRCALL
873104349Sphkattlist5(PROLOG_STATE *state,
874104349Sphk         int tok,
875104349Sphk         const char *ptr,
876104349Sphk         const char *end,
877104349Sphk         const ENCODING *enc)
878104349Sphk{
879104349Sphk  switch (tok) {
880104349Sphk  case XML_TOK_PROLOG_S:
881104349Sphk    return XML_ROLE_ATTLIST_NONE;
882104349Sphk  case XML_TOK_OPEN_PAREN:
883104349Sphk    state->handler = attlist6;
884104349Sphk    return XML_ROLE_ATTLIST_NONE;
885104349Sphk  }
886104349Sphk  return common(state, tok);
887104349Sphk}
888104349Sphk
889178848Scokanestatic int PTRCALL
890104349Sphkattlist6(PROLOG_STATE *state,
891104349Sphk         int tok,
892104349Sphk         const char *ptr,
893104349Sphk         const char *end,
894104349Sphk         const ENCODING *enc)
895104349Sphk{
896104349Sphk  switch (tok) {
897104349Sphk  case XML_TOK_PROLOG_S:
898104349Sphk    return XML_ROLE_ATTLIST_NONE;
899104349Sphk  case XML_TOK_NAME:
900104349Sphk    state->handler = attlist7;
901104349Sphk    return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
902104349Sphk  }
903104349Sphk  return common(state, tok);
904104349Sphk}
905104349Sphk
906178848Scokanestatic int PTRCALL
907104349Sphkattlist7(PROLOG_STATE *state,
908104349Sphk         int tok,
909104349Sphk         const char *ptr,
910104349Sphk         const char *end,
911104349Sphk         const ENCODING *enc)
912104349Sphk{
913104349Sphk  switch (tok) {
914104349Sphk  case XML_TOK_PROLOG_S:
915104349Sphk    return XML_ROLE_ATTLIST_NONE;
916104349Sphk  case XML_TOK_CLOSE_PAREN:
917104349Sphk    state->handler = attlist8;
918104349Sphk    return XML_ROLE_ATTLIST_NONE;
919104349Sphk  case XML_TOK_OR:
920104349Sphk    state->handler = attlist6;
921104349Sphk    return XML_ROLE_ATTLIST_NONE;
922104349Sphk  }
923104349Sphk  return common(state, tok);
924104349Sphk}
925104349Sphk
926104349Sphk/* default value */
927178848Scokanestatic int PTRCALL
928104349Sphkattlist8(PROLOG_STATE *state,
929104349Sphk         int tok,
930104349Sphk         const char *ptr,
931104349Sphk         const char *end,
932104349Sphk         const ENCODING *enc)
933104349Sphk{
934104349Sphk  switch (tok) {
935104349Sphk  case XML_TOK_PROLOG_S:
936104349Sphk    return XML_ROLE_ATTLIST_NONE;
937104349Sphk  case XML_TOK_POUND_NAME:
938104349Sphk    if (XmlNameMatchesAscii(enc,
939104349Sphk                            ptr + MIN_BYTES_PER_CHAR(enc),
940104349Sphk                            end,
941104349Sphk                            KW_IMPLIED)) {
942104349Sphk      state->handler = attlist1;
943104349Sphk      return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
944104349Sphk    }
945104349Sphk    if (XmlNameMatchesAscii(enc,
946104349Sphk                            ptr + MIN_BYTES_PER_CHAR(enc),
947104349Sphk                            end,
948104349Sphk                            KW_REQUIRED)) {
949104349Sphk      state->handler = attlist1;
950104349Sphk      return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
951104349Sphk    }
952104349Sphk    if (XmlNameMatchesAscii(enc,
953104349Sphk                            ptr + MIN_BYTES_PER_CHAR(enc),
954104349Sphk                            end,
955104349Sphk                            KW_FIXED)) {
956104349Sphk      state->handler = attlist9;
957104349Sphk      return XML_ROLE_ATTLIST_NONE;
958104349Sphk    }
959104349Sphk    break;
960104349Sphk  case XML_TOK_LITERAL:
961104349Sphk    state->handler = attlist1;
962104349Sphk    return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
963104349Sphk  }
964104349Sphk  return common(state, tok);
965104349Sphk}
966104349Sphk
967178848Scokanestatic int PTRCALL
968104349Sphkattlist9(PROLOG_STATE *state,
969104349Sphk         int tok,
970104349Sphk         const char *ptr,
971104349Sphk         const char *end,
972104349Sphk         const ENCODING *enc)
973104349Sphk{
974104349Sphk  switch (tok) {
975104349Sphk  case XML_TOK_PROLOG_S:
976104349Sphk    return XML_ROLE_ATTLIST_NONE;
977104349Sphk  case XML_TOK_LITERAL:
978104349Sphk    state->handler = attlist1;
979104349Sphk    return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
980104349Sphk  }
981104349Sphk  return common(state, tok);
982104349Sphk}
983104349Sphk
984178848Scokanestatic int PTRCALL
985104349Sphkelement0(PROLOG_STATE *state,
986104349Sphk         int tok,
987104349Sphk         const char *ptr,
988104349Sphk         const char *end,
989104349Sphk         const ENCODING *enc)
990104349Sphk{
991104349Sphk  switch (tok) {
992104349Sphk  case XML_TOK_PROLOG_S:
993104349Sphk    return XML_ROLE_ELEMENT_NONE;
994104349Sphk  case XML_TOK_NAME:
995104349Sphk  case XML_TOK_PREFIXED_NAME:
996104349Sphk    state->handler = element1;
997104349Sphk    return XML_ROLE_ELEMENT_NAME;
998104349Sphk  }
999104349Sphk  return common(state, tok);
1000104349Sphk}
1001104349Sphk
1002178848Scokanestatic int PTRCALL
1003104349Sphkelement1(PROLOG_STATE *state,
1004104349Sphk         int tok,
1005104349Sphk         const char *ptr,
1006104349Sphk         const char *end,
1007104349Sphk         const ENCODING *enc)
1008104349Sphk{
1009104349Sphk  switch (tok) {
1010104349Sphk  case XML_TOK_PROLOG_S:
1011104349Sphk    return XML_ROLE_ELEMENT_NONE;
1012104349Sphk  case XML_TOK_NAME:
1013104349Sphk    if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
1014104349Sphk      state->handler = declClose;
1015104349Sphk      state->role_none = XML_ROLE_ELEMENT_NONE;
1016104349Sphk      return XML_ROLE_CONTENT_EMPTY;
1017104349Sphk    }
1018104349Sphk    if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
1019104349Sphk      state->handler = declClose;
1020104349Sphk      state->role_none = XML_ROLE_ELEMENT_NONE;
1021104349Sphk      return XML_ROLE_CONTENT_ANY;
1022104349Sphk    }
1023104349Sphk    break;
1024104349Sphk  case XML_TOK_OPEN_PAREN:
1025104349Sphk    state->handler = element2;
1026104349Sphk    state->level = 1;
1027104349Sphk    return XML_ROLE_GROUP_OPEN;
1028104349Sphk  }
1029104349Sphk  return common(state, tok);
1030104349Sphk}
1031104349Sphk
1032178848Scokanestatic int PTRCALL
1033104349Sphkelement2(PROLOG_STATE *state,
1034104349Sphk         int tok,
1035104349Sphk         const char *ptr,
1036104349Sphk         const char *end,
1037104349Sphk         const ENCODING *enc)
1038104349Sphk{
1039104349Sphk  switch (tok) {
1040104349Sphk  case XML_TOK_PROLOG_S:
1041104349Sphk    return XML_ROLE_ELEMENT_NONE;
1042104349Sphk  case XML_TOK_POUND_NAME:
1043104349Sphk    if (XmlNameMatchesAscii(enc,
1044104349Sphk                            ptr + MIN_BYTES_PER_CHAR(enc),
1045104349Sphk                            end,
1046104349Sphk                            KW_PCDATA)) {
1047104349Sphk      state->handler = element3;
1048104349Sphk      return XML_ROLE_CONTENT_PCDATA;
1049104349Sphk    }
1050104349Sphk    break;
1051104349Sphk  case XML_TOK_OPEN_PAREN:
1052104349Sphk    state->level = 2;
1053104349Sphk    state->handler = element6;
1054104349Sphk    return XML_ROLE_GROUP_OPEN;
1055104349Sphk  case XML_TOK_NAME:
1056104349Sphk  case XML_TOK_PREFIXED_NAME:
1057104349Sphk    state->handler = element7;
1058104349Sphk    return XML_ROLE_CONTENT_ELEMENT;
1059104349Sphk  case XML_TOK_NAME_QUESTION:
1060104349Sphk    state->handler = element7;
1061104349Sphk    return XML_ROLE_CONTENT_ELEMENT_OPT;
1062104349Sphk  case XML_TOK_NAME_ASTERISK:
1063104349Sphk    state->handler = element7;
1064104349Sphk    return XML_ROLE_CONTENT_ELEMENT_REP;
1065104349Sphk  case XML_TOK_NAME_PLUS:
1066104349Sphk    state->handler = element7;
1067104349Sphk    return XML_ROLE_CONTENT_ELEMENT_PLUS;
1068104349Sphk  }
1069104349Sphk  return common(state, tok);
1070104349Sphk}
1071104349Sphk
1072178848Scokanestatic int PTRCALL
1073104349Sphkelement3(PROLOG_STATE *state,
1074104349Sphk         int tok,
1075104349Sphk         const char *ptr,
1076104349Sphk         const char *end,
1077104349Sphk         const ENCODING *enc)
1078104349Sphk{
1079104349Sphk  switch (tok) {
1080104349Sphk  case XML_TOK_PROLOG_S:
1081104349Sphk    return XML_ROLE_ELEMENT_NONE;
1082104349Sphk  case XML_TOK_CLOSE_PAREN:
1083104349Sphk    state->handler = declClose;
1084104349Sphk    state->role_none = XML_ROLE_ELEMENT_NONE;
1085104349Sphk    return XML_ROLE_GROUP_CLOSE;
1086104349Sphk  case XML_TOK_CLOSE_PAREN_ASTERISK:
1087104349Sphk    state->handler = declClose;
1088104349Sphk    state->role_none = XML_ROLE_ELEMENT_NONE;
1089104349Sphk    return XML_ROLE_GROUP_CLOSE_REP;
1090104349Sphk  case XML_TOK_OR:
1091104349Sphk    state->handler = element4;
1092104349Sphk    return XML_ROLE_ELEMENT_NONE;
1093104349Sphk  }
1094104349Sphk  return common(state, tok);
1095104349Sphk}
1096104349Sphk
1097178848Scokanestatic int PTRCALL
1098104349Sphkelement4(PROLOG_STATE *state,
1099104349Sphk         int tok,
1100104349Sphk         const char *ptr,
1101104349Sphk         const char *end,
1102104349Sphk         const ENCODING *enc)
1103104349Sphk{
1104104349Sphk  switch (tok) {
1105104349Sphk  case XML_TOK_PROLOG_S:
1106104349Sphk    return XML_ROLE_ELEMENT_NONE;
1107104349Sphk  case XML_TOK_NAME:
1108104349Sphk  case XML_TOK_PREFIXED_NAME:
1109104349Sphk    state->handler = element5;
1110104349Sphk    return XML_ROLE_CONTENT_ELEMENT;
1111104349Sphk  }
1112104349Sphk  return common(state, tok);
1113104349Sphk}
1114104349Sphk
1115178848Scokanestatic int PTRCALL
1116104349Sphkelement5(PROLOG_STATE *state,
1117104349Sphk         int tok,
1118104349Sphk         const char *ptr,
1119104349Sphk         const char *end,
1120104349Sphk         const ENCODING *enc)
1121104349Sphk{
1122104349Sphk  switch (tok) {
1123104349Sphk  case XML_TOK_PROLOG_S:
1124104349Sphk    return XML_ROLE_ELEMENT_NONE;
1125104349Sphk  case XML_TOK_CLOSE_PAREN_ASTERISK:
1126104349Sphk    state->handler = declClose;
1127104349Sphk    state->role_none = XML_ROLE_ELEMENT_NONE;
1128104349Sphk    return XML_ROLE_GROUP_CLOSE_REP;
1129104349Sphk  case XML_TOK_OR:
1130104349Sphk    state->handler = element4;
1131104349Sphk    return XML_ROLE_ELEMENT_NONE;
1132104349Sphk  }
1133104349Sphk  return common(state, tok);
1134104349Sphk}
1135104349Sphk
1136178848Scokanestatic int PTRCALL
1137104349Sphkelement6(PROLOG_STATE *state,
1138104349Sphk         int tok,
1139104349Sphk         const char *ptr,
1140104349Sphk         const char *end,
1141104349Sphk         const ENCODING *enc)
1142104349Sphk{
1143104349Sphk  switch (tok) {
1144104349Sphk  case XML_TOK_PROLOG_S:
1145104349Sphk    return XML_ROLE_ELEMENT_NONE;
1146104349Sphk  case XML_TOK_OPEN_PAREN:
1147104349Sphk    state->level += 1;
1148104349Sphk    return XML_ROLE_GROUP_OPEN;
1149104349Sphk  case XML_TOK_NAME:
1150104349Sphk  case XML_TOK_PREFIXED_NAME:
1151104349Sphk    state->handler = element7;
1152104349Sphk    return XML_ROLE_CONTENT_ELEMENT;
1153104349Sphk  case XML_TOK_NAME_QUESTION:
1154104349Sphk    state->handler = element7;
1155104349Sphk    return XML_ROLE_CONTENT_ELEMENT_OPT;
1156104349Sphk  case XML_TOK_NAME_ASTERISK:
1157104349Sphk    state->handler = element7;
1158104349Sphk    return XML_ROLE_CONTENT_ELEMENT_REP;
1159104349Sphk  case XML_TOK_NAME_PLUS:
1160104349Sphk    state->handler = element7;
1161104349Sphk    return XML_ROLE_CONTENT_ELEMENT_PLUS;
1162104349Sphk  }
1163104349Sphk  return common(state, tok);
1164104349Sphk}
1165104349Sphk
1166178848Scokanestatic int PTRCALL
1167104349Sphkelement7(PROLOG_STATE *state,
1168104349Sphk         int tok,
1169104349Sphk         const char *ptr,
1170104349Sphk         const char *end,
1171104349Sphk         const ENCODING *enc)
1172104349Sphk{
1173104349Sphk  switch (tok) {
1174104349Sphk  case XML_TOK_PROLOG_S:
1175104349Sphk    return XML_ROLE_ELEMENT_NONE;
1176104349Sphk  case XML_TOK_CLOSE_PAREN:
1177104349Sphk    state->level -= 1;
1178104349Sphk    if (state->level == 0) {
1179104349Sphk      state->handler = declClose;
1180104349Sphk      state->role_none = XML_ROLE_ELEMENT_NONE;
1181104349Sphk    }
1182104349Sphk    return XML_ROLE_GROUP_CLOSE;
1183104349Sphk  case XML_TOK_CLOSE_PAREN_ASTERISK:
1184104349Sphk    state->level -= 1;
1185104349Sphk    if (state->level == 0) {
1186104349Sphk      state->handler = declClose;
1187104349Sphk      state->role_none = XML_ROLE_ELEMENT_NONE;
1188104349Sphk    }
1189104349Sphk    return XML_ROLE_GROUP_CLOSE_REP;
1190104349Sphk  case XML_TOK_CLOSE_PAREN_QUESTION:
1191104349Sphk    state->level -= 1;
1192104349Sphk    if (state->level == 0) {
1193104349Sphk      state->handler = declClose;
1194104349Sphk      state->role_none = XML_ROLE_ELEMENT_NONE;
1195104349Sphk    }
1196104349Sphk    return XML_ROLE_GROUP_CLOSE_OPT;
1197104349Sphk  case XML_TOK_CLOSE_PAREN_PLUS:
1198104349Sphk    state->level -= 1;
1199104349Sphk    if (state->level == 0) {
1200104349Sphk      state->handler = declClose;
1201104349Sphk      state->role_none = XML_ROLE_ELEMENT_NONE;
1202104349Sphk    }
1203104349Sphk    return XML_ROLE_GROUP_CLOSE_PLUS;
1204104349Sphk  case XML_TOK_COMMA:
1205104349Sphk    state->handler = element6;
1206104349Sphk    return XML_ROLE_GROUP_SEQUENCE;
1207104349Sphk  case XML_TOK_OR:
1208104349Sphk    state->handler = element6;
1209104349Sphk    return XML_ROLE_GROUP_CHOICE;
1210104349Sphk  }
1211104349Sphk  return common(state, tok);
1212104349Sphk}
1213104349Sphk
1214104349Sphk#ifdef XML_DTD
1215104349Sphk
1216178848Scokanestatic int PTRCALL
1217104349SphkcondSect0(PROLOG_STATE *state,
1218104349Sphk          int tok,
1219104349Sphk          const char *ptr,
1220104349Sphk          const char *end,
1221104349Sphk          const ENCODING *enc)
1222104349Sphk{
1223104349Sphk  switch (tok) {
1224104349Sphk  case XML_TOK_PROLOG_S:
1225104349Sphk    return XML_ROLE_NONE;
1226104349Sphk  case XML_TOK_NAME:
1227104349Sphk    if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {
1228104349Sphk      state->handler = condSect1;
1229104349Sphk      return XML_ROLE_NONE;
1230104349Sphk    }
1231104349Sphk    if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {
1232104349Sphk      state->handler = condSect2;
1233104349Sphk      return XML_ROLE_NONE;
1234104349Sphk    }
1235104349Sphk    break;
1236104349Sphk  }
1237104349Sphk  return common(state, tok);
1238104349Sphk}
1239104349Sphk
1240178848Scokanestatic int PTRCALL
1241104349SphkcondSect1(PROLOG_STATE *state,
1242104349Sphk          int tok,
1243104349Sphk          const char *ptr,
1244104349Sphk          const char *end,
1245104349Sphk          const ENCODING *enc)
1246104349Sphk{
1247104349Sphk  switch (tok) {
1248104349Sphk  case XML_TOK_PROLOG_S:
1249104349Sphk    return XML_ROLE_NONE;
1250104349Sphk  case XML_TOK_OPEN_BRACKET:
1251104349Sphk    state->handler = externalSubset1;
1252104349Sphk    state->includeLevel += 1;
1253104349Sphk    return XML_ROLE_NONE;
1254104349Sphk  }
1255104349Sphk  return common(state, tok);
1256104349Sphk}
1257104349Sphk
1258178848Scokanestatic int PTRCALL
1259104349SphkcondSect2(PROLOG_STATE *state,
1260104349Sphk          int tok,
1261104349Sphk          const char *ptr,
1262104349Sphk          const char *end,
1263104349Sphk          const ENCODING *enc)
1264104349Sphk{
1265104349Sphk  switch (tok) {
1266104349Sphk  case XML_TOK_PROLOG_S:
1267104349Sphk    return XML_ROLE_NONE;
1268104349Sphk  case XML_TOK_OPEN_BRACKET:
1269104349Sphk    state->handler = externalSubset1;
1270104349Sphk    return XML_ROLE_IGNORE_SECT;
1271104349Sphk  }
1272104349Sphk  return common(state, tok);
1273104349Sphk}
1274104349Sphk
1275104349Sphk#endif /* XML_DTD */
1276104349Sphk
1277178848Scokanestatic int PTRCALL
1278104349SphkdeclClose(PROLOG_STATE *state,
1279104349Sphk          int tok,
1280104349Sphk          const char *ptr,
1281104349Sphk          const char *end,
1282104349Sphk          const ENCODING *enc)
1283104349Sphk{
1284104349Sphk  switch (tok) {
1285104349Sphk  case XML_TOK_PROLOG_S:
1286104349Sphk    return state->role_none;
1287104349Sphk  case XML_TOK_DECL_CLOSE:
1288104349Sphk    setTopLevel(state);
1289104349Sphk    return state->role_none;
1290104349Sphk  }
1291104349Sphk  return common(state, tok);
1292104349Sphk}
1293104349Sphk
1294178848Scokanestatic int PTRCALL
1295104349Sphkerror(PROLOG_STATE *state,
1296104349Sphk      int tok,
1297104349Sphk      const char *ptr,
1298104349Sphk      const char *end,
1299104349Sphk      const ENCODING *enc)
1300104349Sphk{
1301104349Sphk  return XML_ROLE_NONE;
1302104349Sphk}
1303104349Sphk
1304104349Sphkstatic int FASTCALL
1305104349Sphkcommon(PROLOG_STATE *state, int tok)
1306104349Sphk{
1307104349Sphk#ifdef XML_DTD
1308104349Sphk  if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)
1309104349Sphk    return XML_ROLE_INNER_PARAM_ENTITY_REF;
1310104349Sphk#endif
1311104349Sphk  state->handler = error;
1312104349Sphk  return XML_ROLE_ERROR;
1313104349Sphk}
1314104349Sphk
1315104349Sphkvoid
1316104349SphkXmlPrologStateInit(PROLOG_STATE *state)
1317104349Sphk{
1318104349Sphk  state->handler = prolog0;
1319104349Sphk#ifdef XML_DTD
1320104349Sphk  state->documentEntity = 1;
1321104349Sphk  state->includeLevel = 0;
1322104349Sphk  state->inEntityValue = 0;
1323104349Sphk#endif /* XML_DTD */
1324104349Sphk}
1325104349Sphk
1326104349Sphk#ifdef XML_DTD
1327104349Sphk
1328104349Sphkvoid
1329104349SphkXmlPrologStateInitExternalEntity(PROLOG_STATE *state)
1330104349Sphk{
1331104349Sphk  state->handler = externalSubset0;
1332104349Sphk  state->documentEntity = 0;
1333104349Sphk  state->includeLevel = 0;
1334104349Sphk}
1335104349Sphk
1336104349Sphk#endif /* XML_DTD */
1337