Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/parser/expat/lib/xmlrole.c
Line
Count
Source (jump to first uncovered line)
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
#else
14
#ifdef HAVE_EXPAT_CONFIG_H
15
#include <expat_config.h>
16
#endif
17
#endif /* ndef COMPILED_FROM_DSP */
18
19
#include "expat_external.h"
20
#include "internal.h"
21
#include "xmlrole.h"
22
#include "ascii.h"
23
24
/* Doesn't check:
25
26
 that ,| are not mixed in a model group
27
 content of literals
28
29
*/
30
31
static const char KW_ANY[] = {
32
    ASCII_A, ASCII_N, ASCII_Y, '\0' };
33
static const char KW_ATTLIST[] = {
34
    ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' };
35
static const char KW_CDATA[] = {
36
    ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
37
static const char KW_DOCTYPE[] = {
38
    ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' };
39
static const char KW_ELEMENT[] = {
40
    ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' };
41
static const char KW_EMPTY[] = {
42
    ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' };
43
static const char KW_ENTITIES[] = {
44
    ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S,
45
    '\0' };
46
static const char KW_ENTITY[] = {
47
    ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };
48
static const char KW_FIXED[] = {
49
    ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' };
50
static const char KW_ID[] = {
51
    ASCII_I, ASCII_D, '\0' };
52
static const char KW_IDREF[] = {
53
    ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };
54
static const char KW_IDREFS[] = {
55
    ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };
56
static const char KW_IGNORE[] = {
57
    ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' };
58
static const char KW_IMPLIED[] = {
59
    ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' };
60
static const char KW_INCLUDE[] = {
61
    ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' };
62
static const char KW_NDATA[] = {
63
    ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
64
static const char KW_NMTOKEN[] = {
65
    ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };
66
static const char KW_NMTOKENS[] = {
67
    ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S,
68
    '\0' };
69
static const char KW_NOTATION[] =
70
    { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N,
71
      '\0' };
72
static const char KW_PCDATA[] = {
73
    ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
74
static const char KW_PUBLIC[] = {
75
    ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' };
76
static const char KW_REQUIRED[] = {
77
    ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D,
78
    '\0' };
79
static const char KW_SYSTEM[] = {
80
    ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' };
81
82
#ifndef MIN_BYTES_PER_CHAR
83
#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
84
#endif
85
86
#ifdef XML_DTD
87
#define setTopLevel(state) \
88
0
  ((state)->handler = ((state)->documentEntity \
89
0
                       ? internalSubset \
90
0
                       : externalSubset1))
91
#else /* not XML_DTD */
92
#define setTopLevel(state) ((state)->handler = internalSubset)
93
#endif /* not XML_DTD */
94
95
typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state,
96
                                   int tok,
97
                                   const char *ptr,
98
                                   const char *end,
99
                                   const ENCODING *enc);
100
101
static PROLOG_HANDLER
102
  prolog0, prolog1, prolog2,
103
  doctype0, doctype1, doctype2, doctype3, doctype4, doctype5,
104
  internalSubset,
105
  entity0, entity1, entity2, entity3, entity4, entity5, entity6,
106
  entity7, entity8, entity9, entity10,
107
  notation0, notation1, notation2, notation3, notation4,
108
  attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6,
109
  attlist7, attlist8, attlist9,
110
  element0, element1, element2, element3, element4, element5, element6,
111
  element7,
112
#ifdef XML_DTD
113
  externalSubset0, externalSubset1,
114
  condSect0, condSect1, condSect2,
115
#endif /* XML_DTD */
116
  declClose,
117
  error;
118
119
static int FASTCALL common(PROLOG_STATE *state, int tok);
120
121
static int PTRCALL
122
prolog0(PROLOG_STATE *state,
123
        int tok,
124
        const char *ptr,
125
        const char *end,
126
        const ENCODING *enc)
127
0
{
128
0
  switch (tok) {
129
0
  case XML_TOK_PROLOG_S:
130
0
    state->handler = prolog1;
131
0
    return XML_ROLE_NONE;
132
0
  case XML_TOK_XML_DECL:
133
0
    state->handler = prolog1;
134
0
    return XML_ROLE_XML_DECL;
135
0
  case XML_TOK_PI:
136
0
    state->handler = prolog1;
137
0
    return XML_ROLE_PI;
138
0
  case XML_TOK_COMMENT:
139
0
    state->handler = prolog1;
140
0
    return XML_ROLE_COMMENT;
141
0
  case XML_TOK_BOM:
142
0
    return XML_ROLE_NONE;
143
0
  case XML_TOK_DECL_OPEN:
144
0
    if (!XmlNameMatchesAscii(enc,
145
0
                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),
146
0
                             end,
147
0
                             KW_DOCTYPE))
148
0
      break;
149
0
    state->handler = doctype0;
150
0
    return XML_ROLE_DOCTYPE_NONE;
151
0
  case XML_TOK_INSTANCE_START:
152
0
    state->handler = error;
153
0
    return XML_ROLE_INSTANCE_START;
154
0
  }
155
0
  return common(state, tok);
156
0
}
157
158
static int PTRCALL
159
prolog1(PROLOG_STATE *state,
160
        int tok,
161
        const char *ptr,
162
        const char *end,
163
        const ENCODING *enc)
164
0
{
165
0
  switch (tok) {
166
0
  case XML_TOK_PROLOG_S:
167
0
    return XML_ROLE_NONE;
168
0
  case XML_TOK_PI:
169
0
    return XML_ROLE_PI;
170
0
  case XML_TOK_COMMENT:
171
0
    return XML_ROLE_COMMENT;
172
0
  case XML_TOK_BOM:
173
0
    return XML_ROLE_NONE;
174
0
  case XML_TOK_DECL_OPEN:
175
0
    if (!XmlNameMatchesAscii(enc,
176
0
                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),
177
0
                             end,
178
0
                             KW_DOCTYPE))
179
0
      break;
180
0
    state->handler = doctype0;
181
0
    return XML_ROLE_DOCTYPE_NONE;
182
0
  case XML_TOK_INSTANCE_START:
183
0
    state->handler = error;
184
0
    return XML_ROLE_INSTANCE_START;
185
0
  }
186
0
  return common(state, tok);
187
0
}
188
189
static int PTRCALL
190
prolog2(PROLOG_STATE *state,
191
        int tok,
192
        const char *ptr,
193
        const char *end,
194
        const ENCODING *enc)
195
0
{
196
0
  switch (tok) {
197
0
  case XML_TOK_PROLOG_S:
198
0
    return XML_ROLE_NONE;
199
0
  case XML_TOK_PI:
200
0
    return XML_ROLE_PI;
201
0
  case XML_TOK_COMMENT:
202
0
    return XML_ROLE_COMMENT;
203
0
  case XML_TOK_INSTANCE_START:
204
0
    state->handler = error;
205
0
    return XML_ROLE_INSTANCE_START;
206
0
  }
207
0
  return common(state, tok);
208
0
}
209
210
static int PTRCALL
211
doctype0(PROLOG_STATE *state,
212
         int tok,
213
         const char *ptr,
214
         const char *end,
215
         const ENCODING *enc)
216
0
{
217
0
  switch (tok) {
218
0
  case XML_TOK_PROLOG_S:
219
0
    return XML_ROLE_DOCTYPE_NONE;
220
0
  case XML_TOK_NAME:
221
0
  case XML_TOK_PREFIXED_NAME:
222
0
    state->handler = doctype1;
223
0
    return XML_ROLE_DOCTYPE_NAME;
224
0
  }
225
0
  return common(state, tok);
226
0
}
227
228
static int PTRCALL
229
doctype1(PROLOG_STATE *state,
230
         int tok,
231
         const char *ptr,
232
         const char *end,
233
         const ENCODING *enc)
234
0
{
235
0
  switch (tok) {
236
0
  case XML_TOK_PROLOG_S:
237
0
    return XML_ROLE_DOCTYPE_NONE;
238
0
  case XML_TOK_OPEN_BRACKET:
239
0
    state->handler = internalSubset;
240
0
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
241
0
  case XML_TOK_DECL_CLOSE:
242
0
    state->handler = prolog2;
243
0
    return XML_ROLE_DOCTYPE_CLOSE;
244
0
  case XML_TOK_NAME:
245
0
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
246
0
      state->handler = doctype3;
247
0
      return XML_ROLE_DOCTYPE_NONE;
248
0
    }
249
0
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
250
0
      state->handler = doctype2;
251
0
      return XML_ROLE_DOCTYPE_NONE;
252
0
    }
253
0
    break;
254
0
  }
255
0
  return common(state, tok);
256
0
}
257
258
static int PTRCALL
259
doctype2(PROLOG_STATE *state,
260
         int tok,
261
         const char *ptr,
262
         const char *end,
263
         const ENCODING *enc)
264
0
{
265
0
  switch (tok) {
266
0
  case XML_TOK_PROLOG_S:
267
0
    return XML_ROLE_DOCTYPE_NONE;
268
0
  case XML_TOK_LITERAL:
269
0
    state->handler = doctype3;
270
0
    return XML_ROLE_DOCTYPE_PUBLIC_ID;
271
0
  }
272
0
  return common(state, tok);
273
0
}
274
275
static int PTRCALL
276
doctype3(PROLOG_STATE *state,
277
         int tok,
278
         const char *ptr,
279
         const char *end,
280
         const ENCODING *enc)
281
0
{
282
0
  switch (tok) {
283
0
  case XML_TOK_PROLOG_S:
284
0
    return XML_ROLE_DOCTYPE_NONE;
285
0
  case XML_TOK_LITERAL:
286
0
    state->handler = doctype4;
287
0
    return XML_ROLE_DOCTYPE_SYSTEM_ID;
288
0
  }
289
0
  return common(state, tok);
290
0
}
291
292
static int PTRCALL
293
doctype4(PROLOG_STATE *state,
294
         int tok,
295
         const char *ptr,
296
         const char *end,
297
         const ENCODING *enc)
298
0
{
299
0
  switch (tok) {
300
0
  case XML_TOK_PROLOG_S:
301
0
    return XML_ROLE_DOCTYPE_NONE;
302
0
  case XML_TOK_OPEN_BRACKET:
303
0
    state->handler = internalSubset;
304
0
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
305
0
  case XML_TOK_DECL_CLOSE:
306
0
    state->handler = prolog2;
307
0
    return XML_ROLE_DOCTYPE_CLOSE;
308
0
  }
309
0
  return common(state, tok);
310
0
}
311
312
static int PTRCALL
313
doctype5(PROLOG_STATE *state,
314
         int tok,
315
         const char *ptr,
316
         const char *end,
317
         const ENCODING *enc)
318
0
{
319
0
  switch (tok) {
320
0
  case XML_TOK_PROLOG_S:
321
0
    return XML_ROLE_DOCTYPE_NONE;
322
0
  case XML_TOK_DECL_CLOSE:
323
0
    state->handler = prolog2;
324
0
    return XML_ROLE_DOCTYPE_CLOSE;
325
0
  }
326
0
  return common(state, tok);
327
0
}
328
329
static int PTRCALL
330
internalSubset(PROLOG_STATE *state,
331
               int tok,
332
               const char *ptr,
333
               const char *end,
334
               const ENCODING *enc)
335
0
{
336
0
  switch (tok) {
337
0
  case XML_TOK_PROLOG_S:
338
0
    return XML_ROLE_NONE;
339
0
  case XML_TOK_DECL_OPEN:
340
0
    if (XmlNameMatchesAscii(enc,
341
0
                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),
342
0
                            end,
343
0
                            KW_ENTITY)) {
344
0
      state->handler = entity0;
345
0
      return XML_ROLE_ENTITY_NONE;
346
0
    }
347
0
    if (XmlNameMatchesAscii(enc,
348
0
                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),
349
0
                            end,
350
0
                            KW_ATTLIST)) {
351
0
      state->handler = attlist0;
352
0
      return XML_ROLE_ATTLIST_NONE;
353
0
    }
354
0
    if (XmlNameMatchesAscii(enc,
355
0
                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),
356
0
                            end,
357
0
                            KW_ELEMENT)) {
358
0
      state->handler = element0;
359
0
      return XML_ROLE_ELEMENT_NONE;
360
0
    }
361
0
    if (XmlNameMatchesAscii(enc,
362
0
                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),
363
0
                            end,
364
0
                            KW_NOTATION)) {
365
0
      state->handler = notation0;
366
0
      return XML_ROLE_NOTATION_NONE;
367
0
    }
368
0
    break;
369
0
  case XML_TOK_PI:
370
0
    return XML_ROLE_PI;
371
0
  case XML_TOK_COMMENT:
372
0
    return XML_ROLE_COMMENT;
373
0
  case XML_TOK_PARAM_ENTITY_REF:
374
0
    return XML_ROLE_PARAM_ENTITY_REF;
375
0
  case XML_TOK_CLOSE_BRACKET:
376
0
    state->handler = doctype5;
377
0
    return XML_ROLE_DOCTYPE_NONE;
378
0
  case XML_TOK_NONE:
379
0
    return XML_ROLE_NONE;
380
0
  }
381
0
  return common(state, tok);
382
0
}
383
384
#ifdef XML_DTD
385
386
static int PTRCALL
387
externalSubset0(PROLOG_STATE *state,
388
                int tok,
389
                const char *ptr,
390
                const char *end,
391
                const ENCODING *enc)
392
0
{
393
0
  state->handler = externalSubset1;
394
0
  if (tok == XML_TOK_XML_DECL)
395
0
    return XML_ROLE_TEXT_DECL;
396
0
  return externalSubset1(state, tok, ptr, end, enc);
397
0
}
398
399
static int PTRCALL
400
externalSubset1(PROLOG_STATE *state,
401
                int tok,
402
                const char *ptr,
403
                const char *end,
404
                const ENCODING *enc)
405
0
{
406
0
  switch (tok) {
407
0
  case XML_TOK_COND_SECT_OPEN:
408
0
    state->handler = condSect0;
409
0
    return XML_ROLE_NONE;
410
0
  case XML_TOK_COND_SECT_CLOSE:
411
0
    if (state->includeLevel == 0)
412
0
      break;
413
0
    state->includeLevel -= 1;
414
0
    return XML_ROLE_NONE;
415
0
  case XML_TOK_PROLOG_S:
416
0
    return XML_ROLE_NONE;
417
0
  case XML_TOK_CLOSE_BRACKET:
418
0
    break;
419
0
  case XML_TOK_NONE:
420
0
    if (state->includeLevel)
421
0
      break;
422
0
    return XML_ROLE_NONE;
423
0
  default:
424
0
    return internalSubset(state, tok, ptr, end, enc);
425
0
  }
426
0
  return common(state, tok);
427
0
}
428
429
#endif /* XML_DTD */
430
431
static int PTRCALL
432
entity0(PROLOG_STATE *state,
433
        int tok,
434
        const char *ptr,
435
        const char *end,
436
        const ENCODING *enc)
437
0
{
438
0
  switch (tok) {
439
0
  case XML_TOK_PROLOG_S:
440
0
    return XML_ROLE_ENTITY_NONE;
441
0
  case XML_TOK_PERCENT:
442
0
    state->handler = entity1;
443
0
    return XML_ROLE_ENTITY_NONE;
444
0
  case XML_TOK_NAME:
445
0
    state->handler = entity2;
446
0
    return XML_ROLE_GENERAL_ENTITY_NAME;
447
0
  }
448
0
  return common(state, tok);
449
0
}
450
451
static int PTRCALL
452
entity1(PROLOG_STATE *state,
453
        int tok,
454
        const char *ptr,
455
        const char *end,
456
        const ENCODING *enc)
457
0
{
458
0
  switch (tok) {
459
0
  case XML_TOK_PROLOG_S:
460
0
    return XML_ROLE_ENTITY_NONE;
461
0
  case XML_TOK_NAME:
462
0
    state->handler = entity7;
463
0
    return XML_ROLE_PARAM_ENTITY_NAME;
464
0
  }
465
0
  return common(state, tok);
466
0
}
467
468
static int PTRCALL
469
entity2(PROLOG_STATE *state,
470
        int tok,
471
        const char *ptr,
472
        const char *end,
473
        const ENCODING *enc)
474
0
{
475
0
  switch (tok) {
476
0
  case XML_TOK_PROLOG_S:
477
0
    return XML_ROLE_ENTITY_NONE;
478
0
  case XML_TOK_NAME:
479
0
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
480
0
      state->handler = entity4;
481
0
      return XML_ROLE_ENTITY_NONE;
482
0
    }
483
0
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
484
0
      state->handler = entity3;
485
0
      return XML_ROLE_ENTITY_NONE;
486
0
    }
487
0
    break;
488
0
  case XML_TOK_LITERAL:
489
0
    state->handler = declClose;
490
0
    state->role_none = XML_ROLE_ENTITY_NONE;
491
0
    return XML_ROLE_ENTITY_VALUE;
492
0
  }
493
0
  return common(state, tok);
494
0
}
495
496
static int PTRCALL
497
entity3(PROLOG_STATE *state,
498
        int tok,
499
        const char *ptr,
500
        const char *end,
501
        const ENCODING *enc)
502
0
{
503
0
  switch (tok) {
504
0
  case XML_TOK_PROLOG_S:
505
0
    return XML_ROLE_ENTITY_NONE;
506
0
  case XML_TOK_LITERAL:
507
0
    state->handler = entity4;
508
0
    return XML_ROLE_ENTITY_PUBLIC_ID;
509
0
  }
510
0
  return common(state, tok);
511
0
}
512
513
static int PTRCALL
514
entity4(PROLOG_STATE *state,
515
        int tok,
516
        const char *ptr,
517
        const char *end,
518
        const ENCODING *enc)
519
0
{
520
0
  switch (tok) {
521
0
  case XML_TOK_PROLOG_S:
522
0
    return XML_ROLE_ENTITY_NONE;
523
0
  case XML_TOK_LITERAL:
524
0
    state->handler = entity5;
525
0
    return XML_ROLE_ENTITY_SYSTEM_ID;
526
0
  }
527
0
  return common(state, tok);
528
0
}
529
530
static int PTRCALL
531
entity5(PROLOG_STATE *state,
532
        int tok,
533
        const char *ptr,
534
        const char *end,
535
        const ENCODING *enc)
536
0
{
537
0
  switch (tok) {
538
0
  case XML_TOK_PROLOG_S:
539
0
    return XML_ROLE_ENTITY_NONE;
540
0
  case XML_TOK_DECL_CLOSE:
541
0
    setTopLevel(state);
542
0
    return XML_ROLE_ENTITY_COMPLETE;
543
0
  case XML_TOK_NAME:
544
0
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
545
0
      state->handler = entity6;
546
0
      return XML_ROLE_ENTITY_NONE;
547
0
    }
548
0
    break;
549
0
  }
550
0
  return common(state, tok);
551
0
}
552
553
static int PTRCALL
554
entity6(PROLOG_STATE *state,
555
        int tok,
556
        const char *ptr,
557
        const char *end,
558
        const ENCODING *enc)
559
0
{
560
0
  switch (tok) {
561
0
  case XML_TOK_PROLOG_S:
562
0
    return XML_ROLE_ENTITY_NONE;
563
0
  case XML_TOK_NAME:
564
0
    state->handler = declClose;
565
0
    state->role_none = XML_ROLE_ENTITY_NONE;
566
0
    return XML_ROLE_ENTITY_NOTATION_NAME;
567
0
  }
568
0
  return common(state, tok);
569
0
}
570
571
static int PTRCALL
572
entity7(PROLOG_STATE *state,
573
        int tok,
574
        const char *ptr,
575
        const char *end,
576
        const ENCODING *enc)
577
0
{
578
0
  switch (tok) {
579
0
  case XML_TOK_PROLOG_S:
580
0
    return XML_ROLE_ENTITY_NONE;
581
0
  case XML_TOK_NAME:
582
0
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
583
0
      state->handler = entity9;
584
0
      return XML_ROLE_ENTITY_NONE;
585
0
    }
586
0
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
587
0
      state->handler = entity8;
588
0
      return XML_ROLE_ENTITY_NONE;
589
0
    }
590
0
    break;
591
0
  case XML_TOK_LITERAL:
592
0
    state->handler = declClose;
593
0
    state->role_none = XML_ROLE_ENTITY_NONE;
594
0
    return XML_ROLE_ENTITY_VALUE;
595
0
  }
