Annotation of embedaddon/expat/lib/xmlrole.c, revision 1.1.1.1
1.1 misho 1: /* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
2: See the file COPYING for copying permission.
3: */
4:
5: #include <stddef.h>
6:
7: #ifdef COMPILED_FROM_DSP
8: #include "winconfig.h"
9: #elif defined(MACOS_CLASSIC)
10: #include "macconfig.h"
11: #elif defined(__amigaos4__)
12: #include "amigaconfig.h"
13: #elif defined(__WATCOMC__)
14: #include "watcomconfig.h"
15: #else
16: #ifdef HAVE_EXPAT_CONFIG_H
17: #include <expat_config.h>
18: #endif
19: #endif /* ndef COMPILED_FROM_DSP */
20:
21: #include "expat_external.h"
22: #include "internal.h"
23: #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:
33: static const char KW_ANY[] = {
34: ASCII_A, ASCII_N, ASCII_Y, '\0' };
35: static const char KW_ATTLIST[] = {
36: ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' };
37: static const char KW_CDATA[] = {
38: ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
39: static const char KW_DOCTYPE[] = {
40: ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' };
41: static const char KW_ELEMENT[] = {
42: ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' };
43: static const char KW_EMPTY[] = {
44: ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' };
45: static const char KW_ENTITIES[] = {
46: ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S,
47: '\0' };
48: static const char KW_ENTITY[] = {
49: ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };
50: static const char KW_FIXED[] = {
51: ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' };
52: static const char KW_ID[] = {
53: ASCII_I, ASCII_D, '\0' };
54: static const char KW_IDREF[] = {
55: ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };
56: static const char KW_IDREFS[] = {
57: ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };
58: #ifdef XML_DTD
59: static const char KW_IGNORE[] = {
60: ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' };
61: #endif
62: static const char KW_IMPLIED[] = {
63: ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' };
64: #ifdef XML_DTD
65: static const char KW_INCLUDE[] = {
66: ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' };
67: #endif
68: static const char KW_NDATA[] = {
69: ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
70: static const char KW_NMTOKEN[] = {
71: ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };
72: static const char KW_NMTOKENS[] = {
73: ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S,
74: '\0' };
75: static const char KW_NOTATION[] =
76: { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N,
77: '\0' };
78: static const char KW_PCDATA[] = {
79: ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
80: static const char KW_PUBLIC[] = {
81: ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' };
82: static const char KW_REQUIRED[] = {
83: ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D,
84: '\0' };
85: static const char KW_SYSTEM[] = {
86: ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' };
87:
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:
101: typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state,
102: int tok,
103: const char *ptr,
104: const char *end,
105: const ENCODING *enc);
106:
107: static PROLOG_HANDLER
108: prolog0, prolog1, prolog2,
109: doctype0, doctype1, doctype2, doctype3, doctype4, doctype5,
110: internalSubset,
111: entity0, entity1, entity2, entity3, entity4, entity5, entity6,
112: entity7, entity8, entity9, entity10,
113: 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:
125: static int FASTCALL common(PROLOG_STATE *state, int tok);
126:
127: static int PTRCALL
128: prolog0(PROLOG_STATE *state,
129: int tok,
130: const char *ptr,
131: const char *end,
132: const ENCODING *enc)
133: {
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;
143: return XML_ROLE_PI;
144: case XML_TOK_COMMENT:
145: state->handler = prolog1;
146: return XML_ROLE_COMMENT;
147: case XML_TOK_BOM:
148: return XML_ROLE_NONE;
149: case XML_TOK_DECL_OPEN:
150: if (!XmlNameMatchesAscii(enc,
151: ptr + 2 * MIN_BYTES_PER_CHAR(enc),
152: end,
153: KW_DOCTYPE))
154: break;
155: state->handler = doctype0;
156: return XML_ROLE_DOCTYPE_NONE;
157: case XML_TOK_INSTANCE_START:
158: state->handler = error;
159: return XML_ROLE_INSTANCE_START;
160: }
161: return common(state, tok);
162: }
163:
164: static int PTRCALL
165: prolog1(PROLOG_STATE *state,
166: int tok,
167: const char *ptr,
168: const char *end,
169: const ENCODING *enc)
170: {
171: switch (tok) {
172: case XML_TOK_PROLOG_S:
173: return XML_ROLE_NONE;
174: case XML_TOK_PI:
175: return XML_ROLE_PI;
176: case XML_TOK_COMMENT:
177: return XML_ROLE_COMMENT;
178: case XML_TOK_BOM:
179: return XML_ROLE_NONE;
180: case XML_TOK_DECL_OPEN:
181: if (!XmlNameMatchesAscii(enc,
182: ptr + 2 * MIN_BYTES_PER_CHAR(enc),
183: end,
184: KW_DOCTYPE))
185: break;
186: state->handler = doctype0;
187: return XML_ROLE_DOCTYPE_NONE;
188: case XML_TOK_INSTANCE_START:
189: state->handler = error;
190: return XML_ROLE_INSTANCE_START;
191: }
192: return common(state, tok);
193: }
194:
195: static int PTRCALL
196: prolog2(PROLOG_STATE *state,
197: int tok,
198: const char *ptr,
199: const char *end,
200: const ENCODING *enc)
201: {
202: switch (tok) {
203: case XML_TOK_PROLOG_S:
204: return XML_ROLE_NONE;
205: case XML_TOK_PI:
206: return XML_ROLE_PI;
207: case XML_TOK_COMMENT:
208: return XML_ROLE_COMMENT;
209: case XML_TOK_INSTANCE_START:
210: state->handler = error;
211: return XML_ROLE_INSTANCE_START;
212: }
213: return common(state, tok);
214: }
215:
216: static int PTRCALL
217: doctype0(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_DOCTYPE_NONE;
226: 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:
234: static int PTRCALL
235: doctype1(PROLOG_STATE *state,
236: int tok,
237: const char *ptr,
238: const char *end,
239: const ENCODING *enc)
240: {
241: switch (tok) {
242: case XML_TOK_PROLOG_S:
243: return XML_ROLE_DOCTYPE_NONE;
244: 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;
253: return XML_ROLE_DOCTYPE_NONE;
254: }
255: if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
256: state->handler = doctype2;
257: return XML_ROLE_DOCTYPE_NONE;
258: }
259: break;
260: }
261: return common(state, tok);
262: }
263:
264: static int PTRCALL
265: doctype2(PROLOG_STATE *state,
266: int tok,
267: const char *ptr,
268: const char *end,
269: const ENCODING *enc)
270: {
271: switch (tok) {
272: case XML_TOK_PROLOG_S:
273: return XML_ROLE_DOCTYPE_NONE;
274: case XML_TOK_LITERAL:
275: state->handler = doctype3;
276: return XML_ROLE_DOCTYPE_PUBLIC_ID;
277: }
278: return common(state, tok);
279: }
280:
281: static int PTRCALL
282: doctype3(PROLOG_STATE *state,
283: int tok,
284: const char *ptr,
285: const char *end,
286: const ENCODING *enc)
287: {
288: switch (tok) {
289: case XML_TOK_PROLOG_S:
290: return XML_ROLE_DOCTYPE_NONE;
291: case XML_TOK_LITERAL:
292: state->handler = doctype4;
293: return XML_ROLE_DOCTYPE_SYSTEM_ID;
294: }
295: return common(state, tok);
296: }
297:
298: static int PTRCALL
299: doctype4(PROLOG_STATE *state,
300: int tok,
301: const char *ptr,
302: const char *end,
303: const ENCODING *enc)
304: {
305: switch (tok) {
306: case XML_TOK_PROLOG_S:
307: return XML_ROLE_DOCTYPE_NONE;
308: 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:
318: static int PTRCALL
319: doctype5(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_DOCTYPE_NONE;
328: case XML_TOK_DECL_CLOSE:
329: state->handler = prolog2;
330: return XML_ROLE_DOCTYPE_CLOSE;
331: }
332: return common(state, tok);
333: }
334:
335: static int PTRCALL
336: internalSubset(PROLOG_STATE *state,
337: int tok,
338: const char *ptr,
339: const char *end,
340: const ENCODING *enc)
341: {
342: switch (tok) {
343: case XML_TOK_PROLOG_S:
344: return XML_ROLE_NONE;
345: case XML_TOK_DECL_OPEN:
346: if (XmlNameMatchesAscii(enc,
347: ptr + 2 * MIN_BYTES_PER_CHAR(enc),
348: end,
349: KW_ENTITY)) {
350: state->handler = entity0;
351: return XML_ROLE_ENTITY_NONE;
352: }
353: if (XmlNameMatchesAscii(enc,
354: ptr + 2 * MIN_BYTES_PER_CHAR(enc),
355: end,
356: KW_ATTLIST)) {
357: state->handler = attlist0;
358: return XML_ROLE_ATTLIST_NONE;
359: }
360: if (XmlNameMatchesAscii(enc,
361: ptr + 2 * MIN_BYTES_PER_CHAR(enc),
362: end,
363: KW_ELEMENT)) {
364: state->handler = element0;
365: return XML_ROLE_ELEMENT_NONE;
366: }
367: if (XmlNameMatchesAscii(enc,
368: ptr + 2 * MIN_BYTES_PER_CHAR(enc),
369: end,
370: KW_NOTATION)) {
371: state->handler = notation0;
372: return XML_ROLE_NOTATION_NONE;
373: }
374: break;
375: case XML_TOK_PI:
376: return XML_ROLE_PI;
377: case XML_TOK_COMMENT:
378: return XML_ROLE_COMMENT;
379: case XML_TOK_PARAM_ENTITY_REF:
380: return XML_ROLE_PARAM_ENTITY_REF;
381: case XML_TOK_CLOSE_BRACKET:
382: state->handler = doctype5;
383: return XML_ROLE_DOCTYPE_NONE;
384: case XML_TOK_NONE:
385: return XML_ROLE_NONE;
386: }
387: return common(state, tok);
388: }
389:
390: #ifdef XML_DTD
391:
392: static int PTRCALL
393: externalSubset0(PROLOG_STATE *state,
394: int tok,
395: const char *ptr,
396: const char *end,
397: const ENCODING *enc)
398: {
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:
405: static int PTRCALL
406: externalSubset1(PROLOG_STATE *state,
407: int tok,
408: const char *ptr,
409: const char *end,
410: const ENCODING *enc)
411: {
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:
437: static int PTRCALL
438: entity0(PROLOG_STATE *state,
439: int tok,
440: const char *ptr,
441: const char *end,
442: const ENCODING *enc)
443: {
444: switch (tok) {
445: case XML_TOK_PROLOG_S:
446: return XML_ROLE_ENTITY_NONE;
447: case XML_TOK_PERCENT:
448: state->handler = entity1;
449: return XML_ROLE_ENTITY_NONE;
450: case XML_TOK_NAME:
451: state->handler = entity2;
452: return XML_ROLE_GENERAL_ENTITY_NAME;
453: }
454: return common(state, tok);
455: }
456:
457: static int PTRCALL
458: entity1(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_ENTITY_NONE;
467: case XML_TOK_NAME:
468: state->handler = entity7;
469: return XML_ROLE_PARAM_ENTITY_NAME;
470: }
471: return common(state, tok);
472: }
473:
474: static int PTRCALL
475: entity2(PROLOG_STATE *state,
476: int tok,
477: const char *ptr,
478: const char *end,
479: const ENCODING *enc)
480: {
481: switch (tok) {
482: case XML_TOK_PROLOG_S:
483: return XML_ROLE_ENTITY_NONE;
484: case XML_TOK_NAME:
485: if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
486: state->handler = entity4;
487: return XML_ROLE_ENTITY_NONE;
488: }
489: if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
490: state->handler = entity3;
491: return XML_ROLE_ENTITY_NONE;
492: }
493: break;
494: case XML_TOK_LITERAL:
495: state->handler = declClose;
496: state->role_none = XML_ROLE_ENTITY_NONE;
497: return XML_ROLE_ENTITY_VALUE;
498: }
499: return common(state, tok);
500: }
501:
502: static int PTRCALL
503: entity3(PROLOG_STATE *state,
504: int tok,
505: const char *ptr,
506: const char *end,
507: const ENCODING *enc)
508: {
509: switch (tok) {
510: case XML_TOK_PROLOG_S:
511: return XML_ROLE_ENTITY_NONE;
512: case XML_TOK_LITERAL:
513: state->handler = entity4;
514: return XML_ROLE_ENTITY_PUBLIC_ID;
515: }
516: return common(state, tok);
517: }
518:
519: static int PTRCALL
520: entity4(PROLOG_STATE *state,
521: int tok,
522: const char *ptr,
523: const char *end,
524: const ENCODING *enc)
525: {
526: switch (tok) {
527: case XML_TOK_PROLOG_S:
528: return XML_ROLE_ENTITY_NONE;
529: case XML_TOK_LITERAL:
530: state->handler = entity5;
531: return XML_ROLE_ENTITY_SYSTEM_ID;
532: }
533: return common(state, tok);
534: }
535:
536: static int PTRCALL
537: entity5(PROLOG_STATE *state,
538: int tok,
539: const char *ptr,
540: const char *end,
541: const ENCODING *enc)
542: {
543: switch (tok) {
544: case XML_TOK_PROLOG_S:
545: return XML_ROLE_ENTITY_NONE;
546: 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;
552: return XML_ROLE_ENTITY_NONE;
553: }
554: break;
555: }
556: return common(state, tok);
557: }
558:
559: static int PTRCALL
560: entity6(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_ENTITY_NONE;
569: case XML_TOK_NAME:
570: state->handler = declClose;
571: state->role_none = XML_ROLE_ENTITY_NONE;
572: return XML_ROLE_ENTITY_NOTATION_NAME;
573: }
574: return common(state, tok);
575: }
576:
577: static int PTRCALL
578: entity7(PROLOG_STATE *state,
579: int tok,
580: const char *ptr,
581: const char *end,
582: const ENCODING *enc)
583: {
584: switch (tok) {
585: case XML_TOK_PROLOG_S:
586: return XML_ROLE_ENTITY_NONE;
587: case XML_TOK_NAME:
588: if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
589: state->handler = entity9;
590: return XML_ROLE_ENTITY_NONE;
591: }
592: if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
593: state->handler = entity8;
594: return XML_ROLE_ENTITY_NONE;
595: }
596: break;
597: case XML_TOK_LITERAL:
598: state->handler = declClose;
599: state->role_none = XML_ROLE_ENTITY_NONE;
600: return XML_ROLE_ENTITY_VALUE;
601: }
602: return common(state, tok);
603: }
604:
605: static int PTRCALL
606: entity8(PROLOG_STATE *state,
607: int tok,
608: const char *ptr,
609: const char *end,
610: const ENCODING *enc)
611: {
612: switch (tok) {
613: case XML_TOK_PROLOG_S:
614: return XML_ROLE_ENTITY_NONE;
615: case XML_TOK_LITERAL:
616: state->handler = entity9;
617: return XML_ROLE_ENTITY_PUBLIC_ID;
618: }
619: return common(state, tok);
620: }
621:
622: static int PTRCALL
623: entity9(PROLOG_STATE *state,
624: int tok,
625: const char *ptr,
626: const char *end,
627: const ENCODING *enc)
628: {
629: switch (tok) {
630: case XML_TOK_PROLOG_S:
631: return XML_ROLE_ENTITY_NONE;
632: case XML_TOK_LITERAL:
633: state->handler = entity10;
634: return XML_ROLE_ENTITY_SYSTEM_ID;
635: }
636: return common(state, tok);
637: }
638:
639: static int PTRCALL
640: entity10(PROLOG_STATE *state,
641: int tok,
642: const char *ptr,
643: const char *end,
644: const ENCODING *enc)
645: {
646: switch (tok) {
647: case XML_TOK_PROLOG_S:
648: 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:
656: static int PTRCALL
657: notation0(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;
666: case XML_TOK_NAME:
667: state->handler = notation1;
668: return XML_ROLE_NOTATION_NAME;
669: }
670: return common(state, tok);
671: }
672:
673: static int PTRCALL
674: notation1(PROLOG_STATE *state,
675: int tok,
676: const char *ptr,
677: const char *end,
678: const ENCODING *enc)
679: {
680: switch (tok) {
681: case XML_TOK_PROLOG_S:
682: return XML_ROLE_NOTATION_NONE;
683: case XML_TOK_NAME:
684: if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
685: state->handler = notation3;
686: return XML_ROLE_NOTATION_NONE;
687: }
688: if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
689: state->handler = notation2;
690: return XML_ROLE_NOTATION_NONE;
691: }
692: break;
693: }
694: return common(state, tok);
695: }
696:
697: static int PTRCALL
698: notation2(PROLOG_STATE *state,
699: int tok,
700: const char *ptr,
701: const char *end,
702: const ENCODING *enc)
703: {
704: switch (tok) {
705: case XML_TOK_PROLOG_S:
706: return XML_ROLE_NOTATION_NONE;
707: case XML_TOK_LITERAL:
708: state->handler = notation4;
709: return XML_ROLE_NOTATION_PUBLIC_ID;
710: }
711: return common(state, tok);
712: }
713:
714: static int PTRCALL
715: notation3(PROLOG_STATE *state,
716: int tok,
717: const char *ptr,
718: const char *end,
719: const ENCODING *enc)
720: {
721: switch (tok) {
722: case XML_TOK_PROLOG_S:
723: return XML_ROLE_NOTATION_NONE;
724: case XML_TOK_LITERAL:
725: state->handler = declClose;
726: state->role_none = XML_ROLE_NOTATION_NONE;
727: return XML_ROLE_NOTATION_SYSTEM_ID;
728: }
729: return common(state, tok);
730: }
731:
732: static int PTRCALL
733: notation4(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_NOTATION_NONE;
742: case XML_TOK_LITERAL:
743: state->handler = declClose;
744: state->role_none = XML_ROLE_NOTATION_NONE;
745: 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:
753: static int PTRCALL
754: attlist0(PROLOG_STATE *state,
755: int tok,
756: const char *ptr,
757: const char *end,
758: const ENCODING *enc)
759: {
760: switch (tok) {
761: case XML_TOK_PROLOG_S:
762: return XML_ROLE_ATTLIST_NONE;
763: 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:
771: static int PTRCALL
772: attlist1(PROLOG_STATE *state,
773: int tok,
774: const char *ptr,
775: const char *end,
776: const ENCODING *enc)
777: {
778: switch (tok) {
779: case XML_TOK_PROLOG_S:
780: return XML_ROLE_ATTLIST_NONE;
781: case XML_TOK_DECL_CLOSE:
782: setTopLevel(state);
783: return XML_ROLE_ATTLIST_NONE;
784: 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:
792: static int PTRCALL
793: attlist2(PROLOG_STATE *state,
794: int tok,
795: const char *ptr,
796: const char *end,
797: const ENCODING *enc)
798: {
799: switch (tok) {
800: case XML_TOK_PROLOG_S:
801: return XML_ROLE_ATTLIST_NONE;
802: case XML_TOK_NAME:
803: {
804: static const char * const types[] = {
805: KW_CDATA,
806: 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++)
816: if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
817: state->handler = attlist8;
818: return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
819: }
820: }
821: if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
822: state->handler = attlist5;
823: return XML_ROLE_ATTLIST_NONE;
824: }
825: break;
826: case XML_TOK_OPEN_PAREN:
827: state->handler = attlist3;
828: return XML_ROLE_ATTLIST_NONE;
829: }
830: return common(state, tok);
831: }
832:
833: static int PTRCALL
834: attlist3(PROLOG_STATE *state,
835: int tok,
836: const char *ptr,
837: const char *end,
838: const ENCODING *enc)
839: {
840: switch (tok) {
841: case XML_TOK_PROLOG_S:
842: return XML_ROLE_ATTLIST_NONE;
843: 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:
852: static int PTRCALL
853: attlist4(PROLOG_STATE *state,
854: int tok,
855: const char *ptr,
856: const char *end,
857: const ENCODING *enc)
858: {
859: switch (tok) {
860: case XML_TOK_PROLOG_S:
861: return XML_ROLE_ATTLIST_NONE;
862: case XML_TOK_CLOSE_PAREN:
863: state->handler = attlist8;
864: return XML_ROLE_ATTLIST_NONE;
865: case XML_TOK_OR:
866: state->handler = attlist3;
867: return XML_ROLE_ATTLIST_NONE;
868: }
869: return common(state, tok);
870: }
871:
872: static int PTRCALL
873: attlist5(PROLOG_STATE *state,
874: int tok,
875: const char *ptr,
876: const char *end,
877: const ENCODING *enc)
878: {
879: switch (tok) {
880: case XML_TOK_PROLOG_S:
881: return XML_ROLE_ATTLIST_NONE;
882: case XML_TOK_OPEN_PAREN:
883: state->handler = attlist6;
884: return XML_ROLE_ATTLIST_NONE;
885: }
886: return common(state, tok);
887: }
888:
889: static int PTRCALL
890: attlist6(PROLOG_STATE *state,
891: int tok,
892: const char *ptr,
893: const char *end,
894: const ENCODING *enc)
895: {
896: switch (tok) {
897: case XML_TOK_PROLOG_S:
898: return XML_ROLE_ATTLIST_NONE;
899: case XML_TOK_NAME:
900: state->handler = attlist7;
901: return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
902: }
903: return common(state, tok);
904: }
905:
906: static int PTRCALL
907: attlist7(PROLOG_STATE *state,
908: int tok,
909: const char *ptr,
910: const char *end,
911: const ENCODING *enc)
912: {
913: switch (tok) {
914: case XML_TOK_PROLOG_S:
915: return XML_ROLE_ATTLIST_NONE;
916: case XML_TOK_CLOSE_PAREN:
917: state->handler = attlist8;
918: return XML_ROLE_ATTLIST_NONE;
919: case XML_TOK_OR:
920: state->handler = attlist6;
921: return XML_ROLE_ATTLIST_NONE;
922: }
923: return common(state, tok);
924: }
925:
926: /* default value */
927: static int PTRCALL
928: attlist8(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_ATTLIST_NONE;
937: case XML_TOK_POUND_NAME:
938: if (XmlNameMatchesAscii(enc,
939: ptr + MIN_BYTES_PER_CHAR(enc),
940: end,
941: KW_IMPLIED)) {
942: state->handler = attlist1;
943: return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
944: }
945: if (XmlNameMatchesAscii(enc,
946: ptr + MIN_BYTES_PER_CHAR(enc),
947: end,
948: KW_REQUIRED)) {
949: state->handler = attlist1;
950: return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
951: }
952: if (XmlNameMatchesAscii(enc,
953: ptr + MIN_BYTES_PER_CHAR(enc),
954: end,
955: KW_FIXED)) {
956: state->handler = attlist9;
957: return XML_ROLE_ATTLIST_NONE;
958: }
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:
967: static int PTRCALL
968: attlist9(PROLOG_STATE *state,
969: int tok,
970: const char *ptr,
971: const char *end,
972: const ENCODING *enc)
973: {
974: switch (tok) {
975: case XML_TOK_PROLOG_S:
976: return XML_ROLE_ATTLIST_NONE;
977: case XML_TOK_LITERAL:
978: state->handler = attlist1;
979: return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
980: }
981: return common(state, tok);
982: }
983:
984: static int PTRCALL
985: element0(PROLOG_STATE *state,
986: int tok,
987: const char *ptr,
988: const char *end,
989: const ENCODING *enc)
990: {
991: switch (tok) {
992: case XML_TOK_PROLOG_S:
993: return XML_ROLE_ELEMENT_NONE;
994: 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:
1002: static int PTRCALL
1003: element1(PROLOG_STATE *state,
1004: int tok,
1005: const char *ptr,
1006: const char *end,
1007: const ENCODING *enc)
1008: {
1009: switch (tok) {
1010: case XML_TOK_PROLOG_S:
1011: return XML_ROLE_ELEMENT_NONE;
1012: case XML_TOK_NAME:
1013: if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
1014: state->handler = declClose;
1015: state->role_none = XML_ROLE_ELEMENT_NONE;
1016: return XML_ROLE_CONTENT_EMPTY;
1017: }
1018: if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
1019: state->handler = declClose;
1020: state->role_none = XML_ROLE_ELEMENT_NONE;
1021: 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:
1032: static int PTRCALL
1033: element2(PROLOG_STATE *state,
1034: int tok,
1035: const char *ptr,
1036: const char *end,
1037: const ENCODING *enc)
1038: {
1039: switch (tok) {
1040: case XML_TOK_PROLOG_S:
1041: return XML_ROLE_ELEMENT_NONE;
1042: case XML_TOK_POUND_NAME:
1043: if (XmlNameMatchesAscii(enc,
1044: ptr + MIN_BYTES_PER_CHAR(enc),
1045: end,
1046: KW_PCDATA)) {
1047: 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:
1072: static int PTRCALL
1073: element3(PROLOG_STATE *state,
1074: int tok,
1075: const char *ptr,
1076: const char *end,
1077: const ENCODING *enc)
1078: {
1079: switch (tok) {
1080: case XML_TOK_PROLOG_S:
1081: return XML_ROLE_ELEMENT_NONE;
1082: case XML_TOK_CLOSE_PAREN:
1083: state->handler = declClose;
1084: state->role_none = XML_ROLE_ELEMENT_NONE;
1085: return XML_ROLE_GROUP_CLOSE;
1086: case XML_TOK_CLOSE_PAREN_ASTERISK:
1087: state->handler = declClose;
1088: state->role_none = XML_ROLE_ELEMENT_NONE;
1089: return XML_ROLE_GROUP_CLOSE_REP;
1090: case XML_TOK_OR:
1091: state->handler = element4;
1092: return XML_ROLE_ELEMENT_NONE;
1093: }
1094: return common(state, tok);
1095: }
1096:
1097: static int PTRCALL
1098: element4(PROLOG_STATE *state,
1099: int tok,
1100: const char *ptr,
1101: const char *end,
1102: const ENCODING *enc)
1103: {
1104: switch (tok) {
1105: case XML_TOK_PROLOG_S:
1106: return XML_ROLE_ELEMENT_NONE;
1107: 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:
1115: static int PTRCALL
1116: element5(PROLOG_STATE *state,
1117: int tok,
1118: const char *ptr,
1119: const char *end,
1120: const ENCODING *enc)
1121: {
1122: switch (tok) {
1123: case XML_TOK_PROLOG_S:
1124: return XML_ROLE_ELEMENT_NONE;
1125: case XML_TOK_CLOSE_PAREN_ASTERISK:
1126: state->handler = declClose;
1127: state->role_none = XML_ROLE_ELEMENT_NONE;
1128: return XML_ROLE_GROUP_CLOSE_REP;
1129: case XML_TOK_OR:
1130: state->handler = element4;
1131: return XML_ROLE_ELEMENT_NONE;
1132: }
1133: return common(state, tok);
1134: }
1135:
1136: static int PTRCALL
1137: element6(PROLOG_STATE *state,
1138: int tok,
1139: const char *ptr,
1140: const char *end,
1141: const ENCODING *enc)
1142: {
1143: switch (tok) {
1144: case XML_TOK_PROLOG_S:
1145: return XML_ROLE_ELEMENT_NONE;
1146: 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:
1166: static int PTRCALL
1167: element7(PROLOG_STATE *state,
1168: int tok,
1169: const char *ptr,
1170: const char *end,
1171: const ENCODING *enc)
1172: {
1173: switch (tok) {
1174: case XML_TOK_PROLOG_S:
1175: return XML_ROLE_ELEMENT_NONE;
1176: case XML_TOK_CLOSE_PAREN:
1177: state->level -= 1;
1178: if (state->level == 0) {
1179: state->handler = declClose;
1180: state->role_none = XML_ROLE_ELEMENT_NONE;
1181: }
1182: return XML_ROLE_GROUP_CLOSE;
1183: case XML_TOK_CLOSE_PAREN_ASTERISK:
1184: state->level -= 1;
1185: if (state->level == 0) {
1186: state->handler = declClose;
1187: state->role_none = XML_ROLE_ELEMENT_NONE;
1188: }
1189: return XML_ROLE_GROUP_CLOSE_REP;
1190: case XML_TOK_CLOSE_PAREN_QUESTION:
1191: state->level -= 1;
1192: if (state->level == 0) {
1193: state->handler = declClose;
1194: state->role_none = XML_ROLE_ELEMENT_NONE;
1195: }
1196: return XML_ROLE_GROUP_CLOSE_OPT;
1197: case XML_TOK_CLOSE_PAREN_PLUS:
1198: state->level -= 1;
1199: if (state->level == 0) {
1200: state->handler = declClose;
1201: state->role_none = XML_ROLE_ELEMENT_NONE;
1202: }
1203: 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:
1216: static int PTRCALL
1217: condSect0(PROLOG_STATE *state,
1218: int tok,
1219: const char *ptr,
1220: const char *end,
1221: const ENCODING *enc)
1222: {
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:
1240: static int PTRCALL
1241: condSect1(PROLOG_STATE *state,
1242: int tok,
1243: const char *ptr,
1244: const char *end,
1245: const ENCODING *enc)
1246: {
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:
1258: static int PTRCALL
1259: condSect2(PROLOG_STATE *state,
1260: int tok,
1261: const char *ptr,
1262: const char *end,
1263: const ENCODING *enc)
1264: {
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:
1277: static int PTRCALL
1278: declClose(PROLOG_STATE *state,
1279: int tok,
1280: const char *ptr,
1281: const char *end,
1282: const ENCODING *enc)
1283: {
1284: switch (tok) {
1285: case XML_TOK_PROLOG_S:
1286: return state->role_none;
1287: case XML_TOK_DECL_CLOSE:
1288: setTopLevel(state);
1289: return state->role_none;
1290: }
1291: return common(state, tok);
1292: }
1293:
1294: static int PTRCALL
1295: error(PROLOG_STATE *state,
1296: int tok,
1297: const char *ptr,
1298: const char *end,
1299: const ENCODING *enc)
1300: {
1301: return XML_ROLE_NONE;
1302: }
1303:
1304: static int FASTCALL
1305: common(PROLOG_STATE *state, int tok)
1306: {
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:
1315: void
1316: XmlPrologStateInit(PROLOG_STATE *state)
1317: {
1318: state->handler = prolog0;
1319: #ifdef XML_DTD
1320: state->documentEntity = 1;
1321: state->includeLevel = 0;
1322: state->inEntityValue = 0;
1323: #endif /* XML_DTD */
1324: }
1325:
1326: #ifdef XML_DTD
1327:
1328: void
1329: XmlPrologStateInitExternalEntity(PROLOG_STATE *state)
1330: {
1331: state->handler = externalSubset0;
1332: state->documentEntity = 0;
1333: state->includeLevel = 0;
1334: }
1335:
1336: #endif /* XML_DTD */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>