| |
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 } |