596
0
  return common(state, tok);
597
0
}
598
599
static int PTRCALL
600
entity8(PROLOG_STATE *state,
601
        int tok,
602
        const char *ptr,
603
        const char *end,
604
        const ENCODING *enc)
605
0
{
606
0
  switch (tok) {
607
0
  case XML_TOK_PROLOG_S:
608
0
    return XML_ROLE_ENTITY_NONE;
609
0
  case XML_TOK_LITERAL:
610
0
    state->handler = entity9;
611
0
    return XML_ROLE_ENTITY_PUBLIC_ID;
612
0
  }
613
0
  return common(state, tok);
614
0
}
615
616
static int PTRCALL
617
entity9(PROLOG_STATE *state,
618
        int tok,
619
        const char *ptr,
620
        const char *end,
621
        const ENCODING *enc)
622
0
{
623
0
  switch (tok) {
624
0
  case XML_TOK_PROLOG_S:
625
0
    return XML_ROLE_ENTITY_NONE;
626
0
  case XML_TOK_LITERAL:
627
0
    state->handler = entity10;
628
0
    return XML_ROLE_ENTITY_SYSTEM_ID;
629
0
  }
630
0
  return common(state, tok);
631
0
}
632
633
static int PTRCALL
634
entity10(PROLOG_STATE *state,
635
         int tok,
636
         const char *ptr,
637
         const char *end,
638
         const ENCODING *enc)
