xmlrole.c 31.7 KB
Newer Older
Martin v. Löwis's avatar
Martin v. Löwis committed
1 2
/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
   See the file COPYING for copying permission.
Martin v. Löwis's avatar
Martin v. Löwis committed
3 4
*/

5 6
#include <stddef.h>

Martin v. Löwis's avatar
Martin v. Löwis committed
7
#ifdef COMPILED_FROM_DSP
Martin v. Löwis's avatar
Martin v. Löwis committed
8 9 10
#include "winconfig.h"
#elif defined(MACOS_CLASSIC)
#include "macconfig.h"
11
#elif defined(__amigaos__)
12
#include "amigaconfig.h"
13 14
#elif defined(__WATCOMC__)
#include "watcomconfig.h"
Martin v. Löwis's avatar
Martin v. Löwis committed
15
#else
16
#ifdef HAVE_EXPAT_CONFIG_H
Martin v. Löwis's avatar
Martin v. Löwis committed
17
#include <expat_config.h>
18
#endif
Martin v. Löwis's avatar
Martin v. Löwis committed
19 20
#endif /* ndef COMPILED_FROM_DSP */

Fred Drake's avatar
Fred Drake committed
21
#include "expat_external.h"
Martin v. Löwis's avatar
Martin v. Löwis committed
22
#include "internal.h"
Martin v. Löwis's avatar
Martin v. Löwis committed
23 24 25 26 27 28 29 30 31 32
#include "xmlrole.h"
#include "ascii.h"

/* Doesn't check:

 that ,| are not mixed in a model group
 content of literals

*/

Martin v. Löwis's avatar
Martin v. Löwis committed
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
static const char KW_ANY[] = {
    ASCII_A, ASCII_N, ASCII_Y, '\0' };
