]> git.mxchange.org Git - simgear.git/blob - simgear/xml/xmlrole.c
Initial work on CMake support for SimGear.
[simgear.git] / simgear / xml / xmlrole.c
1 /*
2 The contents of this file are subject to the Mozilla Public License
3 Version 1.1 (the "License"); you may not use this file except in
4 compliance with the License. You may obtain a copy of the License at
5 http://www.mozilla.org/MPL/
6
7 Software distributed under the License is distributed on an "AS IS"
8 basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
9 License for the specific language governing rights and limitations
10 under the License.
11
12 The Original Code is expat.
13
14 The Initial Developer of the Original Code is James Clark.
15 Portions created by James Clark are Copyright (C) 1998, 1999
16 James Clark. All Rights Reserved.
17
18 Contributor(s):
19
20 Alternatively, the contents of this file may be used under the terms
21 of the GNU General Public License (the "GPL"), in which case the
22 provisions of the GPL are applicable instead of those above.  If you
23 wish to allow use of your version of this file only under the terms of
24 the GPL and not to allow others to use your version of this file under
25 the MPL, indicate your decision by deleting the provisions above and
26 replace them with the notice and other provisions required by the
27 GPL. If you do not delete the provisions above, a recipient may use
28 your version of this file under either the MPL or the GPL.
29 */
30
31 #include "xmldef.h"
32 #include "xmlrole.h"
33
34 /* Doesn't check:
35
36  that ,| are not mixed in a model group
37  content of literals
38
39 */
40
41 #ifndef MIN_BYTES_PER_CHAR
42 #define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
43 #endif
44
45 typedef int PROLOG_HANDLER(struct prolog_state *state,
46                            int tok,
47                            const char *ptr,
48                            const char *end,
49                            const ENCODING *enc);
50
51 static PROLOG_HANDLER
52   prolog0, prolog1, prolog2,
53   doctype0, doctype1, doctype2, doctype3, doctype4, doctype5,
54   internalSubset,
55   entity0, entity1, entity2, entity3, entity4, entity5, entity6,
56   entity7, entity8, entity9,
57   notation0, notation1, notation2, notation3, notation4,
58   attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6,
59   attlist7, attlist8, attlist9,
60   element0, element1, element2, element3, element4, element5, element6,
61   element7,
62   declClose,
63   error;
64
65 static
66 int syntaxError(PROLOG_STATE *);
67
68 static
69 int prolog0(PROLOG_STATE *state,
70             int tok,
71             const char *ptr,
72             const char *end,
73             const ENCODING *enc)
74 {
75   switch (tok) {
76   case XML_TOK_PROLOG_S:
77     state->handler = prolog1;
78     return XML_ROLE_NONE;
79   case XML_TOK_XML_DECL:
80     state->handler = prolog1;
81     return XML_ROLE_XML_DECL;
82   case XML_TOK_PI:
83     state->handler = prolog1;
84     return XML_ROLE_NONE;
85   case XML_TOK_COMMENT:
86     state->handler = prolog1;
87   case XML_TOK_BOM:
88     return XML_ROLE_NONE;
89   case XML_TOK_DECL_OPEN:
90     if (!XmlNameMatchesAscii(enc,
91                              ptr + 2 * MIN_BYTES_PER_CHAR(enc),
92                              "DOCTYPE"))
93       break;
94     state->handler = doctype0;
95     return XML_ROLE_NONE;
96   case XML_TOK_INSTANCE_START:
97     state->handler = error;
98     return XML_ROLE_INSTANCE_START;
99   }
100   return syntaxError(state);
101 }
102
103 static
104 int prolog1(PROLOG_STATE *state,
105             int tok,
106             const char *ptr,
107             const char *end,
108             const ENCODING *enc)
109 {
110   switch (tok) {
111   case XML_TOK_PROLOG_S:
112     return XML_ROLE_NONE;
113   case XML_TOK_PI:
114   case XML_TOK_COMMENT:
115   case XML_TOK_BOM:
116     return XML_ROLE_NONE;
117   case XML_TOK_DECL_OPEN:
118     if (!XmlNameMatchesAscii(enc,
119                              ptr + 2 * MIN_BYTES_PER_CHAR(enc),
120                              "DOCTYPE"))
121       break;
122     state->handler = doctype0;
123     return XML_ROLE_NONE;
124   case XML_TOK_INSTANCE_START:
125     state->handler = error;
126     return XML_ROLE_INSTANCE_START;
127   }
128   return syntaxError(state);
129 }
130
131 static
132 int prolog2(PROLOG_STATE *state,
133             int tok,
134             const char *ptr,
135             const char *end,
136             const ENCODING *enc)
137 {
138   switch (tok) {
139   case XML_TOK_PROLOG_S:
140     return XML_ROLE_NONE;
141   case XML_TOK_PI:
142   case XML_TOK_COMMENT:
143     return XML_ROLE_NONE;
144   case XML_TOK_INSTANCE_START:
145     state->handler = error;
146     return XML_ROLE_INSTANCE_START;
147   }
148   return syntaxError(state);
149 }
150
151 static
152 int doctype0(PROLOG_STATE *state,
153              int tok,
154              const char *ptr,
155              const char *end,
156              const ENCODING *enc)
157 {
158   switch (tok) {
159   case XML_TOK_PROLOG_S:
160     return XML_ROLE_NONE;
161   case XML_TOK_NAME:
162   case XML_TOK_PREFIXED_NAME:
163     state->handler = doctype1;
164     return XML_ROLE_DOCTYPE_NAME;
165   }
166   return syntaxError(state);
167 }
168
169 static
170 int doctype1(PROLOG_STATE *state,
171              int tok,
172              const char *ptr,
173              const char *end,
174              const ENCODING *enc)
175 {
176   switch (tok) {
177   case XML_TOK_PROLOG_S:
178     return XML_ROLE_NONE;
179   case XML_TOK_OPEN_BRACKET:
180     state->handler = internalSubset;
181     return XML_ROLE_NONE;
182   case XML_TOK_DECL_CLOSE:
183     state->handler = prolog2;
184     return XML_ROLE_DOCTYPE_CLOSE;
185   case XML_TOK_NAME:
186     if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) {
187       state->handler = doctype3;
188       return XML_ROLE_NONE;
189     }
190     if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) {
191       state->handler = doctype2;
192       return XML_ROLE_NONE;
193     }
194     break;
195   }
196   return syntaxError(state);
197 }
198
199 static
200 int doctype2(PROLOG_STATE *state,
201              int tok,
202              const char *ptr,
203              const char *end,
204              const ENCODING *enc)
205 {
206   switch (tok) {
207   case XML_TOK_PROLOG_S:
208     return XML_ROLE_NONE;
209   case XML_TOK_LITERAL:
210     state->handler = doctype3;
211     return XML_ROLE_DOCTYPE_PUBLIC_ID;
212   }
213   return syntaxError(state);
214 }
215
216 static
217 int doctype3(PROLOG_STATE *state,
218              int tok,
219              const char *ptr,
220              const char *end,
221              const ENCODING *enc)
222 {
223   switch (tok) {
224   case XML_TOK_PROLOG_S:
225     return XML_ROLE_NONE;
226   case XML_TOK_LITERAL:
227     state->handler = doctype4;
228     return XML_ROLE_DOCTYPE_SYSTEM_ID;
229   }
230   return syntaxError(state);
231 }
232
233 static
234 int doctype4(PROLOG_STATE *state,
235              int tok,
236              const char *ptr,
237              const char *end,
238              const ENCODING *enc)
239 {
240   switch (tok) {
241   case XML_TOK_PROLOG_S:
242     return XML_ROLE_NONE;
243   case XML_TOK_OPEN_BRACKET:
244     state->handler = internalSubset;
245     return XML_ROLE_NONE;
246   case XML_TOK_DECL_CLOSE:
247     state->handler = prolog2;
248     return XML_ROLE_DOCTYPE_CLOSE;
249   }
250   return syntaxError(state);
251 }
252
253 static
254 int doctype5(PROLOG_STATE *state,
255              int tok,
256              const char *ptr,
257              const char *end,
258              const ENCODING *enc)
259 {
260   switch (tok) {
261   case XML_TOK_PROLOG_S:
262     return XML_ROLE_NONE;
263   case XML_TOK_DECL_CLOSE:
264     state->handler = prolog2;
265     return XML_ROLE_DOCTYPE_CLOSE;
266   }
267   return syntaxError(state);
268 }
269
270 static
271 int internalSubset(PROLOG_STATE *state,
272                    int tok,
273                    const char *ptr,
274                    const char *end,
275                    const ENCODING *enc)
276 {
277   switch (tok) {
278   case XML_TOK_PROLOG_S:
279     return XML_ROLE_NONE;
280   case XML_TOK_DECL_OPEN:
281     if (XmlNameMatchesAscii(enc,
282                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),
283                             "ENTITY")) {
284       state->handler = entity0;
285       return XML_ROLE_NONE;
286     }
287     if (XmlNameMatchesAscii(enc,
288                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),
289                             "ATTLIST")) {
290       state->handler = attlist0;
291       return XML_ROLE_NONE;
292     }
293     if (XmlNameMatchesAscii(enc,
294                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),
295                             "ELEMENT")) {
296       state->handler = element0;
297       return XML_ROLE_NONE;
298     }
299     if (XmlNameMatchesAscii(enc,
300                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),
301                             "NOTATION")) {
302       state->handler = notation0;
303       return XML_ROLE_NONE;
304     }
305     break;
306   case XML_TOK_PI:
307   case XML_TOK_COMMENT:
308     return XML_ROLE_NONE;
309   case XML_TOK_PARAM_ENTITY_REF:
310     return XML_ROLE_PARAM_ENTITY_REF;
311   case XML_TOK_CLOSE_BRACKET:
312     state->handler = doctype5;
313     return XML_ROLE_NONE;
314   }
315   return syntaxError(state);
316 }
317
318 static
319 int entity0(PROLOG_STATE *state,
320             int tok,
321             const char *ptr,
322             const char *end,
323             const ENCODING *enc)
324 {
325   switch (tok) {
326   case XML_TOK_PROLOG_S:
327     return XML_ROLE_NONE;
328   case XML_TOK_PERCENT:
329     state->handler = entity1;
330     return XML_ROLE_NONE;
331   case XML_TOK_NAME:
332     state->handler = entity2;
333     return XML_ROLE_GENERAL_ENTITY_NAME;
334   }
335   return syntaxError(state);
336 }
337
338 static
339 int entity1(PROLOG_STATE *state,
340             int tok,
341             const char *ptr,
342             const char *end,
343             const ENCODING *enc)
344 {
345   switch (tok) {
346   case XML_TOK_PROLOG_S:
347     return XML_ROLE_NONE;
348   case XML_TOK_NAME:
349     state->handler = entity7;
350     return XML_ROLE_PARAM_ENTITY_NAME;
351   }
352   return syntaxError(state);
353 }
354
355 static
356 int entity2(PROLOG_STATE *state,
357             int tok,
358             const char *ptr,
359             const char *end,
360             const ENCODING *enc)
361 {
362   switch (tok) {
363   case XML_TOK_PROLOG_S:
364     return XML_ROLE_NONE;
365   case XML_TOK_NAME:
366     if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) {
367       state->handler = entity4;
368       return XML_ROLE_NONE;
369     }
370     if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) {
371       state->handler = entity3;
372       return XML_ROLE_NONE;
373     }
374     break;
375   case XML_TOK_LITERAL:
376     state->handler = declClose;
377     return XML_ROLE_ENTITY_VALUE;
378   }
379   return syntaxError(state);
380 }
381
382 static
383 int entity3(PROLOG_STATE *state,
384             int tok,
385             const char *ptr,
386             const char *end,
387             const ENCODING *enc)
388 {
389   switch (tok) {
390   case XML_TOK_PROLOG_S:
391     return XML_ROLE_NONE;
392   case XML_TOK_LITERAL:
393     state->handler = entity4;
394     return XML_ROLE_ENTITY_PUBLIC_ID;
395   }
396   return syntaxError(state);
397 }
398
399
400 static
401 int entity4(PROLOG_STATE *state,
402             int tok,
403             const char *ptr,
404             const char *end,
405             const ENCODING *enc)
406 {
407   switch (tok) {
408   case XML_TOK_PROLOG_S:
409     return XML_ROLE_NONE;
410   case XML_TOK_LITERAL:
411     state->handler = entity5;
412     return XML_ROLE_ENTITY_SYSTEM_ID;
413   }
414   return syntaxError(state);
415 }
416
417 static
418 int entity5(PROLOG_STATE *state,
419             int tok,
420             const char *ptr,
421             const char *end,
422             const ENCODING *enc)
423 {
424   switch (tok) {
425   case XML_TOK_PROLOG_S:
426     return XML_ROLE_NONE;
427   case XML_TOK_DECL_CLOSE:
428     state->handler = internalSubset;
429     return XML_ROLE_NONE;
430   case XML_TOK_NAME:
431     if (XmlNameMatchesAscii(enc, ptr, "NDATA")) {
432       state->handler = entity6;
433       return XML_ROLE_NONE;
434     }
435     break;
436   }
437   return syntaxError(state);
438 }
439
440 static
441 int entity6(PROLOG_STATE *state,
442             int tok,
443             const char *ptr,
444             const char *end,
445             const ENCODING *enc)
446 {
447   switch (tok) {
448   case XML_TOK_PROLOG_S:
449     return XML_ROLE_NONE;
450   case XML_TOK_NAME:
451     state->handler = declClose;
452     return XML_ROLE_ENTITY_NOTATION_NAME;
453   }
454   return syntaxError(state);
455 }
456
457 static
458 int entity7(PROLOG_STATE *state,
459             int tok,
460             const char *ptr,
461             const char *end,
462             const ENCODING *enc)
463 {
464   switch (tok) {
465   case XML_TOK_PROLOG_S:
466     return XML_ROLE_NONE;
467   case XML_TOK_NAME:
468     if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) {
469       state->handler = entity9;
470       return XML_ROLE_NONE;
471     }
472     if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) {
473       state->handler = entity8;
474       return XML_ROLE_NONE;
475     }
476     break;
477   case XML_TOK_LITERAL:
478     state->handler = declClose;
479     return XML_ROLE_ENTITY_VALUE;
480   }
481   return syntaxError(state);
482 }
483
484 static
485 int entity8(PROLOG_STATE *state,
486             int tok,
487             const char *ptr,
488             const char *end,
489             const ENCODING *enc)
490 {
491   switch (tok) {
492   case XML_TOK_PROLOG_S:
493     return XML_ROLE_NONE;
494   case XML_TOK_LITERAL:
495     state->handler = entity9;
496     return XML_ROLE_ENTITY_PUBLIC_ID;
497   }
498   return syntaxError(state);
499 }
500
501 static
502 int entity9(PROLOG_STATE *state,
503             int tok,
504             const char *ptr,
505             const char *end,
506             const ENCODING *enc)
507 {
508   switch (tok) {
509   case XML_TOK_PROLOG_S:
510     return XML_ROLE_NONE;
511   case XML_TOK_LITERAL:
512     state->handler = declClose;
513     return XML_ROLE_ENTITY_SYSTEM_ID;
514   }
515   return syntaxError(state);
516 }
517
518 static
519 int notation0(PROLOG_STATE *state,
520               int tok,
521               const char *ptr,
522               const char *end,
523               const ENCODING *enc)
524 {
525   switch (tok) {
526   case XML_TOK_PROLOG_S:
527     return XML_ROLE_NONE;
528   case XML_TOK_NAME:
529     state->handler = notation1;
530     return XML_ROLE_NOTATION_NAME;
531   }
532   return syntaxError(state);
533 }
534
535 static
536 int notation1(PROLOG_STATE *state,
537               int tok,
538               const char *ptr,
539               const char *end,
540               const ENCODING *enc)
541 {
542   switch (tok) {
543   case XML_TOK_PROLOG_S:
544     return XML_ROLE_NONE;
545   case XML_TOK_NAME:
546     if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) {
547       state->handler = notation3;
548       return XML_ROLE_NONE;
549     }
550     if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) {
551       state->handler = notation2;
552       return XML_ROLE_NONE;
553     }
554     break;
555   }
556   return syntaxError(state);
557 }
558
559 static
560 int notation2(PROLOG_STATE *state,
561               int tok,
562               const char *ptr,
563               const char *end,
564               const ENCODING *enc)
565 {
566   switch (tok) {
567   case XML_TOK_PROLOG_S:
568     return XML_ROLE_NONE;
569   case XML_TOK_LITERAL:
570     state->handler = notation4;
571     return XML_ROLE_NOTATION_PUBLIC_ID;
572   }
573   return syntaxError(state);
574 }
575
576 static
577 int notation3(PROLOG_STATE *state,
578               int tok,
579               const char *ptr,
580               const char *end,
581               const ENCODING *enc)
582 {
583   switch (tok) {
584   case XML_TOK_PROLOG_S:
585     return XML_ROLE_NONE;
586   case XML_TOK_LITERAL:
587     state->handler = declClose;
588     return XML_ROLE_NOTATION_SYSTEM_ID;
589   }
590   return syntaxError(state);
591 }
592
593 static
594 int notation4(PROLOG_STATE *state,
595               int tok,
596               const char *ptr,
597               const char *end,
598               const ENCODING *enc)
599 {
600   switch (tok) {
601   case XML_TOK_PROLOG_S:
602     return XML_ROLE_NONE;
603   case XML_TOK_LITERAL:
604     state->handler = declClose;
605     return XML_ROLE_NOTATION_SYSTEM_ID;
606   case XML_TOK_DECL_CLOSE:
607     state->handler = internalSubset;
608     return XML_ROLE_NOTATION_NO_SYSTEM_ID;
609   }
610   return syntaxError(state);
611 }
612
613 static
614 int attlist0(PROLOG_STATE *state,
615              int tok,
616              const char *ptr,
617              const char *end,
618              const ENCODING *enc)
619 {
620   switch (tok) {
621   case XML_TOK_PROLOG_S:
622     return XML_ROLE_NONE;
623   case XML_TOK_NAME:
624   case XML_TOK_PREFIXED_NAME:
625     state->handler = attlist1;
626     return XML_ROLE_ATTLIST_ELEMENT_NAME;
627   }
628   return syntaxError(state);
629 }
630
631 static
632 int attlist1(PROLOG_STATE *state,
633              int tok,
634              const char *ptr,
635              const char *end,
636              const ENCODING *enc)
637 {
638   switch (tok) {
639   case XML_TOK_PROLOG_S:
640     return XML_ROLE_NONE;
641   case XML_TOK_DECL_CLOSE:
642     state->handler = internalSubset;
643     return XML_ROLE_NONE;
644   case XML_TOK_NAME:
645   case XML_TOK_PREFIXED_NAME:
646     state->handler = attlist2;
647     return XML_ROLE_ATTRIBUTE_NAME;
648   }
649   return syntaxError(state);
650 }
651
652 static
653 int attlist2(PROLOG_STATE *state,
654              int tok,
655              const char *ptr,
656              const char *end,
657              const ENCODING *enc)
658 {
659   switch (tok) {
660   case XML_TOK_PROLOG_S:
661     return XML_ROLE_NONE;
662   case XML_TOK_NAME:
663     {
664       static const char *types[] = {
665         "CDATA",
666         "ID",
667         "IDREF",
668         "IDREFS",
669         "ENTITY",
670         "ENTITIES",
671         "NMTOKEN",
672         "NMTOKENS",
673       };
674       int i;
675       for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++)
676         if (XmlNameMatchesAscii(enc, ptr, types[i])) {
677           state->handler = attlist8;
678           return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
679         }
680     }
681     if (XmlNameMatchesAscii(enc, ptr, "NOTATION")) {
682       state->handler = attlist5;
683       return XML_ROLE_NONE;
684     }
685     break;
686   case XML_TOK_OPEN_PAREN:
687     state->handler = attlist3;
688     return XML_ROLE_NONE;
689   }
690   return syntaxError(state);
691 }
692
693 static
694 int attlist3(PROLOG_STATE *state,
695              int tok,
696              const char *ptr,
697              const char *end,
698              const ENCODING *enc)
699 {
700   switch (tok) {
701   case XML_TOK_PROLOG_S:
702     return XML_ROLE_NONE;
703   case XML_TOK_NMTOKEN:
704   case XML_TOK_NAME:
705   case XML_TOK_PREFIXED_NAME:
706     state->handler = attlist4;
707     return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
708   }
709   return syntaxError(state);
710 }
711
712 static
713 int attlist4(PROLOG_STATE *state,
714              int tok,
715              const char *ptr,
716              const char *end,
717              const ENCODING *enc)
718 {
719   switch (tok) {
720   case XML_TOK_PROLOG_S:
721     return XML_ROLE_NONE;
722   case XML_TOK_CLOSE_PAREN:
723     state->handler = attlist8;
724     return XML_ROLE_NONE;
725   case XML_TOK_OR:
726     state->handler = attlist3;
727     return XML_ROLE_NONE;
728   }
729   return syntaxError(state);
730 }
731
732 static
733 int attlist5(PROLOG_STATE *state,
734              int tok,
735              const char *ptr,
736              const char *end,
737              const ENCODING *enc)
738 {
739   switch (tok) {
740   case XML_TOK_PROLOG_S:
741     return XML_ROLE_NONE;
742   case XML_TOK_OPEN_PAREN:
743     state->handler = attlist6;
744     return XML_ROLE_NONE;
745   }
746   return syntaxError(state);
747 }
748
749
750 static
751 int attlist6(PROLOG_STATE *state,
752              int tok,
753              const char *ptr,
754              const char *end,
755              const ENCODING *enc)
756 {
757   switch (tok) {
758   case XML_TOK_PROLOG_S:
759     return XML_ROLE_NONE;
760   case XML_TOK_NAME:
761     state->handler = attlist7;
762     return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
763   }
764   return syntaxError(state);
765 }
766
767 static
768 int attlist7(PROLOG_STATE *state,
769              int tok,
770              const char *ptr,
771              const char *end,
772              const ENCODING *enc)
773 {
774   switch (tok) {
775   case XML_TOK_PROLOG_S:
776     return XML_ROLE_NONE;
777   case XML_TOK_CLOSE_PAREN:
778     state->handler = attlist8;
779     return XML_ROLE_NONE;
780   case XML_TOK_OR:
781     state->handler = attlist6;
782     return XML_ROLE_NONE;
783   }
784   return syntaxError(state);
785 }
786
787 /* default value */
788 static
789 int attlist8(PROLOG_STATE *state,
790              int tok,
791              const char *ptr,
792              const char *end,
793              const ENCODING *enc)
794 {
795   switch (tok) {
796   case XML_TOK_PROLOG_S:
797     return XML_ROLE_NONE;
798   case XML_TOK_POUND_NAME:
799     if (XmlNameMatchesAscii(enc,
800                             ptr + MIN_BYTES_PER_CHAR(enc),
801                             "IMPLIED")) {
802       state->handler = attlist1;
803       return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
804     }
805     if (XmlNameMatchesAscii(enc,
806                             ptr + MIN_BYTES_PER_CHAR(enc),
807                             "REQUIRED")) {
808       state->handler = attlist1;
809       return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
810     }
811     if (XmlNameMatchesAscii(enc,
812                             ptr + MIN_BYTES_PER_CHAR(enc),
813                             "FIXED")) {
814       state->handler = attlist9;
815       return XML_ROLE_NONE;
816     }
817     break;
818   case XML_TOK_LITERAL:
819     state->handler = attlist1;
820     return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
821   }
822   return syntaxError(state);
823 }
824
825 static
826 int attlist9(PROLOG_STATE *state,
827              int tok,
828              const char *ptr,
829              const char *end,
830              const ENCODING *enc)
831 {
832   switch (tok) {
833   case XML_TOK_PROLOG_S:
834     return XML_ROLE_NONE;
835   case XML_TOK_LITERAL:
836     state->handler = attlist1;
837     return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
838   }
839   return syntaxError(state);
840 }
841
842 static
843 int element0(PROLOG_STATE *state,
844              int tok,
845              const char *ptr,
846              const char *end,
847              const ENCODING *enc)
848 {
849   switch (tok) {
850   case XML_TOK_PROLOG_S:
851     return XML_ROLE_NONE;
852   case XML_TOK_NAME:
853   case XML_TOK_PREFIXED_NAME:
854     state->handler = element1;
855     return XML_ROLE_ELEMENT_NAME;
856   }
857   return syntaxError(state);
858 }
859
860 static
861 int element1(PROLOG_STATE *state,
862              int tok,
863              const char *ptr,
864              const char *end,
865              const ENCODING *enc)
866 {
867   switch (tok) {
868   case XML_TOK_PROLOG_S:
869     return XML_ROLE_NONE;
870   case XML_TOK_NAME:
871     if (XmlNameMatchesAscii(enc, ptr, "EMPTY")) {
872       state->handler = declClose;
873       return XML_ROLE_CONTENT_EMPTY;
874     }
875     if (XmlNameMatchesAscii(enc, ptr, "ANY")) {
876       state->handler = declClose;
877       return XML_ROLE_CONTENT_ANY;
878     }
879     break;
880   case XML_TOK_OPEN_PAREN:
881     state->handler = element2;
882     state->level = 1;
883     return XML_ROLE_GROUP_OPEN;
884   }
885   return syntaxError(state);
886 }
887
888 static
889 int element2(PROLOG_STATE *state,
890              int tok,
891              const char *ptr,
892              const char *end,
893              const ENCODING *enc)
894 {
895   switch (tok) {
896   case XML_TOK_PROLOG_S:
897     return XML_ROLE_NONE;
898   case XML_TOK_POUND_NAME:
899     if (XmlNameMatchesAscii(enc,
900                             ptr + MIN_BYTES_PER_CHAR(enc),
901                             "PCDATA")) {
902       state->handler = element3;
903       return XML_ROLE_CONTENT_PCDATA;
904     }
905     break;
906   case XML_TOK_OPEN_PAREN:
907     state->level = 2;
908     state->handler = element6;
909     return XML_ROLE_GROUP_OPEN;
910   case XML_TOK_NAME:
911   case XML_TOK_PREFIXED_NAME:
912     state->handler = element7;
913     return XML_ROLE_CONTENT_ELEMENT;
914   case XML_TOK_NAME_QUESTION:
915     state->handler = element7;
916     return XML_ROLE_CONTENT_ELEMENT_OPT;
917   case XML_TOK_NAME_ASTERISK:
918     state->handler = element7;
919     return XML_ROLE_CONTENT_ELEMENT_REP;
920   case XML_TOK_NAME_PLUS:
921     state->handler = element7;
922     return XML_ROLE_CONTENT_ELEMENT_PLUS;
923   }
924   return syntaxError(state);
925 }
926
927 static
928 int element3(PROLOG_STATE *state,
929              int tok,
930              const char *ptr,
931              const char *end,
932              const ENCODING *enc)
933 {
934   switch (tok) {
935   case XML_TOK_PROLOG_S:
936     return XML_ROLE_NONE;
937   case XML_TOK_CLOSE_PAREN:
938   case XML_TOK_CLOSE_PAREN_ASTERISK:
939     state->handler = declClose;
940     return XML_ROLE_GROUP_CLOSE_REP;
941   case XML_TOK_OR:
942     state->handler = element4;
943     return XML_ROLE_NONE;
944   }
945   return syntaxError(state);
946 }
947
948 static
949 int element4(PROLOG_STATE *state,
950              int tok,
951              const char *ptr,
952              const char *end,
953              const ENCODING *enc)
954 {
955   switch (tok) {
956   case XML_TOK_PROLOG_S:
957     return XML_ROLE_NONE;
958   case XML_TOK_NAME:
959   case XML_TOK_PREFIXED_NAME:
960     state->handler = element5;
961     return XML_ROLE_CONTENT_ELEMENT;
962   }
963   return syntaxError(state);
964 }
965
966 static
967 int element5(PROLOG_STATE *state,
968              int tok,
969              const char *ptr,
970              const char *end,
971              const ENCODING *enc)
972 {
973   switch (tok) {
974   case XML_TOK_PROLOG_S:
975     return XML_ROLE_NONE;
976   case XML_TOK_CLOSE_PAREN_ASTERISK:
977     state->handler = declClose;
978     return XML_ROLE_GROUP_CLOSE_REP;
979   case XML_TOK_OR:
980     state->handler = element4;
981     return XML_ROLE_NONE;
982   }
983   return syntaxError(state);
984 }
985
986 static
987 int element6(PROLOG_STATE *state,
988              int tok,
989              const char *ptr,
990              const char *end,
991              const ENCODING *enc)
992 {
993   switch (tok) {
994   case XML_TOK_PROLOG_S:
995     return XML_ROLE_NONE;
996   case XML_TOK_OPEN_PAREN:
997     state->level += 1;
998     return XML_ROLE_GROUP_OPEN;
999   case XML_TOK_NAME:
1000   case XML_TOK_PREFIXED_NAME:
1001     state->handler = element7;
1002     return XML_ROLE_CONTENT_ELEMENT;
1003   case XML_TOK_NAME_QUESTION:
1004     state->handler = element7;
1005     return XML_ROLE_CONTENT_ELEMENT_OPT;
1006   case XML_TOK_NAME_ASTERISK:
1007     state->handler = element7;
1008     return XML_ROLE_CONTENT_ELEMENT_REP;
1009   case XML_TOK_NAME_PLUS:
1010     state->handler = element7;
1011     return XML_ROLE_CONTENT_ELEMENT_PLUS;
1012   }
1013   return syntaxError(state);
1014 }
1015
1016 static
1017 int element7(PROLOG_STATE *state,
1018              int tok,
1019              const char *ptr,
1020              const char *end,
1021              const ENCODING *enc)
1022 {
1023   switch (tok) {
1024   case XML_TOK_PROLOG_S:
1025     return XML_ROLE_NONE;
1026   case XML_TOK_CLOSE_PAREN:
1027     state->level -= 1;
1028     if (state->level == 0)
1029       state->handler = declClose;
1030     return XML_ROLE_GROUP_CLOSE;
1031   case XML_TOK_CLOSE_PAREN_ASTERISK:
1032     state->level -= 1;
1033     if (state->level == 0)
1034       state->handler = declClose;
1035     return XML_ROLE_GROUP_CLOSE_REP;
1036   case XML_TOK_CLOSE_PAREN_QUESTION:
1037     state->level -= 1;
1038     if (state->level == 0)
1039       state->handler = declClose;
1040     return XML_ROLE_GROUP_CLOSE_OPT;
1041   case XML_TOK_CLOSE_PAREN_PLUS:
1042     state->level -= 1;
1043     if (state->level == 0)
1044       state->handler = declClose;
1045     return XML_ROLE_GROUP_CLOSE_PLUS;
1046   case XML_TOK_COMMA:
1047     state->handler = element6;
1048     return XML_ROLE_GROUP_SEQUENCE;
1049   case XML_TOK_OR:
1050     state->handler = element6;
1051     return XML_ROLE_GROUP_CHOICE;
1052   }
1053   return syntaxError(state);
1054 }
1055
1056 static
1057 int declClose(PROLOG_STATE *state,
1058               int tok,
1059               const char *ptr,
1060               const char *end,
1061               const ENCODING *enc)
1062 {
1063   switch (tok) {
1064   case XML_TOK_PROLOG_S:
1065     return XML_ROLE_NONE;
1066   case XML_TOK_DECL_CLOSE:
1067     state->handler = internalSubset;
1068     return XML_ROLE_NONE;
1069   }
1070   return syntaxError(state);
1071 }
1072
1073 #if 0
1074
1075 static
1076 int ignore(PROLOG_STATE *state,
1077            int tok,
1078            const char *ptr,
1079            const char *end,
1080            const ENCODING *enc)
1081 {
1082   switch (tok) {
1083   case XML_TOK_DECL_CLOSE:
1084     state->handler = internalSubset;
1085     return 0;
1086   default:
1087     return XML_ROLE_NONE;
1088   }
1089   return syntaxError(state);
1090 }
1091 #endif
1092
1093 static
1094 int error(PROLOG_STATE *state,
1095            int tok,
1096            const char *ptr,
1097            const char *end,
1098            const ENCODING *enc)
1099 {
1100   return XML_ROLE_NONE;
1101 }
1102
1103 static
1104 int syntaxError(PROLOG_STATE *state)
1105 {
1106   state->handler = error;
1107   return XML_ROLE_ERROR;
1108 }
1109
1110 void XmlPrologStateInit(PROLOG_STATE *state)
1111 {
1112   state->handler = prolog0;
1113 }