639
0
{
640
0
  switch (tok) {
641
0
  case XML_TOK_PROLOG_S:
642
0
    return XML_ROLE_ENTITY_NONE;
643
0
  case XML_TOK_DECL_CLOSE:
644
0
    setTopLevel(state);
645
0
    return XML_ROLE_ENTITY_COMPLETE;
646
0
  }
647
0
  return common(state, tok);
648
0
}
649
650
static int PTRCALL
651
notation0(PROLOG_STATE *state,
652
          int tok,
653
          const char *ptr,
654
          const char *end,
655
          const ENCODING *enc)
656
0
{
657
0
  switch (tok) {
658
0
  case XML_TOK_PROLOG_S:
659
0
    return XML_ROLE_NOTATION_NONE;
660
0
  case XML_TOK_NAME:
661
0
    state->handler = notation1;
662
0
    return XML_ROLE_NOTATION_NAME;
663
0
  }
664
0
  return common(state, tok);
665
0
}
666
667
static int PTRCALL
668
notation1(PROLOG_STATE *state,
669
          int tok,
670
          const char *ptr,
671
          const char *end,
672
          const ENCODING *enc)
673
0
{
674
0
  switch (tok) {
675
0
  case XML_TOK_PROLOG_S:
676
0
    return XML_ROLE_NOTATION_NONE;
677
0
  case XML_TOK_NAME:
678
0
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
679
0
      state->handler = notation3;
680
0
      return XML_ROLE_NOTATION_NONE;
681
0
    }
682
0
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
683
0
      state->handler = notation2;
684
0
      return XML_ROLE_NOTATION_NONE;
685
0
    }
