mcabber/libjabber/xmlrole.c
changeset 25 bf3d6e241714
equal deleted inserted replaced
24:e88b15cbf2de 25:bf3d6e241714
       
     1 /*
       
     2 The contents of this file are subject to the Mozilla Public License
       
     3 Version 1.1 (the "License"); you may not use this file except in
       
     4 compliance with the License. You may obtain a copy of the License at
       
     5 http://www.mozilla.org/MPL/
       
     6 
       
     7 Software distributed under the License is distributed on an "AS IS"
       
     8 basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
       
     9 License for the specific language governing rights and limitations
       
    10 under the License.
       
    11 
       
    12 The Original Code is expat.
       
    13 
       
    14 The Initial Developer of the Original Code is James Clark.
       
    15 Portions created by James Clark are Copyright (C) 1998, 1999
       
    16 James Clark. All Rights Reserved.
       
    17 
       
    18 Contributor(s):
       
    19 
       
    20 Alternatively, the contents of this file may be used under the terms
       
    21 of the GNU General Public License (the "GPL"), in which case the
       
    22 provisions of the GPL are applicable instead of those above.  If you
       
    23 wish to allow use of your version of this file only under the terms of
       
    24 the GPL and not to allow others to use your version of this file under
       
    25 the MPL, indicate your decision by deleting the provisions above and
       
    26 replace them with the notice and other provisions required by the
       
    27 GPL. If you do not delete the provisions above, a recipient may use
       
    28 your version of this file under either the MPL or the GPL.
       
    29 */
       
    30 
       
    31 #include "xmldef.h"
       
    32 #include "xmlrole.h"
       
    33 
       
    34 /* Doesn't check:
       
    35 
       
    36  that ,| are not mixed in a model group
       
    37  content of literals
       
    38 
       
    39 */
       
    40 
       
    41 #ifndef MIN_BYTES_PER_CHAR
       
    42 #define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
       
    43 #endif
       
    44 
       
    45 typedef int PROLOG_HANDLER(struct prolog_state *state,
       
    46                            int tok,
       
    47                            const char *ptr,
       
    48                            const char *end,
       
    49                            const ENCODING *enc);
       
    50 
       
    51 static PROLOG_HANDLER
       
    52 prolog0, prolog1, prolog2,
       
    53 doctype0, doctype1, doctype2, doctype3, doctype4, doctype5,
       
    54 internalSubset,
       
    55 entity0, entity1, entity2, entity3, entity4, entity5, entity6,
       
    56 entity7, entity8, entity9,
       
    57 notation0, notation1, notation2, notation3, notation4,
       
    58 attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6,
       
    59 attlist7, attlist8, attlist9,
       
    60 element0, element1, element2, element3, element4, element5, element6,
       
    61 element7,
       
    62 declClose,
       
    63 error;
       
    64 
       
    65 static
       
    66 int syntaxError(PROLOG_STATE *);
       
    67 
       
    68 static
       
    69 int prolog0(PROLOG_STATE *state,
       
    70             int tok,
       
    71             const char *ptr,
       
    72             const char *end,
       
    73             const ENCODING *enc)
       
    74 {
       
    75     switch (tok) {
       
    76     case XML_TOK_PROLOG_S:
       
    77         state->handler = prolog1;
       
    78         return XML_ROLE_NONE;
       
    79     case XML_TOK_XML_DECL:
       
    80         state->handler = prolog1;
       
    81         return XML_ROLE_XML_DECL;
       
    82     case XML_TOK_PI:
       
    83         state->handler = prolog1;
       
    84         return XML_ROLE_NONE;
       
    85     case XML_TOK_COMMENT:
       
    86         state->handler = prolog1;
       
    87     case XML_TOK_BOM:
       
    88         return XML_ROLE_NONE;
       
    89     case XML_TOK_DECL_OPEN:
       
    90         if (!XmlNameMatchesAscii(enc,
       
    91                                  ptr + 2 * MIN_BYTES_PER_CHAR(enc),
       
    92                                  "DOCTYPE"))
       
    93             break;
       
    94         state->handler = doctype0;
       
    95         return XML_ROLE_NONE;
       
    96     case XML_TOK_INSTANCE_START:
       
    97         state->handler = error;
       
    98         return XML_ROLE_INSTANCE_START;
       
    99     }
       
   100     return syntaxError(state);
       
   101 }
       
   102 
       
   103 static
       
   104 int prolog1(PROLOG_STATE *state,
       
   105             int tok,
       
   106             const char *ptr,
       
   107             const char *end,
       
   108             const ENCODING *enc)
       
   109 {
       
   110     switch (tok) {
       
   111     case XML_TOK_PROLOG_S:
       
   112         return XML_ROLE_NONE;
       
   113     case XML_TOK_PI:
       
   114     case XML_TOK_COMMENT:
       
   115     case XML_TOK_BOM:
       
   116         return XML_ROLE_NONE;
       
   117     case XML_TOK_DECL_OPEN:
       
   118         if (!XmlNameMatchesAscii(enc,
       
   119                                  ptr + 2 * MIN_BYTES_PER_CHAR(enc),
       
   120                                  "DOCTYPE"))
       
   121             break;
       
   122         state->handler = doctype0;
       
   123         return XML_ROLE_NONE;
       
   124     case XML_TOK_INSTANCE_START:
       
   125         state->handler = error;
       
   126         return XML_ROLE_INSTANCE_START;
       
   127     }
       
   128     return syntaxError(state);
       
   129 }
       
   130 
       
   131 static
       
   132 int prolog2(PROLOG_STATE *state,
       
   133             int tok,
       
   134             const char *ptr,
       
   135             const char *end,
       
   136             const ENCODING *enc)
       
   137 {
       
   138     switch (tok) {
       
   139     case XML_TOK_PROLOG_S:
       
   140         return XML_ROLE_NONE;
       
   141     case XML_TOK_PI:
       
   142     case XML_TOK_COMMENT:
       
   143         return XML_ROLE_NONE;
       
   144     case XML_TOK_INSTANCE_START:
       
   145         state->handler = error;
       
   146         return XML_ROLE_INSTANCE_START;
       
   147     }
       
   148     return syntaxError(state);
       
   149 }
       
   150 
       
   151 static
       
   152 int doctype0(PROLOG_STATE *state,
       
   153              int tok,
       
   154              const char *ptr,
       
   155              const char *end,
       
   156              const ENCODING *enc)
       
   157 {
       
   158     switch (tok) {
       
   159     case XML_TOK_PROLOG_S:
       
   160         return XML_ROLE_NONE;
       
   161     case XML_TOK_NAME:
       
   162     case XML_TOK_PREFIXED_NAME:
       
   163         state->handler = doctype1;
       
   164         return XML_ROLE_DOCTYPE_NAME;
       
   165     }
       
   166     return syntaxError(state);
       
   167 }
       
   168 
       
   169 static
       
   170 int doctype1(PROLOG_STATE *state,
       
   171              int tok,
       
   172              const char *ptr,
       
   173              const char *end,
       
   174              const ENCODING *enc)
       
   175 {
       
   176     switch (tok) {
       
   177     case XML_TOK_PROLOG_S:
       
   178         return XML_ROLE_NONE;
       
   179     case XML_TOK_OPEN_BRACKET:
       
   180         state->handler = internalSubset;
       
   181         return XML_ROLE_NONE;
       
   182     case XML_TOK_DECL_CLOSE:
       
   183         state->handler = prolog2;
       
   184         return XML_ROLE_DOCTYPE_CLOSE;
       
   185     case XML_TOK_NAME:
       
   186         if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) {
       
   187             state->handler = doctype3;
       
   188             return XML_ROLE_NONE;
       
   189         }
       
   190         if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) {
       
   191             state->handler = doctype2;
       
   192             return XML_ROLE_NONE;
       
   193         }
       
   194         break;
       
   195     }
       
   196     return syntaxError(state);
       
   197 }
       
   198 
       
   199 static
       
   200 int doctype2(PROLOG_STATE *state,
       
   201              int tok,
       
   202              const char *ptr,
       
   203              const char *end,
       
   204              const ENCODING *enc)
       
   205 {
       
   206     switch (tok) {
       
   207     case XML_TOK_PROLOG_S:
       
   208         return XML_ROLE_NONE;
       
   209     case XML_TOK_LITERAL:
       
   210         state->handler = doctype3;
       
   211         return XML_ROLE_DOCTYPE_PUBLIC_ID;
       
   212     }
       
   213     return syntaxError(state);
       
   214 }
       
   215 
       
   216 static
       
   217 int doctype3(PROLOG_STATE *state,
       
   218              int tok,
       
   219              const char *ptr,
       
   220              const char *end,
       
   221              const ENCODING *enc)
       
   222 {
       
   223     switch (tok) {
       
   224     case XML_TOK_PROLOG_S:
       
   225         return XML_ROLE_NONE;
       
   226     case XML_TOK_LITERAL:
       
   227         state->handler = doctype4;
       
   228         return XML_ROLE_DOCTYPE_SYSTEM_ID;
       
   229     }
       
   230     return syntaxError(state);
       
   231 }
       
   232 
       
   233 static
       
   234 int doctype4(PROLOG_STATE *state,
       
   235              int tok,
       
   236              const char *ptr,
       
   237              const char *end,
       
   238              const ENCODING *enc)
       
   239 {
       
   240     switch (tok) {
       
   241     case XML_TOK_PROLOG_S:
       
   242         return XML_ROLE_NONE;
       
   243     case XML_TOK_OPEN_BRACKET:
       
   244         state->handler = internalSubset;
       
   245         return XML_ROLE_NONE;
       
   246     case XML_TOK_DECL_CLOSE:
       
   247         state->handler = prolog2;
       
   248         return XML_ROLE_DOCTYPE_CLOSE;
       
   249     }
       
   250     return syntaxError(state);
       
   251 }
       
   252 
       
   253 static
       
   254 int doctype5(PROLOG_STATE *state,
       
   255              int tok,
       
   256              const char *ptr,
       
   257              const char *end,
       
   258              const ENCODING *enc)
       
   259 {
       
   260     switch (tok) {
       
   261     case XML_TOK_PROLOG_S:
       
   262         return XML_ROLE_NONE;
       
   263     case XML_TOK_DECL_CLOSE:
       
   264         state->handler = prolog2;
       
   265         return XML_ROLE_DOCTYPE_CLOSE;
       
   266     }
       
   267     return syntaxError(state);
       
   268 }
       
   269 
       
   270 static
       
   271 int internalSubset(PROLOG_STATE *state,
       
   272                    int tok,
       
   273                    const char *ptr,
       
   274                    const char *end,
       
   275                    const ENCODING *enc)
       
   276 {
       
   277     switch (tok) {
       
   278     case XML_TOK_PROLOG_S:
       
   279         return XML_ROLE_NONE;
       
   280     case XML_TOK_DECL_OPEN:
       
   281         if (XmlNameMatchesAscii(enc,
       
   282                                 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
       
   283                                 "ENTITY")) {
       
   284             state->handler = entity0;
       
   285             return XML_ROLE_NONE;
       
   286         }
       
   287         if (XmlNameMatchesAscii(enc,
       
   288                                 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
       
   289                                 "ATTLIST")) {
       
   290             state->handler = attlist0;
       
   291             return XML_ROLE_NONE;
       
   292         }
       
   293         if (XmlNameMatchesAscii(enc,
       
   294                                 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
       
   295                                 "ELEMENT")) {
       
   296             state->handler = element0;
       
   297             return XML_ROLE_NONE;
       
   298         }
       
   299         if (XmlNameMatchesAscii(enc,
       
   300                                 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
       
   301                                 "NOTATION")) {
       
   302             state->handler = notation0;
       
   303             return XML_ROLE_NONE;
       
   304         }
       
   305         break;
       
   306     case XML_TOK_PI:
       
   307     case XML_TOK_COMMENT:
       
   308         return XML_ROLE_NONE;
       
   309     case XML_TOK_PARAM_ENTITY_REF:
       
   310         return XML_ROLE_PARAM_ENTITY_REF;
       
   311     case XML_TOK_CLOSE_BRACKET:
       
   312         state->handler = doctype5;
       
   313         return XML_ROLE_NONE;
       
   314     }
       
   315     return syntaxError(state);
       
   316 }
       
   317 
       
   318 static
       
   319 int entity0(PROLOG_STATE *state,
       
   320             int tok,
       
   321             const char *ptr,
       
   322             const char *end,
       
   323             const ENCODING *enc)
       
   324 {
       
   325     switch (tok) {
       
   326     case XML_TOK_PROLOG_S:
       
   327         return XML_ROLE_NONE;
       
   328     case XML_TOK_PERCENT:
       
   329         state->handler = entity1;
       
   330         return XML_ROLE_NONE;
       
   331     case XML_TOK_NAME:
       
   332         state->handler = entity2;
       
   333         return XML_ROLE_GENERAL_ENTITY_NAME;
       
   334     }
       
   335     return syntaxError(state);
       
   336 }
       
   337 
       
   338 static
       
   339 int entity1(PROLOG_STATE *state,
       
   340             int tok,
       
   341             const char *ptr,
       
   342             const char *end,
       
   343             const ENCODING *enc)
       
   344 {
       
   345     switch (tok) {
       
   346     case XML_TOK_PROLOG_S:
       
   347         return XML_ROLE_NONE;
       
   348     case XML_TOK_NAME:
       
   349         state->handler = entity7;
       
   350         return XML_ROLE_PARAM_ENTITY_NAME;
       
   351     }
       
   352     return syntaxError(state);
       
   353 }
       
   354 
       
   355 static
       
   356 int entity2(PROLOG_STATE *state,
       
   357             int tok,
       
   358             const char *ptr,
       
   359             const char *end,
       
   360             const ENCODING *enc)
       
   361 {
       
   362     switch (tok) {
       
   363     case XML_TOK_PROLOG_S:
       
   364         return XML_ROLE_NONE;
       
   365     case XML_TOK_NAME:
       
   366         if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) {
       
   367             state->handler = entity4;
       
   368             return XML_ROLE_NONE;
       
   369         }
       
   370         if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) {
       
   371             state->handler = entity3;
       
   372             return XML_ROLE_NONE;
       
   373         }
       
   374         break;
       
   375     case XML_TOK_LITERAL:
       
   376         state->handler = declClose;
       
   377         return XML_ROLE_ENTITY_VALUE;
       
   378     }
       
   379     return syntaxError(state);
       
   380 }
       
   381 
       
   382 static
       
   383 int entity3(PROLOG_STATE *state,
       
   384             int tok,
       
   385             const char *ptr,
       
   386             const char *end,
       
   387             const ENCODING *enc)
       
   388 {
       
   389     switch (tok) {
       
   390     case XML_TOK_PROLOG_S:
       
   391         return XML_ROLE_NONE;
       
   392     case XML_TOK_LITERAL:
       
   393         state->handler = entity4;
       
   394         return XML_ROLE_ENTITY_PUBLIC_ID;
       
   395     }
       
   396     return syntaxError(state);
       
   397 }
       
   398 
       
   399 
       
   400 static
       
   401 int entity4(PROLOG_STATE *state,
       
   402             int tok,
       
   403             const char *ptr,
       
   404             const char *end,
       
   405             const ENCODING *enc)
       
   406 {
       
   407     switch (tok) {
       
   408     case XML_TOK_PROLOG_S:
       
   409         return XML_ROLE_NONE;
       
   410     case XML_TOK_LITERAL:
       
   411         state->handler = entity5;
       
   412         return XML_ROLE_ENTITY_SYSTEM_ID;
       
   413     }
       
   414     return syntaxError(state);
       
   415 }
       
   416 
       
   417 static
       
   418 int entity5(PROLOG_STATE *state,
       
   419             int tok,
       
   420             const char *ptr,
       
   421             const char *end,
       
   422             const ENCODING *enc)
       
   423 {
       
   424     switch (tok) {
       
   425     case XML_TOK_PROLOG_S:
       
   426         return XML_ROLE_NONE;
       
   427     case XML_TOK_DECL_CLOSE:
       
   428         state->handler = internalSubset;
       
   429         return XML_ROLE_NONE;
       
   430     case XML_TOK_NAME:
       
   431         if (XmlNameMatchesAscii(enc, ptr, "NDATA")) {
       
   432             state->handler = entity6;
       
   433             return XML_ROLE_NONE;
       
   434         }
       
   435         break;
       
   436     }
       
   437     return syntaxError(state);
       
   438 }
       
   439 
       
   440 static
       
   441 int entity6(PROLOG_STATE *state,
       
   442             int tok,
       
   443             const char *ptr,
       
   444             const char *end,
       
   445             const ENCODING *enc)
       
   446 {
       
   447     switch (tok) {
       
   448     case XML_TOK_PROLOG_S:
       
   449         return XML_ROLE_NONE;
       
   450     case XML_TOK_NAME:
       
   451         state->handler = declClose;
       
   452         return XML_ROLE_ENTITY_NOTATION_NAME;
       
   453     }
       
   454     return syntaxError(state);
       
   455 }
       
   456 
       
   457 static
       
   458 int entity7(PROLOG_STATE *state,
       
   459             int tok,
       
   460             const char *ptr,
       
   461             const char *end,
       
   462             const ENCODING *enc)
       
   463 {
       
   464     switch (tok) {
       
   465     case XML_TOK_PROLOG_S:
       
   466         return XML_ROLE_NONE;
       
   467     case XML_TOK_NAME:
       
   468         if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) {
       
   469             state->handler = entity9;
       
   470             return XML_ROLE_NONE;
       
   471         }
       
   472         if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) {
       
   473             state->handler = entity8;
       
   474             return XML_ROLE_NONE;
       
   475         }
       
   476         break;
       
   477     case XML_TOK_LITERAL:
       
   478         state->handler = declClose;
       
   479         return XML_ROLE_ENTITY_VALUE;
       
   480     }
       
   481     return syntaxError(state);
       
   482 }
       
   483 
       
   484 static
       
   485 int entity8(PROLOG_STATE *state,
       
   486             int tok,
       
   487             const char *ptr,
       
   488             const char *end,
       
   489             const ENCODING *enc)
       
   490 {
       
   491     switch (tok) {
       
   492     case XML_TOK_PROLOG_S:
       
   493         return XML_ROLE_NONE;
       
   494     case XML_TOK_LITERAL:
       
   495         state->handler = entity9;
       
   496         return XML_ROLE_ENTITY_PUBLIC_ID;
       
   497     }
       
   498     return syntaxError(state);
       
   499 }
       
   500 
       
   501 static
       
   502 int entity9(PROLOG_STATE *state,
       
   503             int tok,
       
   504             const char *ptr,
       
   505             const char *end,
       
   506             const ENCODING *enc)
       
   507 {
       
   508     switch (tok) {
       
   509     case XML_TOK_PROLOG_S:
       
   510         return XML_ROLE_NONE;
       
   511     case XML_TOK_LITERAL:
       
   512         state->handler = declClose;
       
   513         return XML_ROLE_ENTITY_SYSTEM_ID;
       
   514     }
       
   515     return syntaxError(state);
       
   516 }
       
   517 
       
   518 static
       
   519 int notation0(PROLOG_STATE *state,
       
   520               int tok,
       
   521               const char *ptr,
       
   522               const char *end,
       
   523               const ENCODING *enc)
       
   524 {
       
   525     switch (tok) {
       
   526     case XML_TOK_PROLOG_S:
       
   527         return XML_ROLE_NONE;
       
   528     case XML_TOK_NAME:
       
   529         state->handler = notation1;
       
   530         return XML_ROLE_NOTATION_NAME;
       
   531     }
       
   532     return syntaxError(state);
       
   533 }
       
   534 
       
   535 static
       
   536 int notation1(PROLOG_STATE *state,
       
   537               int tok,
       
   538               const char *ptr,
       
   539               const char *end,
       
   540               const ENCODING *enc)
       
   541 {
       
   542     switch (tok) {
       
   543     case XML_TOK_PROLOG_S:
       
   544         return XML_ROLE_NONE;
       
   545     case XML_TOK_NAME:
       
   546         if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) {
       
   547             state->handler = notation3;
       
   548             return XML_ROLE_NONE;
       
   549         }
       
   550         if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) {
       
   551             state->handler = notation2;
       
   552             return XML_ROLE_NONE;
       
   553         }
       
   554         break;
       
   555     }
       
   556     return syntaxError(state);
       
   557 }
       
   558 
       
   559 static
       
   560 int notation2(PROLOG_STATE *state,
       
   561               int tok,
       
   562               const char *ptr,
       
   563               const char *end,
       
   564               const ENCODING *enc)
       
   565 {
       
   566     switch (tok) {
       
   567     case XML_TOK_PROLOG_S:
       
   568         return XML_ROLE_NONE;
       
   569     case XML_TOK_LITERAL:
       
   570         state->handler = notation4;
       
   571         return XML_ROLE_NOTATION_PUBLIC_ID;
       
   572     }
       
   573     return syntaxError(state);
       
   574 }
       
   575 
       
   576 static
       
   577 int notation3(PROLOG_STATE *state,
       
   578               int tok,
       
   579               const char *ptr,
       
   580               const char *end,
       
   581               const ENCODING *enc)
       
   582 {
       
   583     switch (tok) {
       
   584     case XML_TOK_PROLOG_S:
       
   585         return XML_ROLE_NONE;
       
   586     case XML_TOK_LITERAL:
       
   587         state->handler = declClose;
       
   588         return XML_ROLE_NOTATION_SYSTEM_ID;
       
   589     }
       
   590     return syntaxError(state);
       
   591 }
       
   592 
       
   593 static
       
   594 int notation4(PROLOG_STATE *state,
       
   595               int tok,
       
   596               const char *ptr,
       
   597               const char *end,
       
   598               const ENCODING *enc)
       
   599 {
       
   600     switch (tok) {
       
   601     case XML_TOK_PROLOG_S:
       
   602         return XML_ROLE_NONE;
       
   603     case XML_TOK_LITERAL:
       
   604         state->handler = declClose;
       
   605         return XML_ROLE_NOTATION_SYSTEM_ID;
       
   606     case XML_TOK_DECL_CLOSE:
       
   607         state->handler = internalSubset;
       
   608         return XML_ROLE_NOTATION_NO_SYSTEM_ID;
       
   609     }
       
   610     return syntaxError(state);
       
   611 }
       
   612 
       
   613 static
       
   614 int attlist0(PROLOG_STATE *state,
       
   615              int tok,
       
   616              const char *ptr,
       
   617              const char *end,
       
   618              const ENCODING *enc)
       
   619 {
       
   620     switch (tok) {
       
   621     case XML_TOK_PROLOG_S:
       
   622         return XML_ROLE_NONE;
       
   623     case XML_TOK_NAME:
       
   624     case XML_TOK_PREFIXED_NAME:
       
   625         state->handler = attlist1;
       
   626         return XML_ROLE_ATTLIST_ELEMENT_NAME;
       
   627     }
       
   628     return syntaxError(state);
       
   629 }
       
   630 
       
   631 static
       
   632 int attlist1(PROLOG_STATE *state,
       
   633              int tok,
       
   634              const char *ptr,
       
   635              const char *end,
       
   636              const ENCODING *enc)
       
   637 {
       
   638     switch (tok) {
       
   639     case XML_TOK_PROLOG_S:
       
   640         return XML_ROLE_NONE;
       
   641     case XML_TOK_DECL_CLOSE:
       
   642         state->handler = internalSubset;
       
   643         return XML_ROLE_NONE;
       
   644     case XML_TOK_NAME:
       
   645     case XML_TOK_PREFIXED_NAME:
       
   646         state->handler = attlist2;
       
   647         return XML_ROLE_ATTRIBUTE_NAME;
       
   648     }
       
   649     return syntaxError(state);
       
   650 }
       
   651 
       
   652 static
       
   653 int attlist2(PROLOG_STATE *state,
       
   654              int tok,
       
   655              const char *ptr,
       
   656              const char *end,
       
   657              const ENCODING *enc)
       
   658 {
       
   659     switch (tok) {
       
   660     case XML_TOK_PROLOG_S:
       
   661         return XML_ROLE_NONE;
       
   662     case XML_TOK_NAME:
       
   663         {
       
   664             static const char *types[] = {
       
   665                 "CDATA",
       
   666                 "ID",
       
   667                 "IDREF",
       
   668                 "IDREFS",
       
   669                 "ENTITY",
       
   670                 "ENTITIES",
       
   671                 "NMTOKEN",
       
   672                 "NMTOKENS",
       
   673             };
       
   674             int i;
       
   675             for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++)
       
   676                 if (XmlNameMatchesAscii(enc, ptr, types[i])) {
       
   677                     state->handler = attlist8;
       
   678                     return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
       
   679                 }
       
   680         }
       
   681         if (XmlNameMatchesAscii(enc, ptr, "NOTATION")) {
       
   682             state->handler = attlist5;
       
   683             return XML_ROLE_NONE;
       
   684         }
       
   685         break;
       
   686     case XML_TOK_OPEN_PAREN:
       
   687         state->handler = attlist3;
       
   688         return XML_ROLE_NONE;
       
   689     }
       
   690     return syntaxError(state);
       
   691 }
       
   692 
       
   693 static
       
   694 int attlist3(PROLOG_STATE *state,
       
   695              int tok,
       
   696              const char *ptr,
       
   697              const char *end,
       
   698              const ENCODING *enc)
       
   699 {
       
   700     switch (tok) {
       
   701     case XML_TOK_PROLOG_S:
       
   702         return XML_ROLE_NONE;
       
   703     case XML_TOK_NMTOKEN:
       
   704     case XML_TOK_NAME:
       
   705     case XML_TOK_PREFIXED_NAME:
       
   706         state->handler = attlist4;
       
   707         return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
       
   708     }
       
   709     return syntaxError(state);
       
   710 }
       
   711 
       
   712 static
       
   713 int attlist4(PROLOG_STATE *state,
       
   714              int tok,
       
   715              const char *ptr,
       
   716              const char *end,
       
   717              const ENCODING *enc)
       
   718 {
       
   719     switch (tok) {
       
   720     case XML_TOK_PROLOG_S:
       
   721         return XML_ROLE_NONE;
       
   722     case XML_TOK_CLOSE_PAREN:
       
   723         state->handler = attlist8;
       
   724         return XML_ROLE_NONE;
       
   725     case XML_TOK_OR:
       
   726         state->handler = attlist3;
       
   727         return XML_ROLE_NONE;
       
   728     }
       
   729     return syntaxError(state);
       
   730 }
       
   731 
       
   732 static
       
   733 int attlist5(PROLOG_STATE *state,
       
   734              int tok,
       
   735              const char *ptr,
       
   736              const char *end,
       
   737              const ENCODING *enc)
       
   738 {
       
   739     switch (tok) {
       
   740     case XML_TOK_PROLOG_S:
       
   741         return XML_ROLE_NONE;
       
   742     case XML_TOK_OPEN_PAREN:
       
   743         state->handler = attlist6;
       
   744         return XML_ROLE_NONE;
       
   745     }
       
   746     return syntaxError(state);
       
   747 }
       
   748 
       
   749 
       
   750 static
       
   751 int attlist6(PROLOG_STATE *state,
       
   752              int tok,
       
   753              const char *ptr,
       
   754              const char *end,
       
   755              const ENCODING *enc)
       
   756 {
       
   757     switch (tok) {
       
   758     case XML_TOK_PROLOG_S:
       
   759         return XML_ROLE_NONE;
       
   760     case XML_TOK_NAME:
       
   761         state->handler = attlist7;
       
   762         return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
       
   763     }
       
   764     return syntaxError(state);
       
   765 }
       
   766 
       
   767 static
       
   768 int attlist7(PROLOG_STATE *state,
       
   769              int tok,
       
   770              const char *ptr,
       
   771              const char *end,
       
   772              const ENCODING *enc)
       
   773 {
       
   774     switch (tok) {
       
   775     case XML_TOK_PROLOG_S:
       
   776         return XML_ROLE_NONE;
       
   777     case XML_TOK_CLOSE_PAREN:
       
   778         state->handler = attlist8;
       
   779         return XML_ROLE_NONE;
       
   780     case XML_TOK_OR:
       
   781         state->handler = attlist6;
       
   782         return XML_ROLE_NONE;
       
   783     }
       
   784     return syntaxError(state);
       
   785 }
       
   786 
       
   787 /* default value */
       
   788 static
       
   789 int attlist8(PROLOG_STATE *state,
       
   790              int tok,
       
   791              const char *ptr,
       
   792              const char *end,
       
   793              const ENCODING *enc)
       
   794 {
       
   795     switch (tok) {
       
   796     case XML_TOK_PROLOG_S:
       
   797         return XML_ROLE_NONE;
       
   798     case XML_TOK_POUND_NAME:
       
   799         if (XmlNameMatchesAscii(enc,
       
   800                                 ptr + MIN_BYTES_PER_CHAR(enc),
       
   801                                 "IMPLIED")) {
       
   802             state->handler = attlist1;
       
   803             return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
       
   804         }
       
   805         if (XmlNameMatchesAscii(enc,
       
   806                                 ptr + MIN_BYTES_PER_CHAR(enc),
       
   807                                 "REQUIRED")) {
       
   808             state->handler = attlist1;
       
   809             return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
       
   810         }
       
   811         if (XmlNameMatchesAscii(enc,
       
   812                                 ptr + MIN_BYTES_PER_CHAR(enc),
       
   813                                 "FIXED")) {
       
   814             state->handler = attlist9;
       
   815             return XML_ROLE_NONE;
       
   816         }
       
   817         break;
       
   818     case XML_TOK_LITERAL:
       
   819         state->handler = attlist1;
       
   820         return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
       
   821     }
       
   822     return syntaxError(state);
       
   823 }
       
   824 
       
   825 static
       
   826 int attlist9(PROLOG_STATE *state,
       
   827              int tok,
       
   828              const char *ptr,
       
   829              const char *end,
       
   830              const ENCODING *enc)
       
   831 {
       
   832     switch (tok) {
       
   833     case XML_TOK_PROLOG_S:
       
   834         return XML_ROLE_NONE;
       
   835     case XML_TOK_LITERAL:
       
   836         state->handler = attlist1;
       
   837         return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
       
   838     }
       
   839     return syntaxError(state);
       
   840 }
       
   841 
       
   842 static
       
   843 int element0(PROLOG_STATE *state,
       
   844              int tok,
       
   845              const char *ptr,
       
   846              const char *end,
       
   847              const ENCODING *enc)
       
   848 {
       
   849     switch (tok) {
       
   850     case XML_TOK_PROLOG_S:
       
   851         return XML_ROLE_NONE;
       
   852     case XML_TOK_NAME:
       
   853     case XML_TOK_PREFIXED_NAME:
       
   854         state->handler = element1;
       
   855         return XML_ROLE_ELEMENT_NAME;
       
   856     }
       
   857     return syntaxError(state);
       
   858 }
       
   859 
       
   860 static
       
   861 int element1(PROLOG_STATE *state,
       
   862              int tok,
       
   863              const char *ptr,
       
   864              const char *end,
       
   865              const ENCODING *enc)
       
   866 {
       
   867     switch (tok) {
       
   868     case XML_TOK_PROLOG_S:
       
   869         return XML_ROLE_NONE;
       
   870     case XML_TOK_NAME:
       
   871         if (XmlNameMatchesAscii(enc, ptr, "EMPTY")) {
       
   872             state->handler = declClose;
       
   873             return XML_ROLE_CONTENT_EMPTY;
       
   874         }
       
   875         if (XmlNameMatchesAscii(enc, ptr, "ANY")) {
       
   876             state->handler = declClose;
       
   877             return XML_ROLE_CONTENT_ANY;
       
   878         }
       
   879         break;
       
   880     case XML_TOK_OPEN_PAREN:
       
   881         state->handler = element2;
       
   882         state->level = 1;
       
   883         return XML_ROLE_GROUP_OPEN;
       
   884     }
       
   885     return syntaxError(state);
       
   886 }
       
   887 
       
   888 static
       
   889 int element2(PROLOG_STATE *state,
       
   890              int tok,
       
   891              const char *ptr,
       
   892              const char *end,
       
   893              const ENCODING *enc)
       
   894 {
       
   895     switch (tok) {
       
   896     case XML_TOK_PROLOG_S:
       
   897         return XML_ROLE_NONE;
       
   898     case XML_TOK_POUND_NAME:
       
   899         if (XmlNameMatchesAscii(enc,
       
   900                                 ptr + MIN_BYTES_PER_CHAR(enc),
       
   901                                 "PCDATA")) {
       
   902             state->handler = element3;
       
   903             return XML_ROLE_CONTENT_PCDATA;
       
   904         }
       
   905         break;
       
   906     case XML_TOK_OPEN_PAREN:
       
   907         state->level = 2;
       
   908         state->handler = element6;
       
   909         return XML_ROLE_GROUP_OPEN;
       
   910     case XML_TOK_NAME:
       
   911     case XML_TOK_PREFIXED_NAME:
       
   912         state->handler = element7;
       
   913         return XML_ROLE_CONTENT_ELEMENT;
       
   914     case XML_TOK_NAME_QUESTION:
       
   915         state->handler = element7;
       
   916         return XML_ROLE_CONTENT_ELEMENT_OPT;
       
   917     case XML_TOK_NAME_ASTERISK:
       
   918         state->handler = element7;
       
   919         return XML_ROLE_CONTENT_ELEMENT_REP;
       
   920     case XML_TOK_NAME_PLUS:
       
   921         state->handler = element7;
       
   922         return XML_ROLE_CONTENT_ELEMENT_PLUS;
       
   923     }
       
   924     return syntaxError(state);
       
   925 }
       
   926 
       
   927 static
       
   928 int element3(PROLOG_STATE *state,
       
   929              int tok,
       
   930              const char *ptr,
       
   931              const char *end,
       
   932              const ENCODING *enc)
       
   933 {
       
   934     switch (tok) {
       
   935     case XML_TOK_PROLOG_S:
       
   936         return XML_ROLE_NONE;
       
   937     case XML_TOK_CLOSE_PAREN:
       
   938     case XML_TOK_CLOSE_PAREN_ASTERISK:
       
   939         state->handler = declClose;
       
   940         return XML_ROLE_GROUP_CLOSE_REP;
       
   941     case XML_TOK_OR:
       
   942         state->handler = element4;
       
   943         return XML_ROLE_NONE;
       
   944     }
       
   945     return syntaxError(state);
       
   946 }
       
   947 
       
   948 static
       
   949 int element4(PROLOG_STATE *state,
       
   950              int tok,
       
   951              const char *ptr,
       
   952              const char *end,
       
   953              const ENCODING *enc)
       
   954 {
       
   955     switch (tok) {
       
   956     case XML_TOK_PROLOG_S:
       
   957         return XML_ROLE_NONE;
       
   958     case XML_TOK_NAME:
       
   959     case XML_TOK_PREFIXED_NAME:
       
   960         state->handler = element5;
       
   961         return XML_ROLE_CONTENT_ELEMENT;
       
   962     }
       
   963     return syntaxError(state);
       
   964 }
       
   965 
       
   966 static
       
   967 int element5(PROLOG_STATE *state,
       
   968              int tok,
       
   969              const char *ptr,
       
   970              const char *end,
       
   971              const ENCODING *enc)
       
   972 {
       
   973     switch (tok) {
       
   974     case XML_TOK_PROLOG_S:
       
   975         return XML_ROLE_NONE;
       
   976     case XML_TOK_CLOSE_PAREN_ASTERISK:
       
   977         state->handler = declClose;
       
   978         return XML_ROLE_GROUP_CLOSE_REP;
       
   979     case XML_TOK_OR:
       
   980         state->handler = element4;
       
   981         return XML_ROLE_NONE;
       
   982     }
       
   983     return syntaxError(state);
       
   984 }
       
   985 
       
   986 static
       
   987 int element6(PROLOG_STATE *state,
       
   988              int tok,
       
   989              const char *ptr,
       
   990              const char *end,
       
   991              const ENCODING *enc)
       
   992 {
       
   993     switch (tok) {
       
   994     case XML_TOK_PROLOG_S:
       
   995         return XML_ROLE_NONE;
       
   996     case XML_TOK_OPEN_PAREN:
       
   997         state->level += 1;
       
   998         return XML_ROLE_GROUP_OPEN;
       
   999     case XML_TOK_NAME:
       
  1000     case XML_TOK_PREFIXED_NAME:
       
  1001         state->handler = element7;
       
  1002         return XML_ROLE_CONTENT_ELEMENT;
       
  1003     case XML_TOK_NAME_QUESTION:
       
  1004         state->handler = element7;
       
  1005         return XML_ROLE_CONTENT_ELEMENT_OPT;
       
  1006     case XML_TOK_NAME_ASTERISK:
       
  1007         state->handler = element7;
       
  1008         return XML_ROLE_CONTENT_ELEMENT_REP;
       
  1009     case XML_TOK_NAME_PLUS:
       
  1010         state->handler = element7;
       
  1011         return XML_ROLE_CONTENT_ELEMENT_PLUS;
       
  1012     }
       
  1013     return syntaxError(state);
       
  1014 }
       
  1015 
       
  1016 static
       
  1017 int element7(PROLOG_STATE *state,
       
  1018              int tok,
       
  1019              const char *ptr,
       
  1020              const char *end,
       
  1021              const ENCODING *enc)
       
  1022 {
       
  1023     switch (tok) {
       
  1024     case XML_TOK_PROLOG_S:
       
  1025         return XML_ROLE_NONE;
       
  1026     case XML_TOK_CLOSE_PAREN:
       
  1027         state->level -= 1;
       
  1028         if (state->level == 0)
       
  1029             state->handler = declClose;
       
  1030         return XML_ROLE_GROUP_CLOSE;
       
  1031     case XML_TOK_CLOSE_PAREN_ASTERISK:
       
  1032         state->level -= 1;
       
  1033         if (state->level == 0)
       
  1034             state->handler = declClose;
       
  1035         return XML_ROLE_GROUP_CLOSE_REP;
       
  1036     case XML_TOK_CLOSE_PAREN_QUESTION:
       
  1037         state->level -= 1;
       
  1038         if (state->level == 0)
       
  1039             state->handler = declClose;
       
  1040         return XML_ROLE_GROUP_CLOSE_OPT;
       
  1041     case XML_TOK_CLOSE_PAREN_PLUS:
       
  1042         state->level -= 1;
       
  1043         if (state->level == 0)
       
  1044             state->handler = declClose;
       
  1045         return XML_ROLE_GROUP_CLOSE_PLUS;
       
  1046     case XML_TOK_COMMA:
       
  1047         state->handler = element6;
       
  1048         return XML_ROLE_GROUP_SEQUENCE;
       
  1049     case XML_TOK_OR:
       
  1050         state->handler = element6;
       
  1051         return XML_ROLE_GROUP_CHOICE;
       
  1052     }
       
  1053     return syntaxError(state);
       
  1054 }
       
  1055 
       
  1056 static
       
  1057 int declClose(PROLOG_STATE *state,
       
  1058               int tok,
       
  1059               const char *ptr,
       
  1060               const char *end,
       
  1061               const ENCODING *enc)
       
  1062 {
       
  1063     switch (tok) {
       
  1064     case XML_TOK_PROLOG_S:
       
  1065         return XML_ROLE_NONE;
       
  1066     case XML_TOK_DECL_CLOSE:
       
  1067         state->handler = internalSubset;
       
  1068         return XML_ROLE_NONE;
       
  1069     }
       
  1070     return syntaxError(state);
       
  1071 }
       
  1072 
       
  1073 #if 0
       
  1074 
       
  1075 static
       
  1076 int ignore(PROLOG_STATE *state,
       
  1077            int tok,
       
  1078            const char *ptr,
       
  1079            const char *end,
       
  1080            const ENCODING *enc)
       
  1081 {
       
  1082     switch (tok) {
       
  1083     case XML_TOK_DECL_CLOSE:
       
  1084         state->handler = internalSubset;
       
  1085         return 0;
       
  1086     default:
       
  1087         return XML_ROLE_NONE;
       
  1088     }
       
  1089     return syntaxError(state);
       
  1090 }
       
  1091 #endif
       
  1092 
       
  1093 static
       
  1094 int error(PROLOG_STATE *state,
       
  1095           int tok,
       
  1096           const char *ptr,
       
  1097           const char *end,
       
  1098           const ENCODING *enc)
       
  1099 {
       
  1100     return XML_ROLE_NONE;
       
  1101 }
       
  1102 
       
  1103 static
       
  1104 int syntaxError(PROLOG_STATE *state)
       
  1105 {
       
  1106     state->handler = error;
       
  1107     return XML_ROLE_ERROR;
       
  1108 }
       
  1109 
       
  1110 void XmlPrologStateInit(PROLOG_STATE *state)
       
  1111 {
       
  1112     state->handler = prolog0;
       
  1113 }