static const char KW_ATTLIST[] = {
    ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' };
static const char KW_CDATA[] = {
    ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
static const char KW_DOCTYPE[] = {
    ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' };
static const char KW_ELEMENT[] = {
    ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' };
static const char KW_EMPTY[] = {
    ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' };
static const char KW_ENTITIES[] = {
    ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S,
    '\0' };
static const char KW_ENTITY[] = {
    ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };
static const char KW_FIXED[] = {
    ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' };
static const char KW_ID[] = {
    ASCII_I, ASCII_D, '\0' };
static const char KW_IDREF[] = {
    ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };
static const char KW_IDREFS[] = {
    ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };
58
#ifdef XML_DTD
Martin v. Löwis's avatar
Martin v. Löwis committed
59 60
static const char KW_IGNORE[] = {
    ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' };
61
#endif
Martin v. Löwis's avatar
Martin v. Löwis committed
62 63
static const char KW_IMPLIED[] = {
    ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' };
64
#ifdef XML_DTD
Martin v. Löwis's avatar
Martin v. Löwis committed
65 66
static const char KW_INCLUDE[] = {
    ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' };
67
#endif
Martin v. Löwis's avatar
Martin v. Löwis committed
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
static const char KW_NDATA[] = {
    ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
static const char KW_NMTOKEN[] = {
    ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };
static const char KW_NMTOKENS[] = {
    ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S,
    '\0' };
static const char KW_NOTATION[] =
    { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N,
      '\0' };
static const char KW_PCDATA[] = {
    ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
static const char KW_PUBLIC[] = {
    ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' };
static const char KW_REQUIRED[] = {
    ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D,
    '\0' };
static const char KW_SYSTEM[] = {
    ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' };
Martin v. Löwis's avatar
Martin v. Löwis committed
87 88 89 90 91 92 93 94 95 96 97 98 99 100

#ifndef MIN_BYTES_PER_CHAR
#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
#endif

#ifdef XML_DTD
#define setTopLevel(state) \
  ((state)->handler = ((state)->documentEntity \
                       ? internalSubset \
                       : externalSubset1))
#else /* not XML_DTD */
#define setTopLevel(state) ((state)->handler = internalSubset)
#endif /* not XML_DTD */

Martin v. Löwis's avatar
Martin v. Löwis committed
101 102 103 104 105
typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state,
                                   int tok,
                                   const char *ptr,
                                   const char *end,
                                   const ENCODING *enc);
Martin v. Löwis's avatar
Martin v. Löwis committed
106 107 108 109 110 111

static PROLOG_HANDLER
  prolog0, prolog1, prolog2,
  doctype0, doctype1, doctype2, doctype3, doctype4, doctype5,
  internalSubset,
  entity0, entity1, entity2, entity3, entity4, entity5, entity6,
Martin v. Löwis's avatar
Martin v. Löwis committed
112
  entity7, entity8, entity9, entity10,
Martin v. Löwis's avatar
Martin v. Löwis committed
113 114 115 116 117 118 119 120 121 122 123 124
  notation0, notation1, notation2, notation3, notation4,
  attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6,
  attlist7, attlist8, attlist9,
  element0, element1, element2, element3, element4, element5, element6,
  element7,
#ifdef XML_DTD
  externalSubset0, externalSubset1,
  condSect0, condSect1, condSect2,
#endif /* XML_DTD */
  declClose,
  error;

Martin v. Löwis's avatar
Martin v. Löwis committed
125
static int FASTCALL common(PROLOG_STATE *state, int tok);
Martin v. Löwis's avatar
Martin v. Löwis committed
126

Martin v. Löwis's avatar
Martin v. Löwis committed
127 128 129 130 131 132
static int PTRCALL
prolog0(PROLOG_STATE *state,
        int tok,
        const char *ptr,
        const char *end,
        const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
133 134 135 136 137 138 139 140 141 142
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
    state->handler = prolog1;
    return XML_ROLE_NONE;
  case XML_TOK_XML_DECL:
    state->handler = prolog1;
    return XML_ROLE_XML_DECL;
  case XML_TOK_PI:
    state->handler = prolog1;
Martin v. Löwis's avatar
Martin v. Löwis committed
143
    return XML_ROLE_PI;
Martin v. Löwis's avatar
Martin v. Löwis committed
144 145
  case XML_TOK_COMMENT:
    state->handler = prolog1;
Martin v. Löwis's avatar
Martin v. Löwis committed
146
    return XML_ROLE_COMMENT;
Martin v. Löwis's avatar
Martin v. Löwis committed
147 148 149 150
  case XML_TOK_BOM:
    return XML_ROLE_NONE;
  case XML_TOK_DECL_OPEN:
    if (!XmlNameMatchesAscii(enc,
Martin v. Löwis's avatar
Martin v. Löwis committed
151 152 153
                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),
                             end,
                             KW_DOCTYPE))
Martin v. Löwis's avatar
Martin v. Löwis committed
154 155
      break;
    state->handler = doctype0;
Martin v. Löwis's avatar
Martin v. Löwis committed
156
    return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
157 158 159 160 161 162 163
  case XML_TOK_INSTANCE_START:
    state->handler = error;
    return XML_ROLE_INSTANCE_START;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
164 165 166 167 168 169
static int PTRCALL
prolog1(PROLOG_STATE *state,
        int tok,
        const char *ptr,
        const char *end,
        const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
170 171 172 173 174
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
    return XML_ROLE_NONE;
  case XML_TOK_PI:
Martin v. Löwis's avatar
Martin v. Löwis committed
175
    return XML_ROLE_PI;
Martin v. Löwis's avatar
Martin v. Löwis committed
176
  case XML_TOK_COMMENT:
Martin v. Löwis's avatar
Martin v. Löwis committed
177
    return XML_ROLE_COMMENT;
Martin v. Löwis's avatar
Martin v. Löwis committed
178 179 180 181
  case XML_TOK_BOM:
    return XML_ROLE_NONE;
  case XML_TOK_DECL_OPEN:
    if (!XmlNameMatchesAscii(enc,
Martin v. Löwis's avatar
Martin v. Löwis committed
182 183 184
                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),
                             end,
                             KW_DOCTYPE))
Martin v. Löwis's avatar
Martin v. Löwis committed
185 186
      break;
    state->handler = doctype0;
Martin v. Löwis's avatar
Martin v. Löwis committed
187
    return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
188 189 190 191 192 193 194
  case XML_TOK_INSTANCE_START:
    state->handler = error;
    return XML_ROLE_INSTANCE_START;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
195 196 197 198 199 200
static int PTRCALL
prolog2(PROLOG_STATE *state,
        int tok,
        const char *ptr,
        const char *end,
        const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
201 202 203 204 205
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
    return XML_ROLE_NONE;
  case XML_TOK_PI:
Martin v. Löwis's avatar
Martin v. Löwis committed
206
    return XML_ROLE_PI;
Martin v. Löwis's avatar
Martin v. Löwis committed
207
  case XML_TOK_COMMENT:
Martin v. Löwis's avatar
Martin v. Löwis committed
208
    return XML_ROLE_COMMENT;
Martin v. Löwis's avatar
Martin v. Löwis committed
209 210 211 212 213 214 215
  case XML_TOK_INSTANCE_START:
    state->handler = error;
    return XML_ROLE_INSTANCE_START;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
216 217 218 219 220 221
static int PTRCALL
doctype0(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
222 223 224
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
225
    return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
226 227 228 229 230 231 232 233
  case XML_TOK_NAME:
  case XML_TOK_PREFIXED_NAME:
    state->handler = doctype1;
    return XML_ROLE_DOCTYPE_NAME;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
234 235 236 237 238 239
static int PTRCALL
doctype1(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
240 241 242
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
243
    return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
244 245 246 247 248 249 250 251 252
  case XML_TOK_OPEN_BRACKET:
    state->handler = internalSubset;
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
  case XML_TOK_DECL_CLOSE:
    state->handler = prolog2;
    return XML_ROLE_DOCTYPE_CLOSE;
  case XML_TOK_NAME:
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
      state->handler = doctype3;
Martin v. Löwis's avatar
Martin v. Löwis committed
253
      return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
254 255 256
    }
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
      state->handler = doctype2;
Martin v. Löwis's avatar
Martin v. Löwis committed
257
      return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
258 259 260 261 262 263
    }
    break;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
264 265 266 267 268 269
static int PTRCALL
doctype2(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
270 271 272
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
273
    return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
274 275 276 277 278 279 280
  case XML_TOK_LITERAL:
    state->handler = doctype3;
    return XML_ROLE_DOCTYPE_PUBLIC_ID;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
281 282 283 284 285 286
static int PTRCALL
doctype3(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
287 288 289
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
290
    return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
291 292 293 294 295 296 297
  case XML_TOK_LITERAL:
    state->handler = doctype4;
    return XML_ROLE_DOCTYPE_SYSTEM_ID;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
298 299 300 301 302 303
static int PTRCALL
doctype4(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
304 305 306
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
307
    return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
308 309 310 311 312 313 314 315 316 317
  case XML_TOK_OPEN_BRACKET:
    state->handler = internalSubset;
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
  case XML_TOK_DECL_CLOSE:
    state->handler = prolog2;
    return XML_ROLE_DOCTYPE_CLOSE;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
318 319 320 321 322 323
static int PTRCALL
doctype5(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
324 325 326
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
327
    return XML_ROLE_DOCTYPE_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
328 329 330 331 332 333 334
  case XML_TOK_DECL_CLOSE:
    state->handler = prolog2;
    return XML_ROLE_DOCTYPE_CLOSE;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
335 336 337 338 339 340
static int PTRCALL
internalSubset(PROLOG_STATE *state,
               int tok,
               const char *ptr,
               const char *end,
               const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
341 342 343 344 345 346
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
    return XML_ROLE_NONE;
  case XML_TOK_DECL_OPEN:
    if (XmlNameMatchesAscii(enc,
Martin v. Löwis's avatar
Martin v. Löwis committed
347 348 349
                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),
                            end,
                            KW_ENTITY)) {
Martin v. Löwis's avatar
Martin v. Löwis committed
350
      state->handler = entity0;
Martin v. Löwis's avatar
Martin v. Löwis committed
351
      return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
352 353
    }
    if (XmlNameMatchesAscii(enc,
Martin v. Löwis's avatar
Martin v. Löwis committed
354 355 356
                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),
                            end,
                            KW_ATTLIST)) {
Martin v. Löwis's avatar
Martin v. Löwis committed
357
      state->handler = attlist0;
Martin v. Löwis's avatar
Martin v. Löwis committed
358
      return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
359 360
    }
    if (XmlNameMatchesAscii(enc,
Martin v. Löwis's avatar
Martin v. Löwis committed
361 362 363
                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),
                            end,
                            KW_ELEMENT)) {
Martin v. Löwis's avatar
Martin v. Löwis committed
364
      state->handler = element0;
Martin v. Löwis's avatar
Martin v. Löwis committed
365
      return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
366 367
    }
    if (XmlNameMatchesAscii(enc,
Martin v. Löwis's avatar
Martin v. Löwis committed
368 369 370
                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),
                            end,
                            KW_NOTATION)) {
Martin v. Löwis's avatar
Martin v. Löwis committed
371
      state->handler = notation0;
Martin v. Löwis's avatar
Martin v. Löwis committed
372
      return XML_ROLE_NOTATION_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
373 374 375
    }
    break;
  case XML_TOK_PI:
Martin v. Löwis's avatar
Martin v. Löwis committed
376
    return XML_ROLE_PI;
Martin v. Löwis's avatar
Martin v. Löwis committed
377
  case XML_TOK_COMMENT:
Martin v. Löwis's avatar
Martin v. Löwis committed
378
    return XML_ROLE_COMMENT;
Martin v. Löwis's avatar
Martin v. Löwis committed
379 380 381 382
  case XML_TOK_PARAM_ENTITY_REF:
    return XML_ROLE_PARAM_ENTITY_REF;
  case XML_TOK_CLOSE_BRACKET:
    state->handler = doctype5;
Martin v. Löwis's avatar
Martin v. Löwis committed
383
    return XML_ROLE_DOCTYPE_NONE;
Fred Drake's avatar
Fred Drake committed
384 385
  case XML_TOK_NONE:
    return XML_ROLE_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
386 387 388 389 390 391
  }
  return common(state, tok);
}

#ifdef XML_DTD

Martin v. Löwis's avatar
Martin v. Löwis committed
392 393 394 395 396 397
static int PTRCALL
externalSubset0(PROLOG_STATE *state,
                int tok,
                const char *ptr,
                const char *end,
                const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
398 399 400 401 402 403 404
{
  state->handler = externalSubset1;
  if (tok == XML_TOK_XML_DECL)
    return XML_ROLE_TEXT_DECL;
  return externalSubset1(state, tok, ptr, end, enc);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
405 406 407 408 409 410
static int PTRCALL
externalSubset1(PROLOG_STATE *state,
                int tok,
                const char *ptr,
                const char *end,
                const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
{
  switch (tok) {
  case XML_TOK_COND_SECT_OPEN:
    state->handler = condSect0;
    return XML_ROLE_NONE;
  case XML_TOK_COND_SECT_CLOSE:
    if (state->includeLevel == 0)
      break;
    state->includeLevel -= 1;
    return XML_ROLE_NONE;
  case XML_TOK_PROLOG_S:
    return XML_ROLE_NONE;
  case XML_TOK_CLOSE_BRACKET:
    break;
  case XML_TOK_NONE:
    if (state->includeLevel)
      break;
    return XML_ROLE_NONE;
  default:
    return internalSubset(state, tok, ptr, end, enc);
  }
  return common(state, tok);
}

#endif /* XML_DTD */

Martin v. Löwis's avatar
Martin v. Löwis committed
437 438 439 440 441 442
static int PTRCALL
entity0(PROLOG_STATE *state,
        int tok,
        const char *ptr,
        const char *end,
        const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
443 444 445
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
446
    return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
447 448
  case XML_TOK_PERCENT:
    state->handler = entity1;
Martin v. Löwis's avatar
Martin v. Löwis committed
449
    return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
450 451 452 453 454 455 456
  case XML_TOK_NAME:
    state->handler = entity2;
    return XML_ROLE_GENERAL_ENTITY_NAME;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
457 458 459 460 461 462
static int PTRCALL
entity1(PROLOG_STATE *state,
        int tok,
        const char *ptr,
        const char *end,
        const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
463 464 465
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
466
    return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
467 468 469 470 471 472 473
  case XML_TOK_NAME:
    state->handler = entity7;
    return XML_ROLE_PARAM_ENTITY_NAME;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
474 475 476 477 478 479
static int PTRCALL
entity2(PROLOG_STATE *state,
        int tok,
        const char *ptr,
        const char *end,
        const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
480 481 482
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
483
    return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
484 485 486
  case XML_TOK_NAME:
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
      state->handler = entity4;
Martin v. Löwis's avatar
Martin v. Löwis committed
487
      return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
488 489 490
    }
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
      state->handler = entity3;
Martin v. Löwis's avatar
Martin v. Löwis committed
491
      return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
492 493 494 495
    }
    break;
  case XML_TOK_LITERAL:
    state->handler = declClose;
Martin v. Löwis's avatar
Martin v. Löwis committed
496
    state->role_none = XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
497 498 499 500 501
    return XML_ROLE_ENTITY_VALUE;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
502 503 504 505 506 507
static int PTRCALL
entity3(PROLOG_STATE *state,
        int tok,
        const char *ptr,
        const char *end,
        const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
508 509 510
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
511
    return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
512 513 514 515 516 517 518
  case XML_TOK_LITERAL:
    state->handler = entity4;
    return XML_ROLE_ENTITY_PUBLIC_ID;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
519 520 521 522 523 524
static int PTRCALL
entity4(PROLOG_STATE *state,
        int tok,
        const char *ptr,
        const char *end,
        const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
525 526 527
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
528
    return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
529 530 531 532 533 534 535
  case XML_TOK_LITERAL:
    state->handler = entity5;
    return XML_ROLE_ENTITY_SYSTEM_ID;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
536 537 538 539 540 541
static int PTRCALL
entity5(PROLOG_STATE *state,
        int tok,
        const char *ptr,
        const char *end,
        const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
542 543 544
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
545
    return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
546 547 548 549 550 551
  case XML_TOK_DECL_CLOSE:
    setTopLevel(state);
    return XML_ROLE_ENTITY_COMPLETE;
  case XML_TOK_NAME:
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
      state->handler = entity6;
Martin v. Löwis's avatar
Martin v. Löwis committed
552
      return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
553 554 555 556 557 558
    }
    break;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
559 560 561 562 563 564
static int PTRCALL
entity6(PROLOG_STATE *state,
        int tok,
        const char *ptr,
        const char *end,
        const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
565 566 567
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
568
    return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
569 570
  case XML_TOK_NAME:
    state->handler = declClose;
Martin v. Löwis's avatar
Martin v. Löwis committed
571
    state->role_none = XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
572 573 574 575 576
    return XML_ROLE_ENTITY_NOTATION_NAME;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
577 578 579 580 581 582
static int PTRCALL
entity7(PROLOG_STATE *state,
        int tok,
        const char *ptr,
        const char *end,
        const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
583 584 585
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
586
    return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
587 588 589
  case XML_TOK_NAME:
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
      state->handler = entity9;
Martin v. Löwis's avatar
Martin v. Löwis committed
590
      return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
591 592 593
    }
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
      state->handler = entity8;
Martin v. Löwis's avatar
Martin v. Löwis committed
594
      return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
595 596 597 598
    }
    break;
  case XML_TOK_LITERAL:
    state->handler = declClose;
Martin v. Löwis's avatar
Martin v. Löwis committed
599
    state->role_none = XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
600 601 602 603 604
    return XML_ROLE_ENTITY_VALUE;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
605 606 607 608 609 610
static int PTRCALL
entity8(PROLOG_STATE *state,
        int tok,
        const char *ptr,
        const char *end,
        const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
611 612 613
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
614
    return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
615 616 617 618 619 620 621
  case XML_TOK_LITERAL:
    state->handler = entity9;
    return XML_ROLE_ENTITY_PUBLIC_ID;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
622 623 624 625 626 627
static int PTRCALL
entity9(PROLOG_STATE *state,
        int tok,
        const char *ptr,
        const char *end,
        const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
628 629 630
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
631
    return XML_ROLE_ENTITY_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
632
  case XML_TOK_LITERAL:
Martin v. Löwis's avatar
Martin v. Löwis committed
633
    state->handler = entity10;
Martin v. Löwis's avatar
Martin v. Löwis committed
634 635 636 637 638
    return XML_ROLE_ENTITY_SYSTEM_ID;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
639 640 641 642 643 644
static int PTRCALL
entity10(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
645 646 647
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665
    return XML_ROLE_ENTITY_NONE;
  case XML_TOK_DECL_CLOSE:
    setTopLevel(state);
    return XML_ROLE_ENTITY_COMPLETE;
  }
  return common(state, tok);
}

static int PTRCALL
notation0(PROLOG_STATE *state,
          int tok,
          const char *ptr,
          const char *end,
          const ENCODING *enc)
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
    return XML_ROLE_NOTATION_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
666 667 668 669 670 671 672
  case XML_TOK_NAME:
    state->handler = notation1;
    return XML_ROLE_NOTATION_NAME;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
673 674 675 676 677 678
static int PTRCALL
notation1(PROLOG_STATE *state,
          int tok,
          const char *ptr,
          const char *end,
          const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
679 680 681
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
682
    return XML_ROLE_NOTATION_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
683 684 685
  case XML_TOK_NAME:
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
      state->handler = notation3;
Martin v. Löwis's avatar
Martin v. Löwis committed
686
      return XML_ROLE_NOTATION_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
687 688 689
    }
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
      state->handler = notation2;
Martin v. Löwis's avatar
Martin v. Löwis committed
690
      return XML_ROLE_NOTATION_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
691 692 693 694 695 696
    }
    break;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
697 698 699 700 701 702
static int PTRCALL
notation2(PROLOG_STATE *state,
          int tok,
          const char *ptr,
          const char *end,
          const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
703 704 705
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
706
    return XML_ROLE_NOTATION_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
707 708 709 710 711 712 713
  case XML_TOK_LITERAL:
    state->handler = notation4;
    return XML_ROLE_NOTATION_PUBLIC_ID;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
714 715 716 717 718 719
static int PTRCALL
notation3(PROLOG_STATE *state,
          int tok,
          const char *ptr,
          const char *end,
          const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
720 721 722
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
723
    return XML_ROLE_NOTATION_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
724 725
  case XML_TOK_LITERAL:
    state->handler = declClose;
Martin v. Löwis's avatar
Martin v. Löwis committed
726
    state->role_none = XML_ROLE_NOTATION_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
727 728 729 730 731
    return XML_ROLE_NOTATION_SYSTEM_ID;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
732 733 734 735 736 737
static int PTRCALL
notation4(PROLOG_STATE *state,
          int tok,
          const char *ptr,
          const char *end,
          const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
738 739 740
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
741
    return XML_ROLE_NOTATION_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
742 743
  case XML_TOK_LITERAL:
    state->handler = declClose;
Martin v. Löwis's avatar
Martin v. Löwis committed
744
    state->role_none = XML_ROLE_NOTATION_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
745 746 747 748 749 750 751 752
    return XML_ROLE_NOTATION_SYSTEM_ID;
  case XML_TOK_DECL_CLOSE:
    setTopLevel(state);
    return XML_ROLE_NOTATION_NO_SYSTEM_ID;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
753 754 755 756 757 758
static int PTRCALL
attlist0(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
759 760 761
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
762
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
763 764 765 766 767 768 769 770
  case XML_TOK_NAME:
  case XML_TOK_PREFIXED_NAME:
    state->handler = attlist1;
    return XML_ROLE_ATTLIST_ELEMENT_NAME;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
771 772 773 774 775 776
static int PTRCALL
attlist1(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
777 778 779
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
780
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
781 782
  case XML_TOK_DECL_CLOSE:
    setTopLevel(state);
Martin v. Löwis's avatar
Martin v. Löwis committed
783
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
784 785 786 787 788 789 790 791
  case XML_TOK_NAME:
  case XML_TOK_PREFIXED_NAME:
    state->handler = attlist2;
    return XML_ROLE_ATTRIBUTE_NAME;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
792 793 794 795 796 797
static int PTRCALL
attlist2(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
798 799 800
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
801
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
802 803
  case XML_TOK_NAME:
    {
804
      static const char * const types[] = {
Martin v. Löwis's avatar
Martin v. Löwis committed
805
        KW_CDATA,
Martin v. Löwis's avatar
Martin v. Löwis committed
806 807 808 809 810 811 812 813 814 815
        KW_ID,
        KW_IDREF,
        KW_IDREFS,
        KW_ENTITY,
        KW_ENTITIES,
        KW_NMTOKEN,
        KW_NMTOKENS,
      };
      int i;
      for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++)
Martin v. Löwis's avatar
Martin v. Löwis committed
816 817 818 819
        if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
          state->handler = attlist8;
          return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
        }
Martin v. Löwis's avatar
Martin v. Löwis committed
820 821 822
    }
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
      state->handler = attlist5;
Martin v. Löwis's avatar
Martin v. Löwis committed
823
      return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
824 825 826 827
    }
    break;
  case XML_TOK_OPEN_PAREN:
    state->handler = attlist3;
Martin v. Löwis's avatar
Martin v. Löwis committed
828
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
829 830 831 832
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
833 834 835 836 837 838
static int PTRCALL
attlist3(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
839 840 841
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
842
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
843 844 845 846 847 848 849 850 851
  case XML_TOK_NMTOKEN:
  case XML_TOK_NAME:
  case XML_TOK_PREFIXED_NAME:
    state->handler = attlist4;
    return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
852 853 854 855 856 857
static int PTRCALL
attlist4(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
858 859 860
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
861
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
862 863
  case XML_TOK_CLOSE_PAREN:
    state->handler = attlist8;
Martin v. Löwis's avatar
Martin v. Löwis committed
864
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
865 866
  case XML_TOK_OR:
    state->handler = attlist3;
Martin v. Löwis's avatar
Martin v. Löwis committed
867
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
868 869 870 871
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
872 873 874 875 876 877
static int PTRCALL
attlist5(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
878 879 880
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
881
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
882 883
  case XML_TOK_OPEN_PAREN:
    state->handler = attlist6;
Martin v. Löwis's avatar
Martin v. Löwis committed
884
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
885 886 887 888
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
889 890 891 892 893 894
static int PTRCALL
attlist6(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
895 896 897
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
898
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
899 900 901 902 903 904 905
  case XML_TOK_NAME:
    state->handler = attlist7;
    return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
906 907 908 909 910 911
static int PTRCALL
attlist7(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
912 913 914
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
915
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
916 917
  case XML_TOK_CLOSE_PAREN:
    state->handler = attlist8;
Martin v. Löwis's avatar
Martin v. Löwis committed
918
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
919 920
  case XML_TOK_OR:
    state->handler = attlist6;
Martin v. Löwis's avatar
Martin v. Löwis committed
921
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
922 923 924 925 926
  }
  return common(state, tok);
}

/* default value */
Martin v. Löwis's avatar
Martin v. Löwis committed
927 928 929 930 931 932
static int PTRCALL
attlist8(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
933 934 935
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
936
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
937 938
  case XML_TOK_POUND_NAME:
    if (XmlNameMatchesAscii(enc,
Martin v. Löwis's avatar
Martin v. Löwis committed
939 940 941
                            ptr + MIN_BYTES_PER_CHAR(enc),
                            end,
                            KW_IMPLIED)) {
Martin v. Löwis's avatar
Martin v. Löwis committed
942 943 944 945
      state->handler = attlist1;
      return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
    }
    if (XmlNameMatchesAscii(enc,
Martin v. Löwis's avatar
Martin v. Löwis committed
946 947 948
                            ptr + MIN_BYTES_PER_CHAR(enc),
                            end,
                            KW_REQUIRED)) {
Martin v. Löwis's avatar
Martin v. Löwis committed
949 950 951 952
      state->handler = attlist1;
      return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
    }
    if (XmlNameMatchesAscii(enc,
Martin v. Löwis's avatar
Martin v. Löwis committed
953 954 955
                            ptr + MIN_BYTES_PER_CHAR(enc),
                            end,
                            KW_FIXED)) {
Martin v. Löwis's avatar
Martin v. Löwis committed
956
      state->handler = attlist9;
Martin v. Löwis's avatar
Martin v. Löwis committed
957
      return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
958 959 960 961 962 963 964 965 966
    }
    break;
  case XML_TOK_LITERAL:
    state->handler = attlist1;
    return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
967 968 969 970 971 972
static int PTRCALL
attlist9(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
973 974 975
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
976
    return XML_ROLE_ATTLIST_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
977 978 979 980 981 982 983
  case XML_TOK_LITERAL:
    state->handler = attlist1;
    return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
984 985 986 987 988 989
static int PTRCALL
element0(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
990 991 992
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
993
    return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
994 995 996 997 998 999 1000 1001
  case XML_TOK_NAME:
  case XML_TOK_PREFIXED_NAME:
    state->handler = element1;
    return XML_ROLE_ELEMENT_NAME;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
1002 1003 1004 1005 1006 1007
static int PTRCALL
element1(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
1008 1009 1010
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
1011
    return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
1012 1013 1014
  case XML_TOK_NAME:
    if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
      state->handler = declClose;
Martin v. Löwis's avatar
Martin v. Löwis committed
1015
      state->role_none = XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
1016 1017 1018 1019
      return XML_ROLE_CONTENT_EMPTY;
    }
    if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
      state->handler = declClose;
Martin v. Löwis's avatar
Martin v. Löwis committed
1020
      state->role_none = XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
      return XML_ROLE_CONTENT_ANY;
    }
    break;
  case XML_TOK_OPEN_PAREN:
    state->handler = element2;
    state->level = 1;
    return XML_ROLE_GROUP_OPEN;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
1032 1033 1034 1035 1036 1037
static int PTRCALL
element2(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
1038 1039 1040
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
1041
    return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
1042 1043
  case XML_TOK_POUND_NAME:
    if (XmlNameMatchesAscii(enc,
Martin v. Löwis's avatar
Martin v. Löwis committed
1044 1045 1046
                            ptr + MIN_BYTES_PER_CHAR(enc),
                            end,
                            KW_PCDATA)) {
Martin v. Löwis's avatar
Martin v. Löwis committed
1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071
      state->handler = element3;
      return XML_ROLE_CONTENT_PCDATA;
    }
    break;
  case XML_TOK_OPEN_PAREN:
    state->level = 2;
    state->handler = element6;
    return XML_ROLE_GROUP_OPEN;
  case XML_TOK_NAME:
  case XML_TOK_PREFIXED_NAME:
    state->handler = element7;
    return XML_ROLE_CONTENT_ELEMENT;
  case XML_TOK_NAME_QUESTION:
    state->handler = element7;
    return XML_ROLE_CONTENT_ELEMENT_OPT;
  case XML_TOK_NAME_ASTERISK:
    state->handler = element7;
    return XML_ROLE_CONTENT_ELEMENT_REP;
  case XML_TOK_NAME_PLUS:
    state->handler = element7;
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
1072 1073 1074 1075 1076 1077
static int PTRCALL
element3(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
1078 1079 1080
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
1081
    return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
1082 1083
  case XML_TOK_CLOSE_PAREN:
    state->handler = declClose;
Martin v. Löwis's avatar
Martin v. Löwis committed
1084
    state->role_none = XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
1085 1086 1087
    return XML_ROLE_GROUP_CLOSE;
  case XML_TOK_CLOSE_PAREN_ASTERISK:
    state->handler = declClose;
Martin v. Löwis's avatar
Martin v. Löwis committed
1088
    state->role_none = XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
1089 1090 1091
    return XML_ROLE_GROUP_CLOSE_REP;
  case XML_TOK_OR:
    state->handler = element4;
Martin v. Löwis's avatar
Martin v. Löwis committed
1092
    return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
1093 1094 1095 1096
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
1097 1098 1099 1100 1101 1102
static int PTRCALL
element4(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
1103 1104 1105
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
1106
    return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
1107 1108 1109 1110 1111 1112 1113 1114
  case XML_TOK_NAME:
  case XML_TOK_PREFIXED_NAME:
    state->handler = element5;
    return XML_ROLE_CONTENT_ELEMENT;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
1115 1116 1117 1118 1119 1120
static int PTRCALL
element5(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
1121 1122 1123
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
1124
    return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
1125 1126
  case XML_TOK_CLOSE_PAREN_ASTERISK:
    state->handler = declClose;
Martin v. Löwis's avatar
Martin v. Löwis committed
1127
    state->role_none = XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
1128 1129 1130
    return XML_ROLE_GROUP_CLOSE_REP;
  case XML_TOK_OR:
    state->handler = element4;
Martin v. Löwis's avatar
Martin v. Löwis committed
1131
    return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
1132 1133 1134 1135
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
1136 1137 1138 1139 1140 1141
static int PTRCALL
element6(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
1142 1143 1144
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
1145
    return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165
  case XML_TOK_OPEN_PAREN:
    state->level += 1;
    return XML_ROLE_GROUP_OPEN;
  case XML_TOK_NAME:
  case XML_TOK_PREFIXED_NAME:
    state->handler = element7;
    return XML_ROLE_CONTENT_ELEMENT;
  case XML_TOK_NAME_QUESTION:
    state->handler = element7;
    return XML_ROLE_CONTENT_ELEMENT_OPT;
  case XML_TOK_NAME_ASTERISK:
    state->handler = element7;
    return XML_ROLE_CONTENT_ELEMENT_REP;
  case XML_TOK_NAME_PLUS:
    state->handler = element7;
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
1166 1167 1168 1169 1170 1171
static int PTRCALL
element7(PROLOG_STATE *state,
         int tok,
         const char *ptr,
         const char *end,
         const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
1172 1173 1174
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
1175
    return XML_ROLE_ELEMENT_NONE;
Martin v. Löwis's avatar
Martin v. Löwis committed
1176 1177
  case XML_TOK_CLOSE_PAREN:
    state->level -= 1;
Martin v. Löwis's avatar
Martin v. Löwis committed
1178
    if (state->level == 0) {
Martin v. Löwis's avatar
Martin v. Löwis committed
1179
      state->handler = declClose;
Martin v. Löwis's avatar
Martin v. Löwis committed
1180 1181
      state->role_none = XML_ROLE_ELEMENT_NONE;
    }
Martin v. Löwis's avatar
Martin v. Löwis committed
1182 1183 1184
    return XML_ROLE_GROUP_CLOSE;
  case XML_TOK_CLOSE_PAREN_ASTERISK:
    state->level -= 1;
Martin v. Löwis's avatar
Martin v. Löwis committed
1185
    if (state->level == 0) {
Martin v. Löwis's avatar
Martin v. Löwis committed
1186
      state->handler = declClose;
Martin v. Löwis's avatar
Martin v. Löwis committed
1187 1188
      state->role_none = XML_ROLE_ELEMENT_NONE;
    }
Martin v. Löwis's avatar
Martin v. Löwis committed
1189 1190 1191
    return XML_ROLE_GROUP_CLOSE_REP;
  case XML_TOK_CLOSE_PAREN_QUESTION:
    state->level -= 1;
Martin v. Löwis's avatar
Martin v. Löwis committed
1192
    if (state->level == 0) {
Martin v. Löwis's avatar
Martin v. Löwis committed
1193
      state->handler = declClose;
Martin v. Löwis's avatar
Martin v. Löwis committed
1194 1195
      state->role_none = XML_ROLE_ELEMENT_NONE;
    }
Martin v. Löwis's avatar
Martin v. Löwis committed
1196 1197 1198
    return XML_ROLE_GROUP_CLOSE_OPT;
  case XML_TOK_CLOSE_PAREN_PLUS:
    state->level -= 1;
Martin v. Löwis's avatar
Martin v. Löwis committed
1199
    if (state->level == 0) {
Martin v. Löwis's avatar
Martin v. Löwis committed
1200
      state->handler = declClose;
Martin v. Löwis's avatar
Martin v. Löwis committed
1201 1202
      state->role_none = XML_ROLE_ELEMENT_NONE;
    }
Martin v. Löwis's avatar
Martin v. Löwis committed
1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215
    return XML_ROLE_GROUP_CLOSE_PLUS;
  case XML_TOK_COMMA:
    state->handler = element6;
    return XML_ROLE_GROUP_SEQUENCE;
  case XML_TOK_OR:
    state->handler = element6;
    return XML_ROLE_GROUP_CHOICE;
  }
  return common(state, tok);
}

#ifdef XML_DTD

Martin v. Löwis's avatar
Martin v. Löwis committed
1216 1217 1218 1219 1220 1221
static int PTRCALL
condSect0(PROLOG_STATE *state,
          int tok,
          const char *ptr,
          const char *end,
          const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
    return XML_ROLE_NONE;
  case XML_TOK_NAME:
    if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {
      state->handler = condSect1;
      return XML_ROLE_NONE;
    }
    if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {
      state->handler = condSect2;
      return XML_ROLE_NONE;
    }
    break;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
1240 1241 1242 1243 1244 1245
static int PTRCALL
condSect1(PROLOG_STATE *state,
          int tok,
          const char *ptr,
          const char *end,
          const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
    return XML_ROLE_NONE;
  case XML_TOK_OPEN_BRACKET:
    state->handler = externalSubset1;
    state->includeLevel += 1;
    return XML_ROLE_NONE;
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
1258 1259 1260 1261 1262 1263
static int PTRCALL
condSect2(PROLOG_STATE *state,
          int tok,
          const char *ptr,
          const char *end,
          const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
    return XML_ROLE_NONE;
  case XML_TOK_OPEN_BRACKET:
    state->handler = externalSubset1;
    return XML_ROLE_IGNORE_SECT;
  }
  return common(state, tok);
}

#endif /* XML_DTD */

Martin v. Löwis's avatar
Martin v. Löwis committed
1277 1278 1279 1280 1281 1282
static int PTRCALL
declClose(PROLOG_STATE *state,
          int tok,
          const char *ptr,
          const char *end,
          const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
1283 1284 1285
{
  switch (tok) {
  case XML_TOK_PROLOG_S:
Martin v. Löwis's avatar
Martin v. Löwis committed
1286
    return state->role_none;
Martin v. Löwis's avatar
Martin v. Löwis committed
1287 1288
  case XML_TOK_DECL_CLOSE:
    setTopLevel(state);
Martin v. Löwis's avatar
Martin v. Löwis committed
1289
    return state->role_none;
Martin v. Löwis's avatar
Martin v. Löwis committed
1290 1291 1292 1293
  }
  return common(state, tok);
}

Martin v. Löwis's avatar
Martin v. Löwis committed
1294 1295 1296 1297 1298 1299
static int PTRCALL
error(PROLOG_STATE *state,
      int tok,
      const char *ptr,
      const char *end,
      const ENCODING *enc)
Martin v. Löwis's avatar
Martin v. Löwis committed
1300 1301 1302 1303
{
  return XML_ROLE_NONE;
}

Martin v. Löwis's avatar
Martin v. Löwis committed
1304 1305
static int FASTCALL
common(PROLOG_STATE *state, int tok)
Martin v. Löwis's avatar
Martin v. Löwis committed
1306 1307 1308 1309 1310 1311 1312 1313 1314
{
#ifdef XML_DTD
  if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)
    return XML_ROLE_INNER_PARAM_ENTITY_REF;
#endif
  state->handler = error;
  return XML_ROLE_ERROR;
}

Martin v. Löwis's avatar
Martin v. Löwis committed
1315 1316
void
XmlPrologStateInit(PROLOG_STATE *state)
Martin v. Löwis's avatar
Martin v. Löwis committed
1317 1318 1319 1320 1321
{
  state->handler = prolog0;
#ifdef XML_DTD
  state->documentEntity = 1;
  state->includeLevel = 0;
Martin v. Löwis's avatar
Martin v. Löwis committed
1322
  state->inEntityValue = 0;
Martin v. Löwis's avatar
Martin v. Löwis committed
1323 1324 1325 1326 1327
#endif /* XML_DTD */
}

#ifdef XML_DTD

Martin v. Löwis's avatar
Martin v. Löwis committed
1328 1329
void
XmlPrologStateInitExternalEntity(PROLOG_STATE *state)
Martin v. Löwis's avatar
Martin v. Löwis committed
1330 1331 1332 1333 1334 1335 1336
{
  state->handler = externalSubset0;
  state->documentEntity = 0;
  state->includeLevel = 0;
}

#endif /* XML_DTD */