686
0
    break;
687
0
  }
688
0
  return common(state, tok);
689
0
}
690
691
static int PTRCALL
692
notation2(PROLOG_STATE *state,
693
          int tok,
694
          const char *ptr,
695
          const char *end,
696
          const ENCODING *enc)
697
0
{
698
0
  switch (tok) {
699
0
  case XML_TOK_PROLOG_S:
700
0
    return XML_ROLE_NOTATION_NONE;
701
0
  case XML_TOK_LITERAL:
702
0
    state->handler = notation4;
703
0
    return XML_ROLE_NOTATION_PUBLIC_ID;
704
0
  }
705
0
  return common(state, tok);
706
0
}
707
708
static int PTRCALL
709
notation3(PROLOG_STATE *state,
710
          int tok,
711
          const char *ptr,
712
          const char *end,
713
          const ENCODING *enc)
714
0
{
715
0
  switch (tok) {
716
0
  case XML_TOK_PROLOG_S:
717
0
    return XML_ROLE_NOTATION_NONE;
718
0
  case XML_TOK_LITERAL:
719
0
    state->handler = declClose;
720
0
    state->role_none = XML_ROLE_NOTATION_NONE;
721
0
    return XML_ROLE_NOTATION_SYSTEM_ID;
722
0
  }
723
0
  return common(state, tok);
724
0
}
725
726
static int PTRCALL
727
notation4(PROLOG_STATE *state,
728
          int tok,
729
          const char *ptr,
730
          const char *end,
731
          const ENCODING *enc)
