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