LCOV - code coverage report
Current view: top level - simgear/xml - xmltok_impl.c (source / functions) Hit Total Coverage
Test: JSBSim-Coverage-Statistics Lines: 209 841 24.9 %
Date: 2010-08-24 Functions: 12 78 15.4 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 131 3429 3.8 %

           Branch data     Line data    Source code
       1                 :            : /* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
       2                 :            :    See the file COPYING for copying permission.
       3                 :            : */
       4                 :            : 
       5                 :            : #ifndef IS_INVALID_CHAR
       6                 :            : #define IS_INVALID_CHAR(enc, ptr, n) (0)
       7                 :            : #endif
       8                 :            : 
       9                 :            : #define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \
      10                 :            :     case BT_LEAD ## n: \
      11                 :            :       if (end - ptr < n) \
      12                 :            :         return XML_TOK_PARTIAL_CHAR; \
      13                 :            :       if (IS_INVALID_CHAR(enc, ptr, n)) { \
      14                 :            :         *(nextTokPtr) = (ptr); \
      15                 :            :         return XML_TOK_INVALID; \
      16                 :            :       } \
      17                 :            :       ptr += n; \
      18                 :            :       break;
      19                 :            : 
      20                 :            : #define INVALID_CASES(ptr, nextTokPtr) \
      21                 :            :   INVALID_LEAD_CASE(2, ptr, nextTokPtr) \
      22                 :            :   INVALID_LEAD_CASE(3, ptr, nextTokPtr) \
      23                 :            :   INVALID_LEAD_CASE(4, ptr, nextTokPtr) \
      24                 :            :   case BT_NONXML: \
      25                 :            :   case BT_MALFORM: \
      26                 :            :   case BT_TRAIL: \
      27                 :            :     *(nextTokPtr) = (ptr); \
      28                 :            :     return XML_TOK_INVALID;
      29                 :            : 
      30                 :            : #define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \
      31                 :            :    case BT_LEAD ## n: \
      32                 :            :      if (end - ptr < n) \
      33                 :            :        return XML_TOK_PARTIAL_CHAR; \
      34                 :            :      if (!IS_NAME_CHAR(enc, ptr, n)) { \
      35                 :            :        *nextTokPtr = ptr; \
      36                 :            :        return XML_TOK_INVALID; \
      37                 :            :      } \
      38                 :            :      ptr += n; \
      39                 :            :      break;
      40                 :            : 
      41                 :            : #define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \
      42                 :            :   case BT_NONASCII: \
      43                 :            :     if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \
      44                 :            :       *nextTokPtr = ptr; \
      45                 :            :       return XML_TOK_INVALID; \
      46                 :            :     } \
      47                 :            :   case BT_NMSTRT: \
      48                 :            :   case BT_HEX: \
      49                 :            :   case BT_DIGIT: \
      50                 :            :   case BT_NAME: \
      51                 :            :   case BT_MINUS: \
      52                 :            :     ptr += MINBPC(enc); \
      53                 :            :     break; \
      54                 :            :   CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \
      55                 :            :   CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \
      56                 :            :   CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
      57                 :            : 
      58                 :            : #define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \
      59                 :            :    case BT_LEAD ## n: \
      60                 :            :      if (end - ptr < n) \
      61                 :            :        return XML_TOK_PARTIAL_CHAR; \
      62                 :            :      if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \
      63                 :            :        *nextTokPtr = ptr; \
      64                 :            :        return XML_TOK_INVALID; \
      65                 :            :      } \
      66                 :            :      ptr += n; \
      67                 :            :      break;
      68                 :            : 
      69                 :            : #define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \
      70                 :            :   case BT_NONASCII: \
      71                 :            :     if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \
      72                 :            :       *nextTokPtr = ptr; \
      73                 :            :       return XML_TOK_INVALID; \
      74                 :            :     } \
      75                 :            :   case BT_NMSTRT: \
      76                 :            :   case BT_HEX: \
      77                 :            :     ptr += MINBPC(enc); \
      78                 :            :     break; \
      79                 :            :   CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \
      80                 :            :   CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \
      81                 :            :   CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr)
      82                 :            : 
      83                 :            : #ifndef PREFIX
      84                 :            : #define PREFIX(ident) ident
      85                 :            : #endif
      86                 :            : 
      87                 :            : /* ptr points to character following "<!-" */
      88                 :            : 
      89                 :            : static int PTRCALL
      90                 :            : PREFIX(scanComment)(const ENCODING *enc, const char *ptr,
      91                 :            :                     const char *end, const char **nextTokPtr)
      92                 :        366 : {
      93 [ +  - ][ #  # ]:        366 :   if (ptr != end) {
                 [ #  # ]
      94 [ -  + ][ #  # ]:        366 :     if (!CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
         [ #  # ][ #  # ]
                 [ #  # ]
      95                 :          0 :       *nextTokPtr = ptr;
      96                 :          0 :       return XML_TOK_INVALID;
      97                 :            :     }
      98                 :        366 :     ptr += MINBPC(enc);
      99 [ +  - ][ #  # ]:      17664 :     while (ptr != end) {
                 [ #  # ]
     100   [ -  -  -  -  :      17664 :       switch (BYTE_TYPE(enc, ptr)) {
           +  + ][ #  # ]
           [ #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  #  
                   #  # ]
     101 [ #  # ][ #  # ]:          0 :       INVALID_CASES(ptr, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     102                 :            :       case BT_MINUS:
     103 [ -  + ][ #  # ]:        376 :         if ((ptr += MINBPC(enc)) == end)
                 [ #  # ]
     104                 :          0 :           return XML_TOK_PARTIAL;
     105 [ +  + ][ #  # ]:        376 :         if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
         [ #  # ][ #  # ]
                 [ #  # ]
     106 [ -  + ][ #  # ]:        366 :           if ((ptr += MINBPC(enc)) == end)
                 [ #  # ]
     107                 :          0 :             return XML_TOK_PARTIAL;
     108 [ -  + ][ #  # ]:        366 :           if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
         [ #  # ][ #  # ]
                 [ #  # ]
     109                 :          0 :             *nextTokPtr = ptr;
     110                 :          0 :             return XML_TOK_INVALID;
     111                 :            :           }
     112                 :        366 :           *nextTokPtr = ptr + MINBPC(enc);
     113                 :        366 :           return XML_TOK_COMMENT;
     114                 :            :         }
     115                 :            :         break;
     116                 :            :       default:
     117                 :      17288 :         ptr += MINBPC(enc);
     118                 :            :         break;
     119                 :            :       }
     120                 :            :     }
     121                 :            :   }
     122                 :        366 :   return XML_TOK_PARTIAL;
     123                 :            : }
     124                 :            : 
     125                 :            : /* ptr points to character following "<!" */
     126                 :            : 
     127                 :            : static int PTRCALL
     128                 :            : PREFIX(scanDecl)(const ENCODING *enc, const char *ptr,
     129                 :            :                  const char *end, const char **nextTokPtr)
     130                 :          0 : {
     131 [ -  + ][ #  # ]:         10 :   if (ptr == end)
                 [ #  # ]
     132                 :          0 :     return XML_TOK_PARTIAL;
     133   [ +  -  -  - ]:         10 :   switch (BYTE_TYPE(enc, ptr)) {
                 [ #  # ]
           [ #  #  #  # ]
                 [ #  # ]
           [ #  #  #  # ]
     134                 :            :   case BT_MINUS:
     135                 :         10 :     return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
     136                 :            :   case BT_LSQB:
     137                 :          0 :     *nextTokPtr = ptr + MINBPC(enc);
     138                 :          0 :     return XML_TOK_COND_SECT_OPEN;
     139                 :            :   case BT_NMSTRT:
     140                 :            :   case BT_HEX:
     141                 :          0 :     ptr += MINBPC(enc);
     142                 :            :     break;
     143                 :            :   default:
     144                 :          0 :     *nextTokPtr = ptr;
     145                 :          0 :     return XML_TOK_INVALID;
     146                 :            :   }
     147 [ #  # ][ #  # ]:          0 :   while (ptr != end) {
                 [ #  # ]
     148   [ #  #  #  # ]:          0 :     switch (BYTE_TYPE(enc, ptr)) {
                 [ #  # ]
           [ #  #  #  # ]
                 [ #  # ]
           [ #  #  #  # ]
     149                 :            :     case BT_PERCNT:
     150 [ #  # ][ #  # ]:          0 :       if (ptr + MINBPC(enc) == end)
                 [ #  # ]
     151                 :          0 :         return XML_TOK_PARTIAL;
     152                 :            :       /* don't allow <!ENTITY% foo "whatever"> */
     153 [ #  # ][ #  # ]:          0 :       switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
         [ #  # ][ #  # ]
                 [ #  # ]
     154                 :            :       case BT_S: case BT_CR: case BT_LF: case BT_PERCNT:
     155                 :          0 :         *nextTokPtr = ptr;
     156                 :          0 :         return XML_TOK_INVALID;
     157                 :            :       }
     158                 :            :       /* fall through */
     159                 :            :     case BT_S: case BT_CR: case BT_LF:
     160                 :          0 :       *nextTokPtr = ptr;
     161                 :          0 :       return XML_TOK_DECL_OPEN;
     162                 :            :     case BT_NMSTRT:
     163                 :            :     case BT_HEX:
     164                 :          0 :       ptr += MINBPC(enc);
     165                 :          0 :       break;
     166                 :            :     default:
     167                 :          0 :       *nextTokPtr = ptr;
     168                 :          0 :       return XML_TOK_INVALID;
     169                 :            :     }
     170                 :            :   }
     171                 :          0 :   return XML_TOK_PARTIAL;
     172                 :            : }
     173                 :            : 
     174                 :            : static int PTRCALL
     175                 :            : PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr,
     176                 :            :                       const char *end, int *tokPtr)
     177                 :          0 : {
     178                 :         33 :   int upper = 0;
     179                 :         33 :   *tokPtr = XML_TOK_PI;
     180 [ +  + ][ #  # ]:         33 :   if (end - ptr != MINBPC(enc)*3)
         [ #  # ][ #  # ]
     181                 :          2 :     return 1;
     182      [ -  -  + ]:         31 :   switch (BYTE_TO_ASCII(enc, ptr)) {
              [ #  #  # ]
                 [ #  # ]
              [ #  #  # ]
                 [ #  # ]
              [ #  #  # ]
     183                 :            :   case ASCII_x:
     184                 :            :     break;
     185                 :            :   case ASCII_X:
     186                 :          0 :     upper = 1;
     187                 :          0 :     break;
     188                 :            :   default:
     189                 :          0 :     return 1;
     190                 :            :   }
     191                 :         31 :   ptr += MINBPC(enc);
     192      [ -  -  + ]:         31 :   switch (BYTE_TO_ASCII(enc, ptr)) {
              [ #  #  # ]
                 [ #  # ]
              [ #  #  # ]
                 [ #  # ]
              [ #  #  # ]
     193                 :            :   case ASCII_m:
     194                 :            :     break;
     195                 :            :   case ASCII_M:
     196                 :          0 :     upper = 1;
     197                 :          0 :     break;
     198                 :            :   default:
     199                 :          0 :     return 1;
     200                 :            :   }
     201                 :         31 :   ptr += MINBPC(enc);
     202      [ -  -  + ]:         31 :   switch (BYTE_TO_ASCII(enc, ptr)) {
              [ #  #  # ]
                 [ #  # ]
              [ #  #  # ]
                 [ #  # ]
              [ #  #  # ]
     203                 :            :   case ASCII_l:
     204                 :            :     break;
     205                 :            :   case ASCII_L:
     206                 :          0 :     upper = 1;
     207                 :          0 :     break;
     208                 :            :   default:
     209                 :          0 :     return 1;
     210                 :            :   }
     211 [ -  + ][ #  # ]:         31 :   if (upper)
         [ #  # ][ #  # ]
     212                 :          0 :     return 0;
     213                 :         31 :   *tokPtr = XML_TOK_XML_DECL;
     214                 :         31 :   return 1;
     215                 :            : }
     216                 :            : 
     217                 :            : /* ptr points to character following "<?" */
     218                 :            : 
     219                 :            : static int PTRCALL
     220                 :            : PREFIX(scanPi)(const ENCODING *enc, const char *ptr,
     221                 :            :                const char *end, const char **nextTokPtr)
     222                 :         33 : {
     223                 :            :   int tok;
     224                 :         33 :   const char *target = ptr;
     225 [ -  + ][ #  # ]:         33 :   if (ptr == end)
                 [ #  # ]
     226                 :          0 :     return XML_TOK_PARTIAL;
     227   [ -  +  -  -  :         33 :   switch (BYTE_TYPE(enc, ptr)) {
           -  - ][ #  # ]
           [ #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  #  
                   #  # ]
     228 [ #  # ][ #  # ]:         33 :   CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     229                 :            :   default:
     230                 :          0 :     *nextTokPtr = ptr;
     231                 :          0 :     return XML_TOK_INVALID;
     232                 :            :   }
     233 [ +  - ][ #  # ]:        121 :   while (ptr != end) {
                 [ #  # ]
     234   [ -  +  -  -  :        121 :     switch (BYTE_TYPE(enc, ptr)) {
             -  +  -  - ]
         [ #  # ][ #  #  
          #  #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
             #  #  #  # ]
     235 [ #  # ][ #  # ]:         88 :     CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     236                 :            :     case BT_S: case BT_CR: case BT_LF:
     237 [ -  + ][ #  # ]:         33 :       if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
                 [ #  # ]
     238                 :          0 :         *nextTokPtr = ptr;
     239                 :          0 :         return XML_TOK_INVALID;
     240                 :            :       }
     241                 :         33 :       ptr += MINBPC(enc);
     242 [ +  - ][ #  # ]:        576 :       while (ptr != end) {
                 [ #  # ]
     243   [ -  -  -  -  :        576 :         switch (BYTE_TYPE(enc, ptr)) {
           +  + ][ #  # ]
           [ #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  #  
                   #  # ]
     244 [ #  # ][ #  # ]:          0 :         INVALID_CASES(ptr, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     245                 :            :         case BT_QUEST:
     246                 :         33 :           ptr += MINBPC(enc);
     247 [ -  + ][ #  # ]:         33 :           if (ptr == end)
                 [ #  # ]
     248                 :          0 :             return XML_TOK_PARTIAL;
     249 [ +  - ][ #  # ]:         33 :           if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
         [ #  # ][ #  # ]
                 [ #  # ]
     250                 :         33 :             *nextTokPtr = ptr + MINBPC(enc);
     251                 :         33 :             return tok;
     252                 :            :           }
     253                 :            :           break;
     254                 :            :         default:
     255                 :        543 :           ptr += MINBPC(enc);
     256                 :            :           break;
     257                 :            :         }
     258                 :            :       }
     259                 :          0 :       return XML_TOK_PARTIAL;
     260                 :            :     case BT_QUEST:
     261 [ #  # ][ #  # ]:          0 :       if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
                 [ #  # ]
     262                 :          0 :         *nextTokPtr = ptr;
     263                 :          0 :         return XML_TOK_INVALID;
     264                 :            :       }
     265                 :          0 :       ptr += MINBPC(enc);
     266 [ #  # ][ #  # ]:          0 :       if (ptr == end)
                 [ #  # ]
     267                 :          0 :         return XML_TOK_PARTIAL;
     268 [ #  # ][ #  # ]:          0 :       if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
         [ #  # ][ #  # ]
                 [ #  # ]
     269                 :          0 :         *nextTokPtr = ptr + MINBPC(enc);
     270                 :          0 :         return tok;
     271                 :            :       }
     272                 :            :       /* fall through */
     273                 :            :     default:
     274                 :          0 :       *nextTokPtr = ptr;
     275                 :          0 :       return XML_TOK_INVALID;
     276                 :            :     }
     277                 :            :   }
     278                 :         33 :   return XML_TOK_PARTIAL;
     279                 :            : }
     280                 :            : 
     281                 :            : static int PTRCALL
     282                 :            : PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr,
     283                 :            :                          const char *end, const char **nextTokPtr)
     284                 :            : {
     285                 :            :   static const char CDATA_LSQB[] = { ASCII_C, ASCII_D, ASCII_A,
     286                 :            :                                      ASCII_T, ASCII_A, ASCII_LSQB };
     287                 :            :   int i;
     288                 :            :   /* CDATA[ */
     289 [ #  # ][ #  # ]:          0 :   if (end - ptr < 6 * MINBPC(enc))
                 [ #  # ]
     290                 :          0 :     return XML_TOK_PARTIAL;
     291 [ #  # ][ #  # ]:          0 :   for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
                 [ #  # ]
     292 [ #  # ][ #  # ]:          0 :     if (!CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
         [ #  # ][ #  # ]
                 [ #  # ]
     293                 :          0 :       *nextTokPtr = ptr;
     294                 :          0 :       return XML_TOK_INVALID;
     295                 :            :     }
     296                 :            :   }
     297                 :          0 :   *nextTokPtr = ptr;
     298                 :          0 :   return XML_TOK_CDATA_SECT_OPEN;
     299                 :            : }
     300                 :            : 
     301                 :            : static int PTRCALL
     302                 :            : PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr,
     303                 :            :                         const char *end, const char **nextTokPtr)
     304                 :          0 : {
     305 [ #  # ][ #  # ]:          0 :   if (ptr == end)
                 [ #  # ]
     306                 :          0 :     return XML_TOK_NONE;
     307                 :            :   if (MINBPC(enc) > 1) {
     308                 :          0 :     size_t n = end - ptr;
     309 [ #  # ][ #  # ]:          0 :     if (n & (MINBPC(enc) - 1)) {
     310                 :          0 :       n &= ~(MINBPC(enc) - 1);
     311 [ #  # ][ #  # ]:          0 :       if (n == 0)
     312                 :          0 :         return XML_TOK_PARTIAL;
     313                 :          0 :       end = ptr + n;
     314                 :            :     }
     315                 :            :   }
     316   [ #  #  #  #  :          0 :   switch (BYTE_TYPE(enc, ptr)) {
             #  #  #  # ]
         [ #  # ][ #  #  
          #  #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
             #  #  #  # ]
     317                 :            :   case BT_RSQB:
     318                 :          0 :     ptr += MINBPC(enc);
     319 [ #  # ][ #  # ]:          0 :     if (ptr == end)
                 [ #  # ]
     320                 :          0 :       return XML_TOK_PARTIAL;
     321 [ #  # ][ #  # ]:          0 :     if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB))
         [ #  # ][ #  # ]
                 [ #  # ]
     322                 :          0 :       break;
     323                 :          0 :     ptr += MINBPC(enc);
     324 [ #  # ][ #  # ]:          0 :     if (ptr == end)
                 [ #  # ]
     325                 :          0 :       return XML_TOK_PARTIAL;
     326 [ #  # ][ #  # ]:          0 :     if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
         [ #  # ][ #  # ]
                 [ #  # ]
     327                 :          0 :       ptr -= MINBPC(enc);
     328                 :          0 :       break;
     329                 :            :     }
     330                 :          0 :     *nextTokPtr = ptr + MINBPC(enc);
     331                 :          0 :     return XML_TOK_CDATA_SECT_CLOSE;
     332                 :            :   case BT_CR:
     333                 :          0 :     ptr += MINBPC(enc);
     334 [ #  # ][ #  # ]:          0 :     if (ptr == end)
                 [ #  # ]
     335                 :          0 :       return XML_TOK_PARTIAL;
     336 [ #  # ][ #  # ]:          0 :     if (BYTE_TYPE(enc, ptr) == BT_LF)
         [ #  # ][ #  # ]
                 [ #  # ]
     337                 :          0 :       ptr += MINBPC(enc);
     338                 :          0 :     *nextTokPtr = ptr;
     339                 :          0 :     return XML_TOK_DATA_NEWLINE;
     340                 :            :   case BT_LF:
     341                 :          0 :     *nextTokPtr = ptr + MINBPC(enc);
     342                 :          0 :     return XML_TOK_DATA_NEWLINE;
     343 [ #  # ][ #  # ]:          0 :   INVALID_CASES(ptr, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     344                 :            :   default:
     345                 :          0 :     ptr += MINBPC(enc);
     346                 :            :     break;
     347                 :            :   }
     348 [ #  # ][ #  # ]:          0 :   while (ptr != end) {
                 [ #  # ]
     349   [ #  #  #  #  :          0 :     switch (BYTE_TYPE(enc, ptr)) {
              # ][ #  # ]
           [ #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
                      # ]
     350                 :            : #define LEAD_CASE(n) \
     351                 :            :     case BT_LEAD ## n: \
     352                 :            :       if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \
     353                 :            :         *nextTokPtr = ptr; \
     354                 :            :         return XML_TOK_DATA_CHARS; \
     355                 :            :       } \
     356                 :            :       ptr += n; \
     357                 :            :       break;
     358 [ #  # ][ #  # ]:          0 :     LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     359                 :            : #undef LEAD_CASE
     360                 :            :     case BT_NONXML:
     361                 :            :     case BT_MALFORM:
     362                 :            :     case BT_TRAIL:
     363                 :            :     case BT_CR:
     364                 :            :     case BT_LF:
     365                 :            :     case BT_RSQB:
     366                 :          0 :       *nextTokPtr = ptr;
     367                 :          0 :       return XML_TOK_DATA_CHARS;
     368                 :            :     default:
     369                 :          0 :       ptr += MINBPC(enc);
     370                 :            :       break;
     371                 :            :     }
     372                 :            :   }
     373                 :          0 :   *nextTokPtr = ptr;
     374                 :          0 :   return XML_TOK_DATA_CHARS;
     375                 :            : }
     376                 :            : 
     377                 :            : /* ptr points to character following "</" */
     378                 :            : 
     379                 :            : static int PTRCALL
     380                 :            : PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr,
     381                 :            :                    const char *end, const char **nextTokPtr)
     382                 :        881 : {
     383 [ -  + ][ #  # ]:        881 :   if (ptr == end)
                 [ #  # ]
     384                 :          0 :     return XML_TOK_PARTIAL;
     385   [ -  +  -  -  :        881 :   switch (BYTE_TYPE(enc, ptr)) {
           -  - ][ #  # ]
           [ #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  #  
                   #  # ]
     386 [ #  # ][ #  # ]:        881 :   CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     387                 :            :   default:
     388                 :          0 :     *nextTokPtr = ptr;
     389                 :          0 :     return XML_TOK_INVALID;
     390                 :            :   }
     391 [ +  + ][ #  # ]:       5028 :   while (ptr != end) {
                 [ #  # ]
     392   [ -  +  -  -  :       5027 :     switch (BYTE_TYPE(enc, ptr)) {
             -  -  -  +  
              - ][ #  # ]
           [ #  #  #  #  
             #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
             #  #  #  #  
                      # ]
     393 [ #  # ][ #  # ]:       4147 :     CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     394                 :            :     case BT_S: case BT_CR: case BT_LF:
     395 [ #  # ][ #  # ]:          0 :       for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
                 [ #  # ]
     396      [ #  #  # ]:          0 :         switch (BYTE_TYPE(enc, ptr)) {
                 [ #  # ]
              [ #  #  # ]
                 [ #  # ]
              [ #  #  # ]
     397                 :            :         case BT_S: case BT_CR: case BT_LF:
     398                 :            :           break;
     399                 :            :         case BT_GT:
     400                 :          0 :           *nextTokPtr = ptr + MINBPC(enc);
     401                 :          0 :           return XML_TOK_END_TAG;
     402                 :            :         default:
     403                 :          0 :           *nextTokPtr = ptr;
     404                 :          0 :           return XML_TOK_INVALID;
     405                 :            :         }
     406                 :            :       }
     407                 :          0 :       return XML_TOK_PARTIAL;
     408                 :            : #ifdef XML_NS
     409                 :            :     case BT_COLON:
     410                 :            :       /* no need to check qname syntax here,
     411                 :            :          since end-tag must match exactly */
     412                 :          0 :       ptr += MINBPC(enc);
     413                 :          0 :       break;
     414                 :            : #endif
     415                 :            :     case BT_GT:
     416                 :        880 :       *nextTokPtr = ptr + MINBPC(enc);
     417                 :        880 :       return XML_TOK_END_TAG;
     418                 :            :     default:
     419                 :          0 :       *nextTokPtr = ptr;
     420                 :          0 :       return XML_TOK_INVALID;
     421                 :            :     }
     422                 :            :   }
     423                 :        881 :   return XML_TOK_PARTIAL;
     424                 :            : }
     425                 :            : 
     426                 :            : /* ptr points to character following "&#X" */
     427                 :            : 
     428                 :            : static int PTRCALL
     429                 :            : PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr,
     430                 :            :                        const char *end, const char **nextTokPtr)
     431                 :            : {
     432 [ #  # ][ #  # ]:          0 :   if (ptr != end) {
                 [ #  # ]
     433 [ #  # ][ #  # ]:          0 :     switch (BYTE_TYPE(enc, ptr)) {
         [ #  # ][ #  # ]
                 [ #  # ]
     434                 :            :     case BT_DIGIT:
     435                 :            :     case BT_HEX:
     436                 :            :       break;
     437                 :            :     default:
     438                 :          0 :       *nextTokPtr = ptr;
     439                 :          0 :       return XML_TOK_INVALID;
     440                 :            :     }
     441 [ #  # ][ #  # ]:          0 :     for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
                 [ #  # ]
     442      [ #  #  # ]:          0 :       switch (BYTE_TYPE(enc, ptr)) {
                 [ #  # ]
              [ #  #  # ]
                 [ #  # ]
              [ #  #  # ]
     443                 :            :       case BT_DIGIT:
     444                 :            :       case BT_HEX:
     445                 :            :         break;
     446                 :            :       case BT_SEMI:
     447                 :          0 :         *nextTokPtr = ptr + MINBPC(enc);
     448                 :          0 :         return XML_TOK_CHAR_REF;
     449                 :            :       default:
     450                 :          0 :         *nextTokPtr = ptr;
     451                 :          0 :         return XML_TOK_INVALID;
     452                 :            :       }
     453                 :            :     }
     454                 :            :   }
     455                 :          0 :   return XML_TOK_PARTIAL;
     456                 :            : }
     457                 :            : 
     458                 :            : /* ptr points to character following "&#" */
     459                 :            : 
     460                 :            : static int PTRCALL
     461                 :            : PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr,
     462                 :            :                     const char *end, const char **nextTokPtr)
     463                 :          0 : {
     464 [ #  # ][ #  # ]:          0 :   if (ptr != end) {
                 [ #  # ]
     465 [ #  # ][ #  # ]:          0 :     if (CHAR_MATCHES(enc, ptr, ASCII_x))
         [ #  # ][ #  # ]
                 [ #  # ]
     466                 :          0 :       return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
     467 [ #  # ][ #  # ]:          0 :     switch (BYTE_TYPE(enc, ptr)) {
         [ #  # ][ #  # ]
                 [ #  # ]
     468                 :            :     case BT_DIGIT:
     469                 :            :       break;
     470                 :            :     default:
     471                 :          0 :       *nextTokPtr = ptr;
     472                 :          0 :       return XML_TOK_INVALID;
     473                 :            :     }
     474 [ #  # ][ #  # ]:          0 :     for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
                 [ #  # ]
     475      [ #  #  # ]:          0 :       switch (BYTE_TYPE(enc, ptr)) {
                 [ #  # ]
              [ #  #  # ]
                 [ #  # ]
              [ #  #  # ]
     476                 :            :       case BT_DIGIT:
     477                 :            :         break;
     478                 :            :       case BT_SEMI:
     479                 :          0 :         *nextTokPtr = ptr + MINBPC(enc);
     480                 :          0 :         return XML_TOK_CHAR_REF;
     481                 :            :       default:
     482                 :          0 :         *nextTokPtr = ptr;
     483                 :          0 :         return XML_TOK_INVALID;
     484                 :            :       }
     485                 :            :     }
     486                 :            :   }
     487                 :          0 :   return XML_TOK_PARTIAL;
     488                 :            : }
     489                 :            : 
     490                 :            : /* ptr points to character following "&" */
     491                 :            : 
     492                 :            : static int PTRCALL
     493                 :            : PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end,
     494                 :            :                 const char **nextTokPtr)
     495                 :          0 : {
     496 [ #  # ][ #  # ]:          0 :   if (ptr == end)
                 [ #  # ]
     497                 :          0 :     return XML_TOK_PARTIAL;
     498   [ #  #  #  #  :          0 :   switch (BYTE_TYPE(enc, ptr)) {
                #  #  # ]
         [ #  # ][ #  #  
             #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
                #  #  # ]
     499 [ #  # ][ #  # ]:          0 :   CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     500                 :            :   case BT_NUM:
     501                 :          0 :     return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
     502                 :            :   default:
     503                 :          0 :     *nextTokPtr = ptr;
     504                 :          0 :     return XML_TOK_INVALID;
     505                 :            :   }
     506 [ #  # ][ #  # ]:          0 :   while (ptr != end) {
                 [ #  # ]
     507   [ #  #  #  #  :          0 :     switch (BYTE_TYPE(enc, ptr)) {
                #  #  # ]
         [ #  # ][ #  #  
             #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
                #  #  # ]
     508 [ #  # ][ #  # ]:          0 :     CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     509                 :            :     case BT_SEMI:
     510                 :          0 :       *nextTokPtr = ptr + MINBPC(enc);
     511                 :          0 :       return XML_TOK_ENTITY_REF;
     512                 :            :     default:
     513                 :          0 :       *nextTokPtr = ptr;
     514                 :          0 :       return XML_TOK_INVALID;
     515                 :            :     }
     516                 :            :   }
     517                 :          0 :   return XML_TOK_PARTIAL;
     518                 :            : }
     519                 :            : 
     520                 :            : /* ptr points to character following first character of attribute name */
     521                 :            : 
     522                 :            : static int PTRCALL
     523                 :            : PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end,
     524                 :            :                  const char **nextTokPtr)
     525                 :        438 : {
     526                 :            : #ifdef XML_NS
     527                 :        438 :   int hadColon = 0;
     528                 :            : #endif
     529 [ +  - ][ #  # ]:       2355 :   while (ptr != end) {
                 [ #  # ]
     530   [ -  +  -  -  :       2355 :     switch (BYTE_TYPE(enc, ptr)) {
             -  -  -  +  
              - ][ #  # ]
           [ #  #  #  #  
             #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
             #  #  #  #  
                      # ]
     531 [ #  # ][ #  # ]:       1842 :     CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     532                 :            : #ifdef XML_NS
     533                 :            :     case BT_COLON:
     534 [ #  # ][ #  # ]:          0 :       if (hadColon) {
                 [ #  # ]
     535                 :          0 :         *nextTokPtr = ptr;
     536                 :          0 :         return XML_TOK_INVALID;
     537                 :            :       }
     538                 :          0 :       hadColon = 1;
     539                 :          0 :       ptr += MINBPC(enc);
     540 [ #  # ][ #  # ]:          0 :       if (ptr == end)
                 [ #  # ]
     541                 :          0 :         return XML_TOK_PARTIAL;
     542   [ #  #  #  #  :          0 :       switch (BYTE_TYPE(enc, ptr)) {
           #  # ][ #  # ]
           [ #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  #  
                   #  # ]
     543 [ #  # ][ #  # ]:          0 :       CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     544                 :            :       default:
     545                 :          0 :         *nextTokPtr = ptr;
     546                 :          0 :         return XML_TOK_INVALID;
     547                 :            :       }
     548                 :          0 :       break;
     549                 :            : #endif
     550                 :            :     case BT_S: case BT_CR: case BT_LF:
     551                 :            :       for (;;) {
     552                 :            :         int t;
     553                 :            : 
     554                 :          0 :         ptr += MINBPC(enc);
     555 [ #  # ][ #  # ]:          0 :         if (ptr == end)
                 [ #  # ]
     556                 :          0 :           return XML_TOK_PARTIAL;
     557 [ #  # ][ #  # ]:          0 :         t = BYTE_TYPE(enc, ptr);
     558 [ #  # ][ #  # ]:          0 :         if (t == BT_EQUALS)
                 [ #  # ]
     559                 :          0 :           break;
     560 [ #  # ][ #  # ]:          0 :         switch (t) {
                 [ #  # ]
     561                 :            :         case BT_S:
     562                 :            :         case BT_LF:
     563                 :            :         case BT_CR:
     564                 :            :           break;
     565                 :            :         default:
     566                 :          0 :           *nextTokPtr = ptr;
     567                 :          0 :           return XML_TOK_INVALID;
     568                 :            :         }
     569                 :            :       }
     570                 :            :     /* fall through */
     571                 :            :     case BT_EQUALS:
     572                 :            :       {
     573                 :            :         int open;
     574                 :            : #ifdef XML_NS
     575                 :        513 :         hadColon = 0;
     576                 :            : #endif
     577                 :            :         for (;;) {
     578                 :        513 :           ptr += MINBPC(enc);
     579 [ -  + ][ #  # ]:        513 :           if (ptr == end)
                 [ #  # ]
     580                 :          0 :             return XML_TOK_PARTIAL;
     581 [ #  # ][ #  # ]:          0 :           open = BYTE_TYPE(enc, ptr);
     582 [ -  + ][ #  # ]:        513 :           if (open == BT_QUOT || open == BT_APOS)
                 [ #  # ]
     583                 :        513 :             break;
     584 [ #  # ][ #  # ]:          0 :           switch (open) {
                 [ #  # ]
     585                 :            :           case BT_S:
     586                 :            :           case BT_LF:
     587                 :            :           case BT_CR:
     588                 :            :             break;
     589                 :            :           default:
     590                 :          0 :             *nextTokPtr = ptr;
     591                 :          0 :             return XML_TOK_INVALID;
     592                 :            :           }
     593                 :            :         }
     594                 :        513 :         ptr += MINBPC(enc);
     595                 :            :         /* in attribute value */
     596                 :            :         for (;;) {
     597                 :            :           int t;
     598 [ -  + ][ #  # ]:       6402 :           if (ptr == end)
                 [ #  # ]
     599                 :          0 :             return XML_TOK_PARTIAL;
     600 [ #  # ][ #  # ]:          0 :           t = BYTE_TYPE(enc, ptr);
     601 [ +  + ][ #  # ]:       6402 :           if (t == open)
                 [ #  # ]
     602                 :        513 :             break;
     603   [ -  -  -  -  :       5889 :           switch (t) {
           -  -  + ][ #  
          #  #  #  #  #  
           # ][ #  #  #  
             #  #  #  # ]
     604 [ #  # ][ #  # ]:          0 :           INVALID_CASES(ptr, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     605                 :            :           case BT_AMP:
     606                 :            :             {
     607                 :          0 :               int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
     608   [ #  #  #  #  :          0 :               if (tok <= 0) {
                   #  # ]
     609 [ #  # ][ #  # ]:          0 :                 if (tok == XML_TOK_INVALID)
                 [ #  # ]
     610                 :          0 :                   *nextTokPtr = ptr;
     611                 :          0 :                 return tok;
     612                 :            :               }
     613                 :            :               break;
     614                 :            :             }
     615                 :            :           case BT_LT:
     616                 :          0 :             *nextTokPtr = ptr;
     617                 :          0 :             return XML_TOK_INVALID;
     618                 :            :           default:
     619                 :       5889 :             ptr += MINBPC(enc);
     620                 :            :             break;
     621                 :            :           }
     622                 :            :         }
     623                 :        513 :         ptr += MINBPC(enc);
     624 [ -  + ][ #  # ]:        513 :         if (ptr == end)
                 [ #  # ]
     625                 :          0 :           return XML_TOK_PARTIAL;
     626   [ -  +  +  + ]:        513 :         switch (BYTE_TYPE(enc, ptr)) {
                 [ #  # ]
           [ #  #  #  # ]
                 [ #  # ]
           [ #  #  #  # ]
     627                 :            :         case BT_S:
     628                 :            :         case BT_CR:
     629                 :            :         case BT_LF:
     630                 :            :           break;
     631                 :            :         case BT_SOL:
     632                 :            :           goto sol;
     633                 :            :         case BT_GT:
     634                 :            :           goto gt;
     635                 :            :         default:
     636                 :          0 :           *nextTokPtr = ptr;
     637                 :          0 :           return XML_TOK_INVALID;
     638                 :            :         }
     639                 :            :         /* ptr points to closing quote */
     640                 :            :         for (;;) {
     641                 :        171 :           ptr += MINBPC(enc);
     642 [ -  + ][ #  # ]:        171 :           if (ptr == end)
                 [ #  # ]
     643                 :          0 :             return XML_TOK_PARTIAL;
     644   [ +  -  +  -  :        171 :           switch (BYTE_TYPE(enc, ptr)) {
             -  -  -  -  
              - ][ #  # ]
           [ #  #  #  #  
             #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
             #  #  #  #  
                      # ]
     645 [ #  # ][ #  # ]:         75 :           CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     646                 :            :           case BT_S: case BT_CR: case BT_LF:
     647                 :            :             continue;
     648                 :            :           case BT_GT:
     649                 :        396 :           gt:
     650                 :        396 :             *nextTokPtr = ptr + MINBPC(enc);
     651                 :        396 :             return XML_TOK_START_TAG_WITH_ATTS;
     652                 :            :           case BT_SOL:
     653                 :         42 :           sol:
     654                 :         42 :             ptr += MINBPC(enc);
     655 [ -  + ][ #  # ]:         42 :             if (ptr == end)
                 [ #  # ]
     656                 :          0 :               return XML_TOK_PARTIAL;
     657 [ -  + ][ #  # ]:         42 :             if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
         [ #  # ][ #  # ]
                 [ #  # ]
     658                 :          0 :               *nextTokPtr = ptr;
     659                 :          0 :               return XML_TOK_INVALID;
     660                 :            :             }
     661                 :         42 :             *nextTokPtr = ptr + MINBPC(enc);
     662                 :         42 :             return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
     663                 :            :           default:
     664                 :          0 :             *nextTokPtr = ptr;
     665                 :          0 :             return XML_TOK_INVALID;
     666                 :            :           }
     667                 :          0 :           break;
     668                 :            :         }
     669                 :            :         break;
     670                 :            :       }
     671                 :            :     default:
     672                 :          0 :       *nextTokPtr = ptr;
     673                 :          0 :       return XML_TOK_INVALID;
     674                 :            :     }
     675                 :            :   }
     676                 :        438 :   return XML_TOK_PARTIAL;
     677                 :            : }
     678                 :            : 
     679                 :            : /* ptr points to character following "<" */
     680                 :            : 
     681                 :            : static int PTRCALL
     682                 :            : PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end,
     683                 :            :                const char **nextTokPtr)
     684                 :       2167 : {
     685                 :            : #ifdef XML_NS
     686                 :            :   int hadColon;
     687                 :            : #endif
     688 [ -  + ][ #  # ]:       2167 :   if (ptr == end)
                 [ #  # ]
     689                 :          0 :     return XML_TOK_PARTIAL;
     690   [ -  +  -  -  :       2167 :   switch (BYTE_TYPE(enc, ptr)) {
             -  +  -  +  
              - ][ #  # ]
           [ #  #  #  #  
             #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
             #  #  #  #  
                      # ]
     691 [ #  # ][ #  # ]:        930 :   CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     692                 :            :   case BT_EXCL:
     693 [ -  + ][ #  # ]:        356 :     if ((ptr += MINBPC(enc)) == end)
                 [ #  # ]
     694                 :          0 :       return XML_TOK_PARTIAL;
     695      [ +  -  - ]:        356 :     switch (BYTE_TYPE(enc, ptr)) {
                 [ #  # ]
              [ #  #  # ]
                 [ #  # ]
              [ #  #  # ]
     696                 :            :     case BT_MINUS:
     697                 :        356 :       return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
     698                 :            :     case BT_LSQB:
     699                 :          0 :       return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc),
     700                 :            :                                       end, nextTokPtr);
     701                 :            :     }
     702                 :          0 :     *nextTokPtr = ptr;
     703                 :          0 :     return XML_TOK_INVALID;
     704                 :            :   case BT_QUEST:
     705                 :          0 :     return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
     706                 :            :   case BT_SOL:
     707                 :        881 :     return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
     708                 :            :   default:
     709                 :          0 :     *nextTokPtr = ptr;
     710                 :          0 :     return XML_TOK_INVALID;
     711                 :            :   }
     712                 :            : #ifdef XML_NS
     713                 :        930 :   hadColon = 0;
     714                 :            : #endif
     715                 :            :   /* we have a start-tag */
     716 [ +  - ][ #  # ]:       5273 :   while (ptr != end) {
                 [ #  # ]
     717   [ -  +  -  -  :       5273 :     switch (BYTE_TYPE(enc, ptr)) {
          -  -  +  +  +  
              - ][ #  # ]
           [ #  #  #  #  
          #  #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
          #  #  #  #  #  
                      # ]
     718 [ #  # ][ #  # ]:       4343 :     CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     719                 :            : #ifdef XML_NS
     720                 :            :     case BT_COLON:
     721 [ #  # ][ #  # ]:          0 :       if (hadColon) {
                 [ #  # ]
     722                 :          0 :         *nextTokPtr = ptr;
     723                 :          0 :         return XML_TOK_INVALID;
     724                 :            :       }
     725                 :          0 :       hadColon = 1;
     726                 :          0 :       ptr += MINBPC(enc);
     727 [ #  # ][ #  # ]:          0 :       if (ptr == end)
                 [ #  # ]
     728                 :          0 :         return XML_TOK_PARTIAL;
     729   [ #  #  #  #  :          0 :       switch (BYTE_TYPE(enc, ptr)) {
           #  # ][ #  # ]
           [ #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  #  
                   #  # ]
     730 [ #  # ][ #  # ]:          0 :       CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     731                 :            :       default:
     732                 :          0 :         *nextTokPtr = ptr;
     733                 :          0 :         return XML_TOK_INVALID;
     734                 :            :       }
     735                 :          0 :       break;
     736                 :            : #endif
     737                 :            :     case BT_S: case BT_CR: case BT_LF:
     738                 :            :       {
     739                 :        438 :         ptr += MINBPC(enc);
     740 [ +  - ][ #  # ]:        448 :         while (ptr != end) {
                 [ #  # ]
     741   [ -  +  -  -  :        448 :           switch (BYTE_TYPE(enc, ptr)) {
             -  +  -  -  
              - ][ #  # ]
           [ #  #  #  #  
             #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
             #  #  #  #  
                      # ]
     742 [ #  # ][ #  # ]:        438 :           CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     743                 :            :           case BT_GT:
     744                 :            :             goto gt;
     745                 :            :           case BT_SOL:
     746                 :            :             goto sol;
     747                 :            :           case BT_S: case BT_CR: case BT_LF:
     748                 :         10 :             ptr += MINBPC(enc);
     749                 :         10 :             continue;
     750                 :            :           default:
     751                 :          0 :             *nextTokPtr = ptr;
     752                 :          0 :             return XML_TOK_INVALID;
     753                 :            :           }
     754                 :        438 :           return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
     755                 :            :         }
     756                 :          0 :         return XML_TOK_PARTIAL;
     757                 :            :       }
     758                 :            :     case BT_GT:
     759                 :        484 :     gt:
     760                 :        484 :       *nextTokPtr = ptr + MINBPC(enc);
     761                 :        484 :       return XML_TOK_START_TAG_NO_ATTS;
     762                 :            :     case BT_SOL:
     763                 :          8 :     sol:
     764                 :          8 :       ptr += MINBPC(enc);
     765 [ -  + ][ #  # ]:          8 :       if (ptr == end)
                 [ #  # ]
     766                 :          0 :         return XML_TOK_PARTIAL;
     767 [ -  + ][ #  # ]:          8 :       if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
         [ #  # ][ #  # ]
                 [ #  # ]
     768                 :          0 :         *nextTokPtr = ptr;
     769                 :          0 :         return XML_TOK_INVALID;
     770                 :            :       }
     771                 :          8 :       *nextTokPtr = ptr + MINBPC(enc);
     772                 :          8 :       return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
     773                 :            :     default:
     774                 :          0 :       *nextTokPtr = ptr;
     775                 :          0 :       return XML_TOK_INVALID;
     776                 :            :     }
     777                 :            :   }
     778                 :       2167 :   return XML_TOK_PARTIAL;
     779                 :            : }
     780                 :            : 
     781                 :            : static int PTRCALL
     782                 :            : PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
     783                 :            :                    const char **nextTokPtr)
     784                 :       6168 : {
     785 [ -  + ][ #  # ]:       6168 :   if (ptr == end)
                 [ #  # ]
     786                 :          0 :     return XML_TOK_NONE;
     787                 :            :   if (MINBPC(enc) > 1) {
     788                 :          0 :     size_t n = end - ptr;
     789 [ #  # ][ #  # ]:          0 :     if (n & (MINBPC(enc) - 1)) {
     790                 :          0 :       n &= ~(MINBPC(enc) - 1);
     791 [ #  # ][ #  # ]:          0 :       if (n == 0)
     792                 :          0 :         return XML_TOK_PARTIAL;
     793                 :          0 :       end = ptr + n;
     794                 :            :     }
     795                 :            :   }
     796   [ +  -  -  +  :       6168 :   switch (BYTE_TYPE(enc, ptr)) {
          -  -  -  -  -  
              + ][ #  # ]
           [ #  #  #  #  
          #  #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
          #  #  #  #  #  
                      # ]
     797                 :            :   case BT_LT:
     798                 :       2167 :     return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
     799                 :            :   case BT_AMP:
     800                 :          0 :     return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
     801                 :            :   case BT_CR:
     802                 :          0 :     ptr += MINBPC(enc);
     803 [ #  # ][ #  # ]:          0 :     if (ptr == end)
                 [ #  # ]
     804                 :          0 :       return XML_TOK_TRAILING_CR;
     805 [ #  # ][ #  # ]:          0 :     if (BYTE_TYPE(enc, ptr) == BT_LF)
         [ #  # ][ #  # ]
                 [ #  # ]
     806                 :          0 :       ptr += MINBPC(enc);
     807                 :          0 :     *nextTokPtr = ptr;
     808                 :          0 :     return XML_TOK_DATA_NEWLINE;
     809                 :            :   case BT_LF:
     810                 :       1799 :     *nextTokPtr = ptr + MINBPC(enc);
     811                 :       1799 :     return XML_TOK_DATA_NEWLINE;
     812                 :            :   case BT_RSQB:
     813                 :          0 :     ptr += MINBPC(enc);
     814 [ #  # ][ #  # ]:          0 :     if (ptr == end)
                 [ #  # ]
     815                 :          0 :       return XML_TOK_TRAILING_RSQB;
     816 [ #  # ][ #  # ]:          0 :     if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB))
         [ #  # ][ #  # ]
                 [ #  # ]
     817                 :          0 :       break;
     818                 :          0 :     ptr += MINBPC(enc);
     819 [ #  # ][ #  # ]:          0 :     if (ptr == end)
                 [ #  # ]
     820                 :          0 :       return XML_TOK_TRAILING_RSQB;
     821 [ #  # ][ #  # ]:          0 :     if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
         [ #  # ][ #  # ]
                 [ #  # ]
     822                 :          0 :       ptr -= MINBPC(enc);
     823                 :          0 :       break;
     824                 :            :     }
     825                 :          0 :     *nextTokPtr = ptr;
     826                 :          0 :     return XML_TOK_INVALID;
     827 [ #  # ][ #  # ]:          0 :   INVALID_CASES(ptr, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     828                 :            :   default:
     829                 :       2202 :     ptr += MINBPC(enc);
     830                 :            :     break;
     831                 :            :   }
     832 [ +  - ][ #  # ]:      29043 :   while (ptr != end) {
                 [ #  # ]
     833   [ -  -  -  +  :      29043 :     switch (BYTE_TYPE(enc, ptr)) {
           +  + ][ #  # ]
           [ #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  #  
                   #  # ]
     834                 :            : #define LEAD_CASE(n) \
     835                 :            :     case BT_LEAD ## n: \
     836                 :            :       if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \
     837                 :            :         *nextTokPtr = ptr; \
     838                 :            :         return XML_TOK_DATA_CHARS; \
     839                 :            :       } \
     840                 :            :       ptr += n; \
     841                 :            :       break;
     842 [ #  # ][ #  # ]:          0 :     LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     843                 :            : #undef LEAD_CASE
     844                 :            :     case BT_RSQB:
     845 [ +  - ][ #  # ]:         25 :       if (ptr + MINBPC(enc) != end) {
                 [ #  # ]
     846 [ +  - ][ #  # ]:         25 :          if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
         [ #  # ][ #  # ]
                 [ #  # ]
     847                 :         25 :            ptr += MINBPC(enc);
     848                 :         25 :            break;
     849                 :            :          }
     850 [ #  # ][ #  # ]:          0 :          if (ptr + 2*MINBPC(enc) != end) {
                 [ #  # ]
     851 [ #  # ][ #  # ]:          0 :            if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) {
         [ #  # ][ #  # ]
                 [ #  # ]
     852                 :          0 :              ptr += MINBPC(enc);
     853                 :          0 :              break;
     854                 :            :            }
     855                 :          0 :            *nextTokPtr = ptr + 2*MINBPC(enc);
     856                 :          0 :            return XML_TOK_INVALID;
     857                 :            :          }
     858                 :            :       }
     859                 :            :       /* fall through */
     860                 :            :     case BT_AMP:
     861                 :            :     case BT_LT:
     862                 :            :     case BT_NONXML:
     863                 :            :     case BT_MALFORM:
     864                 :            :     case BT_TRAIL:
     865                 :            :     case BT_CR:
     866                 :            :     case BT_LF:
     867                 :       2202 :       *nextTokPtr = ptr;
     868                 :       2202 :       return XML_TOK_DATA_CHARS;
     869                 :            :     default:
     870                 :      26816 :       ptr += MINBPC(enc);
     871                 :            :       break;
     872                 :            :     }
     873                 :            :   }
     874                 :          0 :   *nextTokPtr = ptr;
     875                 :       6168 :   return XML_TOK_DATA_CHARS;
     876                 :            : }
     877                 :            : 
     878                 :            : /* ptr points to character following "%" */
     879                 :            : 
     880                 :            : static int PTRCALL
     881                 :            : PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,
     882                 :            :                     const char **nextTokPtr)
     883                 :          0 : {
     884 [ #  # ][ #  # ]:          0 :   if (ptr == end)
                 [ #  # ]
     885                 :          0 :     return -XML_TOK_PERCENT;
     886   [ #  #  #  #  :          0 :   switch (BYTE_TYPE(enc, ptr)) {
                #  #  # ]
         [ #  # ][ #  #  
             #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
                #  #  # ]
     887 [ #  # ][ #  # ]:          0 :   CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     888                 :            :   case BT_S: case BT_LF: case BT_CR: case BT_PERCNT:
     889                 :          0 :     *nextTokPtr = ptr;
     890                 :          0 :     return XML_TOK_PERCENT;
     891                 :            :   default:
     892                 :          0 :     *nextTokPtr = ptr;
     893                 :          0 :     return XML_TOK_INVALID;
     894                 :            :   }
     895 [ #  # ][ #  # ]:          0 :   while (ptr != end) {
                 [ #  # ]
     896   [ #  #  #  #  :          0 :     switch (BYTE_TYPE(enc, ptr)) {
                #  #  # ]
         [ #  # ][ #  #  
             #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
                #  #  # ]
     897 [ #  # ][ #  # ]:          0 :     CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     898                 :            :     case BT_SEMI:
     899                 :          0 :       *nextTokPtr = ptr + MINBPC(enc);
     900                 :          0 :       return XML_TOK_PARAM_ENTITY_REF;
     901                 :            :     default:
     902                 :          0 :       *nextTokPtr = ptr;
     903                 :          0 :       return XML_TOK_INVALID;
     904                 :            :     }
     905                 :            :   }
     906                 :          0 :   return XML_TOK_PARTIAL;
     907                 :            : }
     908                 :            : 
     909                 :            : static int PTRCALL
     910                 :            : PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
     911                 :            :                       const char **nextTokPtr)
     912                 :          0 : {
     913 [ #  # ][ #  # ]:          0 :   if (ptr == end)
                 [ #  # ]
     914                 :          0 :     return XML_TOK_PARTIAL;
     915   [ #  #  #  #  :          0 :   switch (BYTE_TYPE(enc, ptr)) {
           #  # ][ #  # ]
           [ #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  #  
                   #  # ]
     916 [ #  # ][ #  # ]:          0 :   CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     917                 :            :   default:
     918                 :          0 :     *nextTokPtr = ptr;
     919                 :          0 :     return XML_TOK_INVALID;
     920                 :            :   }
     921 [ #  # ][ #  # ]:          0 :   while (ptr != end) {
                 [ #  # ]
     922   [ #  #  #  #  :          0 :     switch (BYTE_TYPE(enc, ptr)) {
                #  #  # ]
         [ #  # ][ #  #  
             #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
                #  #  # ]
     923 [ #  # ][ #  # ]:          0 :     CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     924                 :            :     case BT_CR: case BT_LF: case BT_S:
     925                 :            :     case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR:
     926                 :          0 :       *nextTokPtr = ptr;
     927                 :          0 :       return XML_TOK_POUND_NAME;
     928                 :            :     default:
     929                 :          0 :       *nextTokPtr = ptr;
     930                 :          0 :       return XML_TOK_INVALID;
     931                 :            :     }
     932                 :            :   }
     933                 :          0 :   return -XML_TOK_POUND_NAME;
     934                 :            : }
     935                 :            : 
     936                 :            : static int PTRCALL
     937                 :            : PREFIX(scanLit)(int open, const ENCODING *enc,
     938                 :            :                 const char *ptr, const char *end,
     939                 :            :                 const char **nextTokPtr)
     940                 :          0 : {
     941 [ #  # ][ #  # ]:          0 :   while (ptr != end) {
                 [ #  # ]
     942 [ #  # ][ #  # ]:          0 :     int t = BYTE_TYPE(enc, ptr);
     943   [ #  #  #  #  :          0 :     switch (t) {
           #  # ][ #  #  
             #  #  #  # ]
           [ #  #  #  #  
                   #  # ]
     944 [ #  # ][ #  # ]:          0 :     INVALID_CASES(ptr, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     945                 :            :     case BT_QUOT:
     946                 :            :     case BT_APOS:
     947                 :          0 :       ptr += MINBPC(enc);
     948 [ #  # ][ #  # ]:          0 :       if (t != open)
                 [ #  # ]
     949                 :          0 :         break;
     950 [ #  # ][ #  # ]:          0 :       if (ptr == end)
                 [ #  # ]
     951                 :          0 :         return -XML_TOK_LITERAL;
     952                 :          0 :       *nextTokPtr = ptr;
     953 [ #  # ][ #  # ]:          0 :       switch (BYTE_TYPE(enc, ptr)) {
         [ #  # ][ #  # ]
                 [ #  # ]
     954                 :            :       case BT_S: case BT_CR: case BT_LF:
     955                 :            :       case BT_GT: case BT_PERCNT: case BT_LSQB:
     956                 :          0 :         return XML_TOK_LITERAL;
     957                 :            :       default:
     958                 :          0 :         return XML_TOK_INVALID;
     959                 :            :       }
     960                 :            :     default:
     961                 :          0 :       ptr += MINBPC(enc);
     962                 :            :       break;
     963                 :            :     }
     964                 :            :   }
     965                 :          0 :   return XML_TOK_PARTIAL;
     966                 :            : }
     967                 :            : 
     968                 :            : static int PTRCALL
     969                 :            : PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
     970                 :            :                   const char **nextTokPtr)
     971                 :        207 : {
     972                 :            :   int tok;
     973 [ +  + ][ #  # ]:        207 :   if (ptr == end)
                 [ #  # ]
     974                 :         62 :     return XML_TOK_NONE;
     975                 :            :   if (MINBPC(enc) > 1) {
     976                 :          0 :     size_t n = end - ptr;
     977 [ #  # ][ #  # ]:          0 :     if (n & (MINBPC(enc) - 1)) {
     978                 :          0 :       n &= ~(MINBPC(enc) - 1);
     979 [ #  # ][ #  # ]:          0 :       if (n == 0)
     980                 :          0 :         return XML_TOK_PARTIAL;
     981                 :          0 :       end = ptr + n;
     982                 :            :     }
     983                 :            :   }
     984   [ -  -  +  -  :        145 :   switch (BYTE_TYPE(enc, ptr)) {
          +  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
              - ][ #  # ]
           [ #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     985                 :            :   case BT_QUOT:
     986                 :          0 :     return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
     987                 :            :   case BT_APOS:
     988                 :          0 :     return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
     989                 :            :   case BT_LT:
     990                 :            :     {
     991                 :         74 :       ptr += MINBPC(enc);
     992 [ -  + ][ #  # ]:         74 :       if (ptr == end)
                 [ #  # ]
     993                 :          0 :         return XML_TOK_PARTIAL;
     994   [ +  +  +  - ]:         74 :       switch (BYTE_TYPE(enc, ptr)) {
                 [ #  # ]
           [ #  #  #  # ]
                 [ #  # ]
           [ #  #  #  # ]
     995                 :            :       case BT_EXCL:
     996                 :         10 :         return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
     997                 :            :       case BT_QUEST:
     998                 :         33 :         return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
     999                 :            :       case BT_NMSTRT:
    1000                 :            :       case BT_HEX:
    1001                 :            :       case BT_NONASCII:
    1002                 :            :       case BT_LEAD2:
    1003                 :            :       case BT_LEAD3:
    1004                 :            :       case BT_LEAD4:
    1005                 :         31 :         *nextTokPtr = ptr - MINBPC(enc);
    1006                 :         31 :         return XML_TOK_INSTANCE_START;
    1007                 :            :       }
    1008                 :          0 :       *nextTokPtr = ptr;
    1009                 :          0 :       return XML_TOK_INVALID;
    1010                 :            :     }
    1011                 :            :   case BT_CR:
    1012 [ #  # ][ #  # ]:          0 :     if (ptr + MINBPC(enc) == end) {
                 [ #  # ]
    1013                 :          0 :       *nextTokPtr = end;
    1014                 :            :       /* indicate that this might be part of a CR/LF pair */
    1015                 :          0 :       return -XML_TOK_PROLOG_S;
    1016                 :            :     }
    1017                 :            :     /* fall through */
    1018                 :            :   case BT_S: case BT_LF:
    1019                 :            :     for (;;) {
    1020                 :         71 :       ptr += MINBPC(enc);
    1021 [ +  + ][ #  # ]:         71 :       if (ptr == end)
                 [ #  # ]
    1022                 :         28 :         break;
    1023      [ -  -  + ]:         43 :       switch (BYTE_TYPE(enc, ptr)) {
                 [ #  # ]
              [ #  #  # ]
                 [ #  # ]
              [ #  #  # ]
    1024                 :            :       case BT_S: case BT_LF:
    1025                 :            :         break;
    1026                 :            :       case BT_CR:
    1027                 :            :         /* don't split CR/LF pair */
    1028 [ #  # ][ #  # ]:          0 :         if (ptr + MINBPC(enc) != end)
                 [ #  # ]
    1029                 :          0 :           break;
    1030                 :            :         /* fall through */
    1031                 :            :       default:
    1032                 :         43 :         *nextTokPtr = ptr;
    1033                 :         43 :         return XML_TOK_PROLOG_S;
    1034                 :            :       }
    1035                 :            :     }
    1036                 :         28 :     *nextTokPtr = ptr;
    1037                 :         28 :     return XML_TOK_PROLOG_S;
    1038                 :            :   case BT_PERCNT:
    1039                 :          0 :     return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
    1040                 :            :   case BT_COMMA:
    1041                 :          0 :     *nextTokPtr = ptr + MINBPC(enc);
    1042                 :          0 :     return XML_TOK_COMMA;
    1043                 :            :   case BT_LSQB:
    1044                 :          0 :     *nextTokPtr = ptr + MINBPC(enc);
    1045                 :          0 :     return XML_TOK_OPEN_BRACKET;
    1046                 :            :   case BT_RSQB:
    1047                 :          0 :     ptr += MINBPC(enc);
    1048 [ #  # ][ #  # ]:          0 :     if (ptr == end)
                 [ #  # ]
    1049                 :          0 :       return -XML_TOK_CLOSE_BRACKET;
    1050 [ #  # ][ #  # ]:          0 :     if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1051 [ #  # ][ #  # ]:          0 :       if (ptr + MINBPC(enc) == end)
                 [ #  # ]
    1052                 :          0 :         return XML_TOK_PARTIAL;
    1053 [ #  # ][ #  # ]:          0 :       if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1054                 :          0 :         *nextTokPtr = ptr + 2*MINBPC(enc);
    1055                 :          0 :         return XML_TOK_COND_SECT_CLOSE;
    1056                 :            :       }
    1057                 :            :     }
    1058                 :          0 :     *nextTokPtr = ptr;
    1059                 :          0 :     return XML_TOK_CLOSE_BRACKET;
    1060                 :            :   case BT_LPAR:
    1061                 :          0 :     *nextTokPtr = ptr + MINBPC(enc);
    1062                 :          0 :     return XML_TOK_OPEN_PAREN;
    1063                 :            :   case BT_RPAR:
    1064                 :          0 :     ptr += MINBPC(enc);
    1065 [ #  # ][ #  # ]:          0 :     if (ptr == end)
                 [ #  # ]
    1066                 :          0 :       return -XML_TOK_CLOSE_PAREN;
    1067   [ #  #  #  #  :          0 :     switch (BYTE_TYPE(enc, ptr)) {
              # ][ #  # ]
           [ #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
                      # ]
    1068                 :            :     case BT_AST:
    1069                 :          0 :       *nextTokPtr = ptr + MINBPC(enc);
    1070                 :          0 :       return XML_TOK_CLOSE_PAREN_ASTERISK;
    1071                 :            :     case BT_QUEST:
    1072                 :          0 :       *nextTokPtr = ptr + MINBPC(enc);
    1073                 :          0 :       return XML_TOK_CLOSE_PAREN_QUESTION;
    1074                 :            :     case BT_PLUS:
    1075                 :          0 :       *nextTokPtr = ptr + MINBPC(enc);
    1076                 :          0 :       return XML_TOK_CLOSE_PAREN_PLUS;
    1077                 :            :     case BT_CR: case BT_LF: case BT_S:
    1078                 :            :     case BT_GT: case BT_COMMA: case BT_VERBAR:
    1079                 :            :     case BT_RPAR:
    1080                 :          0 :       *nextTokPtr = ptr;
    1081                 :          0 :       return XML_TOK_CLOSE_PAREN;
    1082                 :            :     }
    1083                 :          0 :     *nextTokPtr = ptr;
    1084                 :          0 :     return XML_TOK_INVALID;
    1085                 :            :   case BT_VERBAR:
    1086                 :          0 :     *nextTokPtr = ptr + MINBPC(enc);
    1087                 :          0 :     return XML_TOK_OR;
    1088                 :            :   case BT_GT:
    1089                 :          0 :     *nextTokPtr = ptr + MINBPC(enc);
    1090                 :          0 :     return XML_TOK_DECL_CLOSE;
    1091                 :            :   case BT_NUM:
    1092                 :          0 :     return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
    1093                 :            : #define LEAD_CASE(n) \
    1094                 :            :   case BT_LEAD ## n: \
    1095                 :            :     if (end - ptr < n) \
    1096                 :            :       return XML_TOK_PARTIAL_CHAR; \
    1097                 :            :     if (IS_NMSTRT_CHAR(enc, ptr, n)) { \
    1098                 :            :       ptr += n; \
    1099                 :            :       tok = XML_TOK_NAME; \
    1100                 :            :       break; \
    1101                 :            :     } \
    1102                 :            :     if (IS_NAME_CHAR(enc, ptr, n)) { \
    1103                 :            :       ptr += n; \
    1104                 :            :       tok = XML_TOK_NMTOKEN; \
    1105                 :            :       break; \
    1106                 :            :     } \
    1107                 :            :     *nextTokPtr = ptr; \
    1108                 :            :     return XML_TOK_INVALID;
    1109 [ #  # ][ #  # ]:          0 :     LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    1110                 :            : #undef LEAD_CASE
    1111                 :            :   case BT_NMSTRT:
    1112                 :            :   case BT_HEX:
    1113                 :          0 :     tok = XML_TOK_NAME;
    1114                 :          0 :     ptr += MINBPC(enc);
    1115                 :          0 :     break;
    1116                 :            :   case BT_DIGIT:
    1117                 :            :   case BT_NAME:
    1118                 :            :   case BT_MINUS:
    1119                 :            : #ifdef XML_NS
    1120                 :            :   case BT_COLON:
    1121                 :            : #endif
    1122                 :          0 :     tok = XML_TOK_NMTOKEN;
    1123                 :          0 :     ptr += MINBPC(enc);
    1124                 :          0 :     break;
    1125                 :            :   case BT_NONASCII:
    1126 [ #  # ][ #  # ]:          0 :     if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
    1127                 :          0 :       ptr += MINBPC(enc);
    1128                 :          0 :       tok = XML_TOK_NAME;
    1129                 :          0 :       break;
    1130                 :            :     }
    1131 [ #  # ][ #  # ]:          0 :     if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
    1132                 :          0 :       ptr += MINBPC(enc);
    1133                 :          0 :       tok = XML_TOK_NMTOKEN;
    1134                 :          0 :       break;
    1135                 :            :     }
    1136                 :            :     /* fall through */
    1137                 :            :   default:
    1138                 :          0 :     *nextTokPtr = ptr;
    1139                 :          0 :     return XML_TOK_INVALID;
    1140                 :            :   }
    1141 [ #  # ][ #  # ]:          0 :   while (ptr != end) {
                 [ #  # ]
    1142   [ #  #  #  #  :          0 :     switch (BYTE_TYPE(enc, ptr)) {
          #  #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  #  
          #  #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    1143 [ #  # ][ #  # ]:          0 :     CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1144                 :            :     case BT_GT: case BT_RPAR: case BT_COMMA:
    1145                 :            :     case BT_VERBAR: case BT_LSQB: case BT_PERCNT:
    1146                 :            :     case BT_S: case BT_CR: case BT_LF:
    1147                 :          0 :       *nextTokPtr = ptr;
    1148                 :          0 :       return tok;
    1149                 :            : #ifdef XML_NS
    1150                 :            :     case BT_COLON:
    1151                 :          0 :       ptr += MINBPC(enc);
    1152      [ #  #  # ]:          0 :       switch (tok) {
              [ #  #  # ]
              [ #  #  # ]
    1153                 :            :       case XML_TOK_NAME:
    1154 [ #  # ][ #  # ]:          0 :         if (ptr == end)
                 [ #  # ]
    1155                 :          0 :           return XML_TOK_PARTIAL;
    1156                 :          0 :         tok = XML_TOK_PREFIXED_NAME;
    1157   [ #  #  #  #  :          0 :         switch (BYTE_TYPE(enc, ptr)) {
           #  # ][ #  # ]
           [ #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  #  
                   #  # ]
    1158 [ #  # ][ #  # ]:          0 :         CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1159                 :            :         default:
    1160                 :          0 :           tok = XML_TOK_NMTOKEN;
    1161                 :            :           break;
    1162                 :            :         }
    1163                 :            :         break;
    1164                 :            :       case XML_TOK_PREFIXED_NAME:
    1165                 :          0 :         tok = XML_TOK_NMTOKEN;
    1166                 :            :         break;
    1167                 :            :       }
    1168                 :            :       break;
    1169                 :            : #endif
    1170                 :            :     case BT_PLUS:
    1171 [ #  # ][ #  # ]:          0 :       if (tok == XML_TOK_NMTOKEN)  {
                 [ #  # ]
    1172                 :          0 :         *nextTokPtr = ptr;
    1173                 :          0 :         return XML_TOK_INVALID;
    1174                 :            :       }
    1175                 :          0 :       *nextTokPtr = ptr + MINBPC(enc);
    1176                 :          0 :       return XML_TOK_NAME_PLUS;
    1177                 :            :     case BT_AST:
    1178 [ #  # ][ #  # ]:          0 :       if (tok == XML_TOK_NMTOKEN)  {
                 [ #  # ]
    1179                 :          0 :         *nextTokPtr = ptr;
    1180                 :          0 :         return XML_TOK_INVALID;
    1181                 :            :       }
    1182                 :          0 :       *nextTokPtr = ptr + MINBPC(enc);
    1183                 :          0 :       return XML_TOK_NAME_ASTERISK;
    1184                 :            :     case BT_QUEST:
    1185 [ #  # ][ #  # ]:          0 :       if (tok == XML_TOK_NMTOKEN)  {
                 [ #  # ]
    1186                 :          0 :         *nextTokPtr = ptr;
    1187                 :          0 :         return XML_TOK_INVALID;
    1188                 :            :       }
    1189                 :          0 :       *nextTokPtr = ptr + MINBPC(enc);
    1190                 :          0 :       return XML_TOK_NAME_QUESTION;
    1191                 :            :     default:
    1192                 :          0 :       *nextTokPtr = ptr;
    1193                 :          0 :       return XML_TOK_INVALID;
    1194                 :            :     }
    1195                 :            :   }
    1196                 :        207 :   return -tok;
    1197                 :            : }
    1198                 :            : 
    1199                 :            : static int PTRCALL
    1200                 :            : PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr,
    1201                 :            :                           const char *end, const char **nextTokPtr)
    1202                 :          0 : {
    1203                 :            :   const char *start;
    1204 [ #  # ][ #  # ]:          0 :   if (ptr == end)
                 [ #  # ]
    1205                 :          0 :     return XML_TOK_NONE;
    1206                 :          0 :   start = ptr;
    1207 [ #  # ][ #  # ]:          0 :   while (ptr != end) {
                 [ #  # ]
    1208   [ #  #  #  #  :          0 :     switch (BYTE_TYPE(enc, ptr)) {
             #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
             #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
             #  #  #  #  
                      # ]
    1209                 :            : #define LEAD_CASE(n) \
    1210                 :            :     case BT_LEAD ## n: ptr += n; break;
    1211                 :          0 :     LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
    1212                 :            : #undef LEAD_CASE
    1213                 :            :     case BT_AMP:
    1214 [ #  # ][ #  # ]:          0 :       if (ptr == start)
                 [ #  # ]
    1215                 :          0 :         return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
    1216                 :          0 :       *nextTokPtr = ptr;
    1217                 :          0 :       return XML_TOK_DATA_CHARS;
    1218                 :            :     case BT_LT:
    1219                 :            :       /* this is for inside entity references */
    1220                 :          0 :       *nextTokPtr = ptr;
    1221                 :          0 :       return XML_TOK_INVALID;
    1222                 :            :     case BT_LF:
    1223 [ #  # ][ #  # ]:          0 :       if (ptr == start) {
                 [ #  # ]
    1224                 :          0 :         *nextTokPtr = ptr + MINBPC(enc);
    1225                 :          0 :         return XML_TOK_DATA_NEWLINE;
    1226                 :            :       }
    1227                 :          0 :       *nextTokPtr = ptr;
    1228                 :          0 :       return XML_TOK_DATA_CHARS;
    1229                 :            :     case BT_CR:
    1230 [ #  # ][ #  # ]:          0 :       if (ptr == start) {
                 [ #  # ]
    1231                 :          0 :         ptr += MINBPC(enc);
    1232 [ #  # ][ #  # ]:          0 :         if (ptr == end)
                 [ #  # ]
    1233                 :          0 :           return XML_TOK_TRAILING_CR;
    1234 [ #  # ][ #  # ]:          0 :         if (BYTE_TYPE(enc, ptr) == BT_LF)
         [ #  # ][ #  # ]
                 [ #  # ]
    1235                 :          0 :           ptr += MINBPC(enc);
    1236                 :          0 :         *nextTokPtr = ptr;
    1237                 :          0 :         return XML_TOK_DATA_NEWLINE;
    1238                 :            :       }
    1239                 :          0 :       *nextTokPtr = ptr;
    1240                 :          0 :       return XML_TOK_DATA_CHARS;
    1241                 :            :     case BT_S:
    1242 [ #  # ][ #  # ]:          0 :       if (ptr == start) {
                 [ #  # ]
    1243                 :          0 :         *nextTokPtr = ptr + MINBPC(enc);
    1244                 :          0 :         return XML_TOK_ATTRIBUTE_VALUE_S;
    1245                 :            :       }
    1246                 :          0 :       *nextTokPtr = ptr;
    1247                 :          0 :       return XML_TOK_DATA_CHARS;
    1248                 :            :     default:
    1249                 :          0 :       ptr += MINBPC(enc);
    1250                 :            :       break;
    1251                 :            :     }
    1252                 :            :   }
    1253                 :          0 :   *nextTokPtr = ptr;
    1254                 :          0 :   return XML_TOK_DATA_CHARS;
    1255                 :            : }
    1256                 :            : 
    1257                 :            : static int PTRCALL
    1258                 :            : PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr,
    1259                 :            :                        const char *end, const char **nextTokPtr)
    1260                 :          0 : {
    1261                 :            :   const char *start;
    1262 [ #  # ][ #  # ]:          0 :   if (ptr == end)
                 [ #  # ]
    1263                 :          0 :     return XML_TOK_NONE;
    1264                 :          0 :   start = ptr;
    1265 [ #  # ][ #  # ]:          0 :   while (ptr != end) {
                 [ #  # ]
    1266   [ #  #  #  #  :          0 :     switch (BYTE_TYPE(enc, ptr)) {
             #  #  #  # ]
         [ #  # ][ #  #  
          #  #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
             #  #  #  # ]
    1267                 :            : #define LEAD_CASE(n) \
    1268                 :            :     case BT_LEAD ## n: ptr += n; break;
    1269                 :          0 :     LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
    1270                 :            : #undef LEAD_CASE
    1271                 :            :     case BT_AMP:
    1272 [ #  # ][ #  # ]:          0 :       if (ptr == start)
                 [ #  # ]
    1273                 :          0 :         return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
    1274                 :          0 :       *nextTokPtr = ptr;
    1275                 :          0 :       return XML_TOK_DATA_CHARS;
    1276                 :            :     case BT_PERCNT:
    1277 [ #  # ][ #  # ]:          0 :       if (ptr == start) {
                 [ #  # ]
    1278                 :            :         int tok =  PREFIX(scanPercent)(enc, ptr + MINBPC(enc),
    1279                 :          0 :                                        end, nextTokPtr);
    1280 [ #  # ][ #  # ]:          0 :         return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
                 [ #  # ]
    1281                 :            :       }
    1282                 :          0 :       *nextTokPtr = ptr;
    1283                 :          0 :       return XML_TOK_DATA_CHARS;
    1284                 :            :     case BT_LF:
    1285 [ #  # ][ #  # ]:          0 :       if (ptr == start) {
                 [ #  # ]
    1286                 :          0 :         *nextTokPtr = ptr + MINBPC(enc);
    1287                 :          0 :         return XML_TOK_DATA_NEWLINE;
    1288                 :            :       }
    1289                 :          0 :       *nextTokPtr = ptr;
    1290                 :          0 :       return XML_TOK_DATA_CHARS;
    1291                 :            :     case BT_CR:
    1292 [ #  # ][ #  # ]:          0 :       if (ptr == start) {
                 [ #  # ]
    1293                 :          0 :         ptr += MINBPC(enc);
    1294 [ #  # ][ #  # ]:          0 :         if (ptr == end)
                 [ #  # ]
    1295                 :          0 :           return XML_TOK_TRAILING_CR;
    1296 [ #  # ][ #  # ]:          0 :         if (BYTE_TYPE(enc, ptr) == BT_LF)
         [ #  # ][ #  # ]
                 [ #  # ]
    1297                 :          0 :           ptr += MINBPC(enc);
    1298                 :          0 :         *nextTokPtr = ptr;
    1299                 :          0 :         return XML_TOK_DATA_NEWLINE;
    1300                 :            :       }
    1301                 :          0 :       *nextTokPtr = ptr;
    1302                 :          0 :       return XML_TOK_DATA_CHARS;
    1303                 :            :     default:
    1304                 :          0 :       ptr += MINBPC(enc);
    1305                 :            :       break;
    1306                 :            :     }
    1307                 :            :   }
    1308                 :          0 :   *nextTokPtr = ptr;
    1309                 :          0 :   return XML_TOK_DATA_CHARS;
    1310                 :            : }
    1311                 :            : 
    1312                 :            : #ifdef XML_DTD
    1313                 :            : 
    1314                 :            : static int PTRCALL
    1315                 :            : PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr,
    1316                 :            :                          const char *end, const char **nextTokPtr)
    1317                 :          0 : {
    1318                 :          0 :   int level = 0;
    1319                 :            :   if (MINBPC(enc) > 1) {
    1320                 :          0 :     size_t n = end - ptr;
    1321 [ #  # ][ #  # ]:          0 :     if (n & (MINBPC(enc) - 1)) {
    1322                 :          0 :       n &= ~(MINBPC(enc) - 1);
    1323                 :          0 :       end = ptr + n;
    1324                 :            :     }
    1325                 :            :   }
    1326 [ #  # ][ #  # ]:          0 :   while (ptr != end) {
                 [ #  # ]
    1327   [ #  #  #  #  :          0 :     switch (BYTE_TYPE(enc, ptr)) {
                #  #  # ]
         [ #  # ][ #  #  
             #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
                #  #  # ]
    1328 [ #  # ][ #  # ]:          0 :     INVALID_CASES(ptr, nextTokPtr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1329                 :            :     case BT_LT:
    1330 [ #  # ][ #  # ]:          0 :       if ((ptr += MINBPC(enc)) == end)
                 [ #  # ]
    1331                 :          0 :         return XML_TOK_PARTIAL;
    1332 [ #  # ][ #  # ]:          0 :       if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1333 [ #  # ][ #  # ]:          0 :         if ((ptr += MINBPC(enc)) == end)
                 [ #  # ]
    1334                 :          0 :           return XML_TOK_PARTIAL;
    1335 [ #  # ][ #  # ]:          0 :         if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1336                 :          0 :           ++level;
    1337                 :          0 :           ptr += MINBPC(enc);
    1338                 :            :         }
    1339                 :            :       }
    1340                 :            :       break;
    1341                 :            :     case BT_RSQB:
    1342 [ #  # ][ #  # ]:          0 :       if ((ptr += MINBPC(enc)) == end)
                 [ #  # ]
    1343                 :          0 :         return XML_TOK_PARTIAL;
    1344 [ #  # ][ #  # ]:          0 :       if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1345 [ #  # ][ #  # ]:          0 :         if ((ptr += MINBPC(enc)) == end)
                 [ #  # ]
    1346                 :          0 :           return XML_TOK_PARTIAL;
    1347 [ #  # ][ #  # ]:          0 :         if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1348                 :          0 :           ptr += MINBPC(enc);
    1349 [ #  # ][ #  # ]:          0 :           if (level == 0) {
                 [ #  # ]
    1350                 :          0 :             *nextTokPtr = ptr;
    1351                 :          0 :             return XML_TOK_IGNORE_SECT;
    1352                 :            :           }
    1353                 :          0 :           --level;
    1354                 :            :         }
    1355                 :            :       }
    1356                 :            :       break;
    1357                 :            :     default:
    1358                 :          0 :       ptr += MINBPC(enc);
    1359                 :            :       break;
    1360                 :            :     }
    1361                 :            :   }
    1362                 :          0 :   return XML_TOK_PARTIAL;
    1363                 :            : }
    1364                 :            : 
    1365                 :            : #endif /* XML_DTD */
    1366                 :            : 
    1367                 :            : static int PTRCALL
    1368                 :            : PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
    1369                 :            :                    const char **badPtr)
    1370                 :          0 : {
    1371                 :          0 :   ptr += MINBPC(enc);
    1372                 :          0 :   end -= MINBPC(enc);
    1373 [ #  # ][ #  # ]:          0 :   for (; ptr != end; ptr += MINBPC(enc)) {
                 [ #  # ]
    1374   [ #  #  #  # ]:          0 :     switch (BYTE_TYPE(enc, ptr)) {
                 [ #  # ]
           [ #  #  #  # ]
                 [ #  # ]
           [ #  #  #  # ]
    1375                 :            :     case BT_DIGIT:
    1376                 :            :     case BT_HEX:
    1377                 :            :     case BT_MINUS:
    1378                 :            :     case BT_APOS:
    1379                 :            :     case BT_LPAR:
    1380                 :            :     case BT_RPAR:
    1381                 :            :     case BT_PLUS:
    1382                 :            :     case BT_COMMA:
    1383                 :            :     case BT_SOL:
    1384                 :            :     case BT_EQUALS:
    1385                 :            :     case BT_QUEST:
    1386                 :            :     case BT_CR:
    1387                 :            :     case BT_LF:
    1388                 :            :     case BT_SEMI:
    1389                 :            :     case BT_EXCL:
    1390                 :            :     case BT_AST:
    1391                 :            :     case BT_PERCNT:
    1392                 :            :     case BT_NUM:
    1393                 :            : #ifdef XML_NS
    1394                 :            :     case BT_COLON:
    1395                 :            : #endif
    1396                 :            :       break;
    1397                 :            :     case BT_S:
    1398 [ #  # ][ #  # ]:          0 :       if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1399                 :          0 :         *badPtr = ptr;
    1400                 :          0 :         return 0;
    1401                 :            :       }
    1402                 :            :       break;
    1403                 :            :     case BT_NAME:
    1404                 :            :     case BT_NMSTRT:
    1405 [ #  # ][ #  # ]:          0 :       if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f))
         [ #  # ][ #  # ]
                 [ #  # ]
    1406                 :          0 :         break;
    1407                 :            :     default:
    1408 [ #  # ][ #  # ]:          0 :       switch (BYTE_TO_ASCII(enc, ptr)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1409                 :            :       case 0x24: /* $ */
    1410                 :            :       case 0x40: /* @ */
    1411                 :            :         break;
    1412                 :            :       default:
    1413                 :          0 :         *badPtr = ptr;
    1414                 :          0 :         return 0;
    1415                 :            :       }
    1416                 :            :       break;
    1417                 :            :     }
    1418                 :            :   }
    1419                 :          0 :   return 1;
    1420                 :            : }
    1421                 :            : 
    1422                 :            : /* This must only be called for a well-formed start-tag or empty
    1423                 :            :    element tag.  Returns the number of attributes.  Pointers to the
    1424                 :            :    first attsMax attributes are stored in atts.
    1425                 :            : */
    1426                 :            : 
    1427                 :            : static int PTRCALL
    1428                 :            : PREFIX(getAtts)(const ENCODING *enc, const char *ptr,
    1429                 :            :                 int attsMax, ATTRIBUTE *atts)
    1430                 :        930 : {
    1431                 :        930 :   enum { other, inName, inValue } state = inName;
    1432                 :        930 :   int nAtts = 0;
    1433                 :        930 :   int open = 0; /* defined when state == inValue;
    1434                 :            :                    initialization just to shut up compilers */
    1435                 :            : 
    1436                 :        930 :   for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
    1437   [ -  -  -  +  :      16605 :     switch (BYTE_TYPE(enc, ptr)) {
          +  -  -  +  +  
           +  + ][ #  # ]
           [ #  #  #  #  
          #  #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    1438                 :            : #define START_NAME \
    1439                 :            :       if (state == other) { \
    1440                 :            :         if (nAtts < attsMax) { \
    1441                 :            :           atts[nAtts].name = ptr; \
    1442                 :            :           atts[nAtts].normalized = 1; \
    1443                 :            :         } \
    1444                 :            :         state = inName; \
    1445                 :            :       }
    1446                 :            : #define LEAD_CASE(n) \
    1447                 :            :     case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break;
    1448 [ #  # ][ #  # ]:          0 :     LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1449                 :            : #undef LEAD_CASE
    1450                 :            :     case BT_NONASCII:
    1451                 :            :     case BT_NMSTRT:
    1452                 :            :     case BT_HEX:
    1453 [ +  + ][ +  - ]:      12403 :       START_NAME
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1454                 :            :       break;
    1455                 :            : #undef START_NAME
    1456                 :            :     case BT_QUOT:
    1457 [ +  + ][ #  # ]:       1026 :       if (state != inValue) {
                 [ #  # ]
    1458 [ +  - ][ #  # ]:        513 :         if (nAtts < attsMax)
                 [ #  # ]
    1459                 :        513 :           atts[nAtts].valuePtr = ptr + MINBPC(enc);
    1460                 :        513 :         state = inValue;
    1461                 :        513 :         open = BT_QUOT;
    1462                 :            :       }
    1463 [ +  - ][ #  # ]:        513 :       else if (open == BT_QUOT) {
                 [ #  # ]
    1464                 :        513 :         state = other;
    1465 [ +  - ][ #  # ]:        513 :         if (nAtts < attsMax)
                 [ #  # ]
    1466                 :        513 :           atts[nAtts].valueEnd = ptr;
    1467                 :        513 :         nAtts++;
    1468                 :            :       }
    1469                 :            :       break;
    1470                 :            :     case BT_APOS:
    1471 [ #  # ][ #  # ]:          0 :       if (state != inValue) {
                 [ #  # ]
    1472 [ #  # ][ #  # ]:          0 :         if (nAtts < attsMax)
                 [ #  # ]
    1473                 :          0 :           atts[nAtts].valuePtr = ptr + MINBPC(enc);
    1474                 :          0 :         state = inValue;
    1475                 :          0 :         open = BT_APOS;
    1476                 :            :       }
    1477 [ #  # ][ #  # ]:          0 :       else if (open == BT_APOS) {
                 [ #  # ]
    1478                 :          0 :         state = other;
    1479 [ #  # ][ #  # ]:          0 :         if (nAtts < attsMax)
                 [ #  # ]
    1480                 :          0 :           atts[nAtts].valueEnd = ptr;
    1481                 :          0 :         nAtts++;
    1482                 :            :       }
    1483                 :            :       break;
    1484                 :            :     case BT_AMP:
    1485 [ #  # ][ #  # ]:          0 :       if (nAtts < attsMax)
                 [ #  # ]
    1486                 :          0 :         atts[nAtts].normalized = 0;
    1487                 :            :       break;
    1488                 :            :     case BT_S:
    1489 [ +  + ][ #  # ]:        783 :       if (state == inName)
                 [ #  # ]
    1490                 :        437 :         state = other;
    1491 [ +  + ][ +  - ]:        346 :       else if (state == inValue
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    1492                 :            :                && nAtts < attsMax
    1493                 :            :                && atts[nAtts].normalized
    1494                 :            :                && (ptr == atts[nAtts].valuePtr
    1495                 :            :                    || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
    1496                 :            :                    || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
    1497                 :            :                    || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
    1498                 :          0 :         atts[nAtts].normalized = 0;
    1499                 :            :       break;
    1500                 :            :     case BT_CR: case BT_LF:
    1501                 :            :       /* This case ensures that the first attribute name is counted
    1502                 :            :          Apart from that we could just change state on the quote. */
    1503 [ +  + ][ #  # ]:         15 :       if (state == inName)
                 [ #  # ]
    1504                 :          1 :         state = other;
    1505 [ -  + ][ #  # ]:         14 :       else if (state == inValue && nAtts < attsMax)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1506                 :          0 :         atts[nAtts].normalized = 0;
    1507                 :            :       break;
    1508                 :            :     case BT_GT:
    1509                 :            :     case BT_SOL:
    1510 [ +  + ][ #  # ]:       1106 :       if (state != inValue)
                 [ #  # ]
    1511                 :        930 :         return nAtts;
    1512                 :            :       break;
    1513                 :            :     default:
    1514                 :            :       break;
    1515                 :            :     }
    1516                 :      15675 :   }
    1517                 :            :   /* not reached */
    1518                 :            : }
    1519                 :            : 
    1520                 :            : static int PTRFASTCALL
    1521                 :            : PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr)
    1522                 :          0 : {
    1523                 :          0 :   int result = 0;
    1524                 :            :   /* skip &# */
    1525                 :          0 :   ptr += 2*MINBPC(enc);
    1526 [ #  # ][ #  # ]:          0 :   if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1527                 :          0 :     for (ptr += MINBPC(enc);
    1528 [ #  # ][ #  # ]:          0 :          !CHAR_MATCHES(enc, ptr, ASCII_SEMI);
         [ #  # ][ #  # ]
                 [ #  # ]
    1529                 :          0 :          ptr += MINBPC(enc)) {
    1530 [ #  # ][ #  # ]:          0 :       int c = BYTE_TO_ASCII(enc, ptr);
    1531   [ #  #  #  # ]:          0 :       switch (c) {
           [ #  #  #  # ]
           [ #  #  #  # ]
    1532                 :            :       case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4:
    1533                 :            :       case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9:
    1534                 :          0 :         result <<= 4;
    1535                 :          0 :         result |= (c - ASCII_0);
    1536                 :          0 :         break;
    1537                 :            :       case ASCII_A: case ASCII_B: case ASCII_C:
    1538                 :            :       case ASCII_D: case ASCII_E: case ASCII_F:
    1539                 :          0 :         result <<= 4;
    1540                 :          0 :         result += 10 + (c - ASCII_A);
    1541                 :          0 :         break;
    1542                 :            :       case ASCII_a: case ASCII_b: case ASCII_c:
    1543                 :            :       case ASCII_d: case ASCII_e: case ASCII_f:
    1544                 :          0 :         result <<= 4;
    1545                 :          0 :         result += 10 + (c - ASCII_a);
    1546                 :            :         break;
    1547                 :            :       }
    1548 [ #  # ][ #  # ]:          0 :       if (result >= 0x110000)
                 [ #  # ]
    1549                 :          0 :         return -1;
    1550                 :            :     }
    1551                 :            :   }
    1552                 :            :   else {
    1553 [ #  # ][ #  # ]:          0 :     for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1554 [ #  # ][ #  # ]:          0 :       int c = BYTE_TO_ASCII(enc, ptr);
    1555                 :          0 :       result *= 10;
    1556                 :          0 :       result += (c - ASCII_0);
    1557 [ #  # ][ #  # ]:          0 :       if (result >= 0x110000)
                 [ #  # ]
    1558                 :          0 :         return -1;
    1559                 :            :     }
    1560                 :            :   }
    1561                 :          0 :   return checkCharRefNumber(result);
    1562                 :            : }
    1563                 :            : 
    1564                 :            : static int PTRCALL
    1565                 :            : PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr,
    1566                 :            :                              const char *end)
    1567                 :          0 : {
    1568   [ #  #  #  # ]:          0 :   switch ((end - ptr)/MINBPC(enc)) {
           [ #  #  #  # ]
           [ #  #  #  # ]
    1569                 :            :   case 2:
    1570 [ #  # ][ #  # ]:          0 :     if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1571      [ #  #  # ]:          0 :       switch (BYTE_TO_ASCII(enc, ptr)) {
                 [ #  # ]
              [ #  #  # ]
                 [ #  # ]
              [ #  #  # ]
    1572                 :            :       case ASCII_l:
    1573                 :          0 :         return ASCII_LT;
    1574                 :            :       case ASCII_g:
    1575                 :          0 :         return ASCII_GT;
    1576                 :            :       }
    1577                 :            :     }
    1578                 :            :     break;
    1579                 :            :   case 3:
    1580 [ #  # ][ #  # ]:          0 :     if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1581                 :          0 :       ptr += MINBPC(enc);
    1582 [ #  # ][ #  # ]:          0 :       if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1583                 :          0 :         ptr += MINBPC(enc);
    1584 [ #  # ][ #  # ]:          0 :         if (CHAR_MATCHES(enc, ptr, ASCII_p))
         [ #  # ][ #  # ]
                 [ #  # ]
    1585                 :          0 :           return ASCII_AMP;
    1586                 :            :       }
    1587                 :            :     }
    1588                 :            :     break;
    1589                 :            :   case 4:
    1590      [ #  #  # ]:          0 :     switch (BYTE_TO_ASCII(enc, ptr)) {
                 [ #  # ]
              [ #  #  # ]
                 [ #  # ]
              [ #  #  # ]
    1591                 :            :     case ASCII_q:
    1592                 :          0 :       ptr += MINBPC(enc);
    1593 [ #  # ][ #  # ]:          0 :       if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1594                 :          0 :         ptr += MINBPC(enc);
    1595 [ #  # ][ #  # ]:          0 :         if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1596                 :          0 :           ptr += MINBPC(enc);
    1597 [ #  # ][ #  # ]:          0 :           if (CHAR_MATCHES(enc, ptr, ASCII_t))
         [ #  # ][ #  # ]
                 [ #  # ]
    1598                 :          0 :             return ASCII_QUOT;
    1599                 :            :         }
    1600                 :            :       }
    1601                 :            :       break;
    1602                 :            :     case ASCII_a:
    1603                 :          0 :       ptr += MINBPC(enc);
    1604 [ #  # ][ #  # ]:          0 :       if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1605                 :          0 :         ptr += MINBPC(enc);
    1606 [ #  # ][ #  # ]:          0 :         if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1607                 :          0 :           ptr += MINBPC(enc);
    1608 [ #  # ][ #  # ]:          0 :           if (CHAR_MATCHES(enc, ptr, ASCII_s))
         [ #  # ][ #  # ]
                 [ #  # ]
    1609                 :          0 :             return ASCII_APOS;
    1610                 :            :         }
    1611                 :            :       }
    1612                 :            :       break;
    1613                 :            :     }
    1614                 :            :   }
    1615                 :          0 :   return 0;
    1616                 :            : }
    1617                 :            : 
    1618                 :            : static int PTRCALL
    1619                 :            : PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2)
    1620                 :          0 : {
    1621                 :            :   for (;;) {
    1622   [ #  #  #  #  :          0 :     switch (BYTE_TYPE(enc, ptr1)) {
              # ][ #  # ]
           [ #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
                      # ]
    1623                 :            : #define LEAD_CASE(n) \
    1624                 :            :     case BT_LEAD ## n: \
    1625                 :            :       if (*ptr1++ != *ptr2++) \
    1626                 :            :         return 0;
    1627 [ #  # ][ #  # ]:          0 :     LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    1628                 :            : #undef LEAD_CASE
    1629                 :            :       /* fall through */
    1630 [ #  # ][ #  # ]:          0 :       if (*ptr1++ != *ptr2++)
                 [ #  # ]
    1631                 :          0 :         return 0;
    1632                 :            :       break;
    1633                 :            :     case BT_NONASCII:
    1634                 :            :     case BT_NMSTRT:
    1635                 :            : #ifdef XML_NS
    1636                 :            :     case BT_COLON:
    1637                 :            : #endif
    1638                 :            :     case BT_HEX:
    1639                 :            :     case BT_DIGIT:
    1640                 :            :     case BT_NAME:
    1641                 :            :     case BT_MINUS:
    1642 [ #  # ][ #  # ]:          0 :       if (*ptr2++ != *ptr1++)
                 [ #  # ]
    1643                 :          0 :         return 0;
    1644                 :            :       if (MINBPC(enc) > 1) {
    1645 [ #  # ][ #  # ]:          0 :         if (*ptr2++ != *ptr1++)
    1646                 :          0 :           return 0;
    1647                 :            :         if (MINBPC(enc) > 2) {
    1648                 :            :           if (*ptr2++ != *ptr1++)
    1649                 :            :             return 0;
    1650                 :            :           if (MINBPC(enc) > 3) {
    1651                 :            :             if (*ptr2++ != *ptr1++)
    1652                 :            :               return 0;
    1653                 :            :           }
    1654                 :            :         }
    1655                 :            :       }
    1656                 :            :       break;
    1657                 :            :     default:
    1658         [ #  # ]:          0 :       if (MINBPC(enc) == 1 && *ptr1 == *ptr2)
    1659                 :          0 :         return 1;
    1660 [ #  # ][ #  # ]:          0 :       switch (BYTE_TYPE(enc, ptr2)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1661                 :            :       case BT_LEAD2:
    1662                 :            :       case BT_LEAD3:
    1663                 :            :       case BT_LEAD4:
    1664                 :            :       case BT_NONASCII:
    1665                 :            :       case BT_NMSTRT:
    1666                 :            : #ifdef XML_NS
    1667                 :            :       case BT_COLON:
    1668                 :            : #endif
    1669                 :            :       case BT_HEX:
    1670                 :            :       case BT_DIGIT:
    1671                 :            :       case BT_NAME:
    1672                 :            :       case BT_MINUS:
    1673                 :          0 :         return 0;
    1674                 :            :       default:
    1675                 :          0 :         return 1;
    1676                 :            :       }
    1677                 :            :     }
    1678                 :            :   }
    1679                 :            :   /* not reached */
    1680                 :            : }
    1681                 :            : 
    1682                 :            : static int PTRCALL
    1683                 :            : PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1,
    1684                 :            :                          const char *end1, const char *ptr2)
    1685                 :         32 : {
    1686 [ +  + ][ #  # ]:        257 :   for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
                 [ #  # ]
    1687 [ -  + ][ #  # ]:        225 :     if (ptr1 == end1)
                 [ #  # ]
    1688                 :          0 :       return 0;
    1689 [ -  + ][ #  # ]:        225 :     if (!CHAR_MATCHES(enc, ptr1, *ptr2))
         [ #  # ][ #  # ]
                 [ #  # ]
    1690                 :          0 :       return 0;
    1691                 :            :   }
    1692                 :         32 :   return ptr1 == end1;
    1693                 :            : }
    1694                 :            : 
    1695                 :            : static int PTRFASTCALL
    1696                 :            : PREFIX(nameLength)(const ENCODING *enc, const char *ptr)
    1697                 :       2325 : {
    1698                 :       2325 :   const char *start = ptr;
    1699                 :            :   for (;;) {
    1700   [ -  -  -  +  :      15006 :     switch (BYTE_TYPE(enc, ptr)) {
              + ][ #  # ]
           [ #  #  #  #  
              # ][ #  # ]
           [ #  #  #  #  
                      # ]
    1701                 :            : #define LEAD_CASE(n) \
    1702                 :            :     case BT_LEAD ## n: ptr += n; break;
    1703                 :          0 :     LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
    1704                 :            : #undef LEAD_CASE
    1705                 :            :     case BT_NONASCII:
    1706                 :            :     case BT_NMSTRT:
    1707                 :            : #ifdef XML_NS
    1708                 :            :     case BT_COLON:
    1709                 :            : #endif
    1710                 :            :     case BT_HEX:
    1711                 :            :     case BT_DIGIT:
    1712                 :            :     case BT_NAME:
    1713                 :            :     case BT_MINUS:
    1714                 :      12681 :       ptr += MINBPC(enc);
    1715                 :      12681 :       break;
    1716                 :            :     default:
    1717                 :       2325 :       return ptr - start;
    1718                 :            :     }
    1719                 :            :   }
    1720                 :            : }
    1721                 :            : 
    1722                 :            : static const char * PTRFASTCALL
    1723                 :            : PREFIX(skipS)(const ENCODING *enc, const char *ptr)
    1724                 :          4 : {
    1725                 :            :   for (;;) {
    1726 [ +  + ][ #  # ]:          4 :     switch (BYTE_TYPE(enc, ptr)) {
         [ #  # ][ #  # ]
                 [ #  # ]
    1727                 :            :     case BT_LF:
    1728                 :            :     case BT_CR:
    1729                 :            :     case BT_S:
    1730                 :          2 :       ptr += MINBPC(enc);
    1731                 :            :       break;
    1732                 :            :     default:
    1733                 :          2 :       return ptr;
    1734                 :            :     }
    1735                 :          2 :   }
    1736                 :            : }
    1737                 :            : 
    1738                 :            : static void PTRCALL
    1739                 :            : PREFIX(updatePosition)(const ENCODING *enc,
    1740                 :            :                        const char *ptr,
    1741                 :            :                        const char *end,
    1742                 :            :                        POSITION *pos)
    1743                 :         32 : {
    1744 [ +  + ][ #  # ]:      76884 :   while (ptr != end) {
                 [ #  # ]
    1745   [ -  -  -  +  :      76852 :     switch (BYTE_TYPE(enc, ptr)) {
           -  + ][ #  # ]
           [ #  #  #  #  
           #  # ][ #  # ]
           [ #  #  #  #  
                   #  # ]
    1746                 :            : #define LEAD_CASE(n) \
    1747                 :            :     case BT_LEAD ## n: \
    1748                 :            :       ptr += n; \
    1749                 :            :       break;
    1750                 :          0 :     LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
    1751                 :            : #undef LEAD_CASE
    1752                 :            :     case BT_LF:
    1753                 :       2065 :       pos->columnNumber = (unsigned)-1;
    1754                 :       2065 :       pos->lineNumber++;
    1755                 :       2065 :       ptr += MINBPC(enc);
    1756                 :       2065 :       break;
    1757                 :            :     case BT_CR:
    1758                 :          0 :       pos->lineNumber++;
    1759                 :          0 :       ptr += MINBPC(enc);
    1760 [ #  # ][ #  # ]:          0 :       if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1761                 :          0 :         ptr += MINBPC(enc);
    1762                 :          0 :       pos->columnNumber = (unsigned)-1;
    1763                 :          0 :       break;
    1764                 :            :     default:
    1765                 :      74787 :       ptr += MINBPC(enc);
    1766                 :            :       break;
    1767                 :            :     }
    1768                 :      76852 :     pos->columnNumber++;
    1769                 :            :   }
    1770                 :         32 : }
    1771                 :            : 
    1772                 :            : #undef DO_LEAD_CASE
    1773                 :            : #undef MULTIBYTE_CASES
    1774                 :            : #undef INVALID_CASES
    1775                 :            : #undef CHECK_NAME_CASE
    1776                 :            : #undef CHECK_NAME_CASES
    1777                 :            : #undef CHECK_NMSTRT_CASE
    1778                 :            : #undef CHECK_NMSTRT_CASES
    1779                 :            : 

Generated by: LCOV version 1.9