732
0
{
733
0
  switch (tok) {
734
0
  case XML_TOK_PROLOG_S:
735
0
    return XML_ROLE_NOTATION_NONE;
736
0
  case XML_TOK_LITERAL:
737
0
    state->handler = declClose;
738
0
    state->role_none = XML_ROLE_NOTATION_NONE;
739
0
    return XML_ROLE_NOTATION_SYSTEM_ID;
740
0
  case XML_TOK_DECL_CLOSE:
741
0
    setTopLevel(state);
742
0
    return XML_ROLE_NOTATION_NO_SYSTEM_ID;
743
0
  }
744
0
  return common(state, tok);
745
0
}
746
747
static int PTRCALL
748
attlist0(PROLOG_STATE *state,
749
         int tok,
750
         const char *ptr,
751
         const char *end,
752
         const ENCODING *enc)
753
0
{
754
0
  switch (tok) {
755
0
  case XML_TOK_PROLOG_S:
756
0
    return XML_ROLE_ATTLIST_NONE;
757
0
  case XML_TOK_NAME:
758
0
  case XML_TOK_PREFIXED_NAME:
759
0
    state->handler = attlist1;
760
0
    return XML_ROLE_ATTLIST_ELEMENT_NAME;
761
0
  }
762
0
  return common(state, tok);
763
0
}
764
765
static int PTRCALL
766
attlist1(PROLOG_STATE *state,
767
         int tok,
768
         const char *ptr,
769
         const char *end,
770
         const ENCODING *enc)
771
0
{
772
0
  switch (tok) {
773
0
  case XML_TOK_PROLOG_S:
774
0
    return XML_ROLE_ATTLIST_NONE;
775
0
  case XML_TOK_DECL_CLOSE:
776
0
    setTopLevel(state);
777
0
    return XML_ROLE_ATTLIST_NONE;
778
0
  case XML_TOK_NAME:
779
0
  case XML_TOK_PREFIXED_NAME:
780
0
    state->handler = attlist2;
781
0
    return XML_ROLE_ATTRIBUTE_NAME;
782
0
  }
783
0
  return common(state, tok);
784
0
}
785
786
static int PTRCALL
787
attlist2(PROLOG_STATE *state,
788
         int tok,
789
         const char *ptr,
790
         const char *end,
791
         const ENCODING *enc)
792
0
{
793
0
  switch (tok) {
794
0
  case XML_TOK_PROLOG_S:
795
0
    return XML_ROLE_ATTLIST_NONE;
796
0
  case XML_TOK_NAME:
797
0
    {
798
0
      static const char * const types[] = {
799
0
        KW_CDATA,
800
0
        KW_ID,
801
0
        KW_IDREF,
802
0
        KW_IDREFS,
803
0
        KW_ENTITY,
804
0
        KW_ENTITIES,
805
0
        KW_NMTOKEN,
806
0
        KW_NMTOKENS,
807
0
      };
808
0
      int i;
809
0
      for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++)
810
0
        if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
811
0
          state->handler = attlist8;
812
0
          return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
813
0
        }
814
0
    }
815
0
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
816
0
      state->handler = attlist5;
817
0
      return XML_ROLE_ATTLIST_NONE;
818
0
    }
819
0
    break;
820
0
  case XML_TOK_OPEN_PAREN:
821
0
    state->handler = attlist3;
822
0
    return XML_ROLE_ATTLIST_NONE;
823
0
  }
824
0
  return common(state, tok);
825
0
}
826
827
static int PTRCALL
828
attlist3(PROLOG_STATE *state,
829
         int tok,
830
         const char *ptr,
831
         const char *end,
832
         const ENCODING *enc)
833
0
{
834
0
  switch (tok) {
835
0
  case XML_TOK_PROLOG_S:
836
0
    return XML_ROLE_ATTLIST_NONE;
837
0
  case XML_TOK_NMTOKEN:
838
0
  case XML_TOK_NAME:
839
0
  case XML_TOK_PREFIXED_NAME:
840
0
    state->handler = attlist4;
841
0
    return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
842
0
  }
843
0
  return common(state, tok);
844
0
}
845
846
static int PTRCALL
847
attlist4(PROLOG_STATE *state,
848
         int tok,
849
         const char *ptr,
850
         const char *end,
851
         const ENCODING *enc)
852
0
{
853
0
  switch (tok) {
854
0
  case XML_TOK_PROLOG_S:
855
0
    return XML_ROLE_ATTLIST_NONE;
856
0
  case XML_TOK_CLOSE_PAREN:
857
0
    state->handler = attlist8;
858
0
    return XML_ROLE_ATTLIST_NONE;
859
0
  case XML_TOK_OR:
860
0
    state->handler = attlist3;
861
0
    return XML_ROLE_ATTLIST_NONE;
862
0
  }
863
0
  return common(state, tok);
864
0
}
865
866
static int PTRCALL
867
attlist5(PROLOG_STATE *state,
868
         int tok,
869
         const char *ptr,
870
         const char *end,
871
         const ENCODING *enc)
872
0
{
873
0
  switch (tok) {
874
0
  case XML_TOK_PROLOG_S:
875
0
    return XML_ROLE_ATTLIST_NONE;
876
0
  case XML_TOK_OPEN_PAREN:
877
0
    state->handler = attlist6;
878
0
    return XML_ROLE_ATTLIST_NONE;
879
0
  }
880
0
  return common(state, tok);
881
0
}
882
883
static int PTRCALL
884
attlist6(PROLOG_STATE *state,
885
         int tok,
886
         const char *ptr,
887
         const char *end,
888
         const ENCODING *enc)
889
0
{
890
0
  switch (tok) {
891
0
  case XML_TOK_PROLOG_S:
892
0
    return XML_ROLE_ATTLIST_NONE;
893
0
  case XML_TOK_NAME:
894
0
    state->handler = attlist7;
895
0
    return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
896
0
  }
897
0
  return common(state, tok);
898
0
}
899
900
static int PTRCALL
901
attlist7(PROLOG_STATE *state,
902
         int tok,
903
         const char *ptr,
904
         const char *end,
905
         const ENCODING *enc)
906
0
{
907
0
  switch (tok) {
908
0
  case XML_TOK_PROLOG_S:
909
0
    return XML_ROLE_ATTLIST_NONE;
910
0
  case XML_TOK_CLOSE_PAREN:
911
0
    state->handler = attlist8;
912
0
    return XML_ROLE_ATTLIST_NONE;
913
0
  case XML_TOK_OR:
914
0
    state->handler = attlist6;
915
0
    return XML_ROLE_ATTLIST_NONE;
916
0
  }
917
0
  return common(state, tok);
918
0
}
919
920
/* default value */
921
static int PTRCALL
922
attlist8(PROLOG_STATE *state,
923
         int tok,
924
         const char *ptr,
925
         const char *end,
926
         const ENCODING *enc)
927
0
{
928
0
  switch (tok) {
929
0
  case XML_TOK_PROLOG_S:
930
0
    return XML_ROLE_ATTLIST_NONE;
931
0
  case XML_TOK_POUND_NAME:
932
0
    if (XmlNameMatchesAscii(enc,
933
0
                            ptr + MIN_BYTES_PER_CHAR(enc),
934
0
                            end,
935
0
                            KW_IMPLIED)) {
936
0
      state->handler = attlist1;
937
0
      return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
938
0
    }
939
0
    if (XmlNameMatchesAscii(enc,
940
0
                            ptr + MIN_BYTES_PER_CHAR(enc),
941
0
                            end,
942
0
                            KW_REQUIRED)) {
943
0
      state->handler = attlist1;
944
0
      return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
945
0
    }
946
0
    if (XmlNameMatchesAscii(enc,
947
0
                            ptr + MIN_BYTES_PER_CHAR(enc),
948
0
                            end,
949
0
                            KW_FIXED)) {
950
0
      state->handler = attlist9;
951
0
      return XML_ROLE_ATTLIST_NONE;
952
0
    }
953
0
    break;
954
0
  case XML_TOK_LITERAL:
955
0
    state->handler = attlist1;
956
0
    return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
957
0
  }
958
0
  return common(state, tok);
959
0
}
960
961
static int PTRCALL
962
attlist9(PROLOG_STATE *state,
963
         int tok,
964
         const char *ptr,
965
         const char *end,
966
         const ENCODING *enc)
967
0
{
968
0
  switch (tok) {
969
0
  case XML_TOK_PROLOG_S:
970
0
    return XML_ROLE_ATTLIST_NONE;
971
0
  case XML_TOK_LITERAL:
972
0
    state->handler = attlist1;
973
0
    return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
974
0
  }
975
0
  return common(state, tok);
976
0
}
977
978
static int PTRCALL
979
element0(PROLOG_STATE *state,
980
         int tok,
981
         const char *ptr,
982
         const char *end,
983
         const ENCODING *enc)
984
0
{
985
0
  switch (tok) {
986
0
  case XML_TOK_PROLOG_S:
987
0
    return XML_ROLE_ELEMENT_NONE;
988
0
  case XML_TOK_NAME:
989
0
  case XML_TOK_PREFIXED_NAME:
990
0
    state->handler = element1;
991
0
    return XML_ROLE_ELEMENT_NAME;
992
0
  }
993
0
  return common(state, tok);
994
0
}
995
996
static int PTRCALL
997
element1(PROLOG_STATE *state,
998
         int tok,
999
         const char *ptr,
1000
         const char *end,
1001
         const ENCODING *enc)
1002
0
{
1003
0
  switch (tok) {
1004
0
  case XML_TOK_PROLOG_S:
1005
0
    return XML_ROLE_ELEMENT_NONE;
1006
0
  case XML_TOK_NAME:
1007
0
    if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
1008
0
      state->handler = declClose;
1009
0
      state->role_none = XML_ROLE_ELEMENT_NONE;
1010
0
      return XML_ROLE_CONTENT_EMPTY;
1011
0
    }
1012
0
    if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
1013
0
      state->handler = declClose;
1014
0
      state->role_none = XML_ROLE_ELEMENT_NONE;
1015
0
      return XML_ROLE_CONTENT_ANY;
1016
0
    }
1017
0
    break;
1018
0
  case XML_TOK_OPEN_PAREN:
1019
0
    state->handler = element2;
1020
0
    state->level = 1;
1021
0
    return XML_ROLE_GROUP_OPEN;
1022
0
  }
1023
0
  return common(state, tok);
1024
0
}
1025
1026
static int PTRCALL
1027
element2(PROLOG_STATE *state,
1028
         int tok,
1029
         const char *ptr,
1030
         const char *end,
1031
         const ENCODING *enc)
1032
0
{
1033
0
  switch (tok) {
1034
0
  case XML_TOK_PROLOG_S:
1035
0
    return XML_ROLE_ELEMENT_NONE;
1036
0
  case XML_TOK_POUND_NAME:
1037
0
    if (XmlNameMatchesAscii(enc,
1038
0
                            ptr + MIN_BYTES_PER_CHAR(enc),
1039
0
                            end,
1040
0
                            KW_PCDATA)) {
1041
0
      state->handler = element3;
1042
0
      return XML_ROLE_CONTENT_PCDATA;
1043
0
    }
1044
0
    break;
1045
0
  case XML_TOK_OPEN_PAREN:
1046
0
    state->level = 2;
1047
0
    state->handler = element6;
1048
0
    return XML_ROLE_GROUP_OPEN;
1049
0
  case XML_TOK_NAME:
1050
0
  case XML_TOK_PREFIXED_NAME:
1051
0
    state->handler = element7;
1052
0
    return XML_ROLE_CONTENT_ELEMENT;
1053
0
  case XML_TOK_NAME_QUESTION:
1054
0
    state->handler = element7;
1055
0
    return XML_ROLE_CONTENT_ELEMENT_OPT;
1056
0
  case XML_TOK_NAME_ASTERISK:
1057
0
    state->handler = element7;
1058
0
    return XML_ROLE_CONTENT_ELEMENT_REP;
1059
0
  case XML_TOK_NAME_PLUS:
1060
0
    state->handler = element7;
1061
0
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
1062
0
  }
1063
0
  return common(state, tok);
1064
0
}
1065
1066
static int PTRCALL
1067
element3(PROLOG_STATE *state,
1068
         int tok,
1069
         const char *ptr,
1070
         const char *end,
1071
         const ENCODING *enc)
1072
0
{
1073
0
  switch (tok) {
1074
0
  case XML_TOK_PROLOG_S:
1075
0
    return XML_ROLE_ELEMENT_NONE;
1076
0
  case XML_TOK_CLOSE_PAREN:
1077
0
    state->handler = declClose;
1078
0
    state->role_none = XML_ROLE_ELEMENT_NONE;
1079
0
    return XML_ROLE_GROUP_CLOSE;
1080
0
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1081
0
    state->handler = declClose;
1082
0
    state->role_none = XML_ROLE_ELEMENT_NONE;
1083
0
    return XML_ROLE_GROUP_CLOSE_REP;
1084
0
  case XML_TOK_OR:
1085
0
    state->handler = element4;
1086
0
    return XML_ROLE_ELEMENT_NONE;
1087
0
  }
1088
0
  return common(state, tok);
1089
0
}
1090
1091
static int PTRCALL
1092
element4(PROLOG_STATE *state,
1093
         int tok,
1094
         const char *ptr,
1095
         const char *end,
1096
         const ENCODING *enc)
1097
0
{
1098
0
  switch (tok) {
1099
0
  case XML_TOK_PROLOG_S:
1100
0
    return XML_ROLE_ELEMENT_NONE;
1101
0
  case XML_TOK_NAME:
1102
0
  case XML_TOK_PREFIXED_NAME:
1103
0
    state->handler = element5;
1104
0
    return XML_ROLE_CONTENT_ELEMENT;
1105
0
  }
1106
0
  return common(state, tok);
1107
0
}
1108
1109
static int PTRCALL
1110
element5(PROLOG_STATE *state,
1111
         int tok,
1112
         const char *ptr,
1113
         const char *end,
1114
         const ENCODING *enc)
1115
0
{
1116
0
  switch (tok) {
1117
0
  case XML_TOK_PROLOG_S:
1118
0
    return XML_ROLE_ELEMENT_NONE;
1119
0
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1120
0
    state->handler = declClose;
1121
0
    state->role_none = XML_ROLE_ELEMENT_NONE;
1122
0
    return XML_ROLE_GROUP_CLOSE_REP;
1123
0
  case XML_TOK_OR:
1124
0
    state->handler = element4;
1125
0
    return XML_ROLE_ELEMENT_NONE;
1126
0
  }
1127
0
  return common(state, tok);
1128
0
}
1129
1130
static int PTRCALL
1131
element6(PROLOG_STATE *state,
1132
         int tok,
1133
         const char *ptr,
1134
         const char *end,
1135
         const ENCODING *enc)
1136
0
{
1137
0
  switch (tok) {
1138
0
  case XML_TOK_PROLOG_S:
1139
0
    return XML_ROLE_ELEMENT_NONE;
1140
0
  case XML_TOK_OPEN_PAREN:
1141
0
    state->level += 1;
1142
0
    return XML_ROLE_GROUP_OPEN;
1143
0
  case XML_TOK_NAME:
1144
0
  case XML_TOK_PREFIXED_NAME:
1145
0
    state->handler = element7;
1146
0
    return XML_ROLE_CONTENT_ELEMENT;
1147
0
  case XML_TOK_NAME_QUESTION:
1148
0
    state->handler = element7;
1149
0
    return XML_ROLE_CONTENT_ELEMENT_OPT;
1150
0
  case XML_TOK_NAME_ASTERISK:
1151
0
    state->handler = element7;
1152
0
    return XML_ROLE_CONTENT_ELEMENT_REP;
1153
0
  case XML_TOK_NAME_PLUS:
1154
0
    state->handler = element7;
1155
0
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
1156
0
  }
1157
0
  return common(state, tok);
1158
0
}
1159
1160
static int PTRCALL
1161
element7(PROLOG_STATE *state,
1162
         int tok,
1163
         const char *ptr,
1164
         const char *end,
1165
         const ENCODING *enc)
1166
0
{
1167
0
  switch (tok) {
1168
0
  case XML_TOK_PROLOG_S:
1169
0
    return XML_ROLE_ELEMENT_NONE;
1170
0
  case XML_TOK_CLOSE_PAREN:
1171
0
    state->level -= 1;
1172
0
    if (state->level == 0) {
1173
0
      state->handler = declClose;
1174
0
      state->role_none = XML_ROLE_ELEMENT_NONE;
1175
0
    }
1176
0
    return XML_ROLE_GROUP_CLOSE;
1177
0
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1178
0
    state->level -= 1;
1179
0
    if (state->level == 0) {
1180
0
      state->handler = declClose;
1181
0
      state->role_none = XML_ROLE_ELEMENT_NONE;
1182
0
    }
1183
0
    return XML_ROLE_GROUP_CLOSE_REP;
1184
0
  case XML_TOK_CLOSE_PAREN_QUESTION:
1185
0
    state->level -= 1;
1186
0
    if (state->level == 0) {
1187
0
      state->handler = declClose;
1188
0
      state->role_none = XML_ROLE_ELEMENT_NONE;
1189
0
    }
1190
0
    return XML_ROLE_GROUP_CLOSE_OPT;
1191
0
  case XML_TOK_CLOSE_PAREN_PLUS:
1192
0
    state->level -= 1;
1193
0
    if (state->level == 0) {
1194
0
      state->handler = declClose;
1195
0
      state->role_none = XML_ROLE_ELEMENT_NONE;
1196
0
    }
1197
0
    return XML_ROLE_GROUP_CLOSE_PLUS;
1198
0
  case XML_TOK_COMMA:
1199
0
    state->handler = element6;
1200
0
    return XML_ROLE_GROUP_SEQUENCE;
1201
0
  case XML_TOK_OR:
1202
0
    state->handler = element6;
1203
0
    return XML_ROLE_GROUP_CHOICE;
1204
0
  }
1205
0
  return common(state, tok);
1206
0
}
1207
1208
#ifdef XML_DTD
1209
1210
static int PTRCALL
1211
condSect0(PROLOG_STATE *state,
1212
          int tok,
1213
          const char *ptr,
1214
          const char *end,
1215
          const ENCODING *enc)
1216
0
{
1217
0
  switch (tok) {
1218
0
  case XML_TOK_PROLOG_S:
1219
0
    return XML_ROLE_NONE;
1220
0
  case XML_TOK_NAME:
1221
0
    if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {
1222
0
      state->handler = condSect1;
1223
0
      return XML_ROLE_NONE;
1224
0
    }
1225
0
    if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {
1226
0
      state->handler = condSect2;
1227
0
      return XML_ROLE_NONE;
1228
0
    }
1229
0
    break;
1230
0
  }
1231
0
  return common(state, tok);
1232
0
}
1233
1234
static int PTRCALL
1235
condSect1(PROLOG_STATE *state,
1236
          int tok,
1237
          const char *ptr,
1238
          const char *end,
1239
          const ENCODING *enc)
1240
0
{
1241
0
  switch (tok) {
1242
0
  case XML_TOK_PROLOG_S:
1243
0
    return XML_ROLE_NONE;
1244
0
  case XML_TOK_OPEN_BRACKET:
1245
0
    state->handler = externalSubset1;
1246
0
    state->includeLevel += 1;
1247
0
    return XML_ROLE_NONE;
1248
0
  }
1249
0
  return common(state, tok);
1250
0
}
1251
1252
static int PTRCALL
1253
condSect2(PROLOG_STATE *state,
1254
          int tok,
1255
          const char *ptr,
1256
          const char *end,
1257
          const ENCODING *enc)
1258
0
{
1259
0
  switch (tok) {
1260
0
  case XML_TOK_PROLOG_S:
1261
0
    return XML_ROLE_NONE;
1262
0
  case XML_TOK_OPEN_BRACKET:
1263
0
    state->handler = externalSubset1;
1264
0
    return XML_ROLE_IGNORE_SECT;
1265
0
  }
1266
0
  return common(state, tok);
1267
0
}
1268
1269
#endif /* XML_DTD */
1270
1271
static int PTRCALL
1272
declClose(PROLOG_STATE *state,
1273
          int tok,
1274
          const char *ptr,
1275
          const char *end,
1276
          const ENCODING *enc)
1277
0
{
1278
0
  switch (tok) {
1279
0
  case XML_TOK_PROLOG_S:
1280
0
    return state->role_none;
1281
0
  case XML_TOK_DECL_CLOSE:
1282
0
    setTopLevel(state);
1283
0
    return state->role_none;
1284
0
  }
1285
0
  return common(state, tok);
1286
0
}
1287
1288
static int PTRCALL
1289
error(PROLOG_STATE *state,
1290
      int tok,
1291
      const char *ptr,
1292
      const char *end,
1293
      const ENCODING *enc)
1294
0
{
1295
0
  return XML_ROLE_NONE;
1296
0
}
1297
1298
static int FASTCALL
1299
common(PROLOG_STATE *state, int tok)
1300
0
{
1301
0
#ifdef XML_DTD
1302
0
  if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)
1303
0
    return XML_ROLE_INNER_PARAM_ENTITY_REF;
1304
0
#endif
1305
0
  state->handler = error;
1306
0
  return XML_ROLE_ERROR;
1307
0
}
1308
1309
void
1310
XmlPrologStateInit(PROLOG_STATE *state)
1311
0
{
1312
0
  state->handler = prolog0;
1313
0
#ifdef XML_DTD
1314
0
  state->documentEntity = 1;
1315
0
  state->includeLevel = 0;
1316
0
  state->inEntityValue = 0;
1317
0
#endif /* XML_DTD */
1318
0
}
1319
1320
#ifdef XML_DTD
1321
1322
void
1323
XmlPrologStateInitExternalEntity(PROLOG_STATE *state)
1324
0
{
1325
0
  state->handler = externalSubset0;
1326
0
  state->documentEntity = 0;
1327
0
  state->includeLevel = 0;
1328
0
}
1329
1330
#endif /* XML_DTD */