11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   See the file COPYING for copying permission.
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* This file is included! */
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_TOK_IMPL_C
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef IS_INVALID_CHAR
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define IS_INVALID_CHAR(enc, ptr, n) (0)
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LEAD ## n: \
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (end - ptr < n) \
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PARTIAL_CHAR; \
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (IS_INVALID_CHAR(enc, ptr, n)) { \
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *(nextTokPtr) = (ptr); \
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID; \
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      } \
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += n; \
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INVALID_CASES(ptr, nextTokPtr) \
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  INVALID_LEAD_CASE(2, ptr, nextTokPtr) \
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  INVALID_LEAD_CASE(3, ptr, nextTokPtr) \
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  INVALID_LEAD_CASE(4, ptr, nextTokPtr) \
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_NONXML: \
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_MALFORM: \
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_TRAIL: \
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *(nextTokPtr) = (ptr); \
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_INVALID;
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   case BT_LEAD ## n: \
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     if (end - ptr < n) \
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       return XML_TOK_PARTIAL_CHAR; \
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     if (!IS_NAME_CHAR(enc, ptr, n)) { \
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       *nextTokPtr = ptr; \
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       return XML_TOK_INVALID; \
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     } \
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     ptr += n; \
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     break;
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_NONASCII: \
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr; \
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID; \
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    } \
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_NMSTRT: \
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_HEX: \
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_DIGIT: \
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_NAME: \
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_MINUS: \
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc); \
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break; \
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   case BT_LEAD ## n: \
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     if (end - ptr < n) \
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       return XML_TOK_PARTIAL_CHAR; \
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       *nextTokPtr = ptr; \
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       return XML_TOK_INVALID; \
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     } \
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     ptr += n; \
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     break;
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_NONASCII: \
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr; \
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID; \
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    } \
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_NMSTRT: \
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_HEX: \
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc); \
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break; \
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr)
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef PREFIX
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define PREFIX(ident) ident
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* ptr points to character following "<!-" */
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(scanComment)(const ENCODING *enc, const char *ptr,
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const char *end, const char **nextTokPtr)
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr != end) {
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc);
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    while (ptr != end) {
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (BYTE_TYPE(enc, ptr)) {
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      INVALID_CASES(ptr, nextTokPtr)
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_MINUS:
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if ((ptr += MINBPC(enc)) == end)
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_TOK_PARTIAL;
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if ((ptr += MINBPC(enc)) == end)
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_TOK_PARTIAL;
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            *nextTokPtr = ptr;
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_TOK_INVALID;
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *nextTokPtr = ptr + MINBPC(enc);
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_TOK_COMMENT;
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ptr += MINBPC(enc);
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_PARTIAL;
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* ptr points to character following "<!" */
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(scanDecl)(const ENCODING *enc, const char *ptr,
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 const char *end, const char **nextTokPtr)
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr == end)
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_PARTIAL;
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (BYTE_TYPE(enc, ptr)) {
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_MINUS:
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_LSQB:
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr + MINBPC(enc);
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_COND_SECT_OPEN;
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_NMSTRT:
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_HEX:
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc);
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_INVALID;
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_PERCNT:
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr + MINBPC(enc) == end)
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PARTIAL;
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* don't allow <!ENTITY% foo "whatever"> */
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_S: case BT_CR: case BT_LF: case BT_PERCNT:
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID;
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* fall through */
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_S: case BT_CR: case BT_LF:
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_DECL_OPEN;
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_NMSTRT:
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_HEX:
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_PARTIAL;
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr,
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      const char *end, int *tokPtr)
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int upper = 0;
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *tokPtr = XML_TOK_PI;
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (end - ptr != MINBPC(enc)*3)
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 1;
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (BYTE_TO_ASCII(enc, ptr)) {
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case ASCII_x:
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case ASCII_X:
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    upper = 1;
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 1;
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ptr += MINBPC(enc);
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (BYTE_TO_ASCII(enc, ptr)) {
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case ASCII_m:
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case ASCII_M:
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    upper = 1;
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 1;
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ptr += MINBPC(enc);
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (BYTE_TO_ASCII(enc, ptr)) {
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case ASCII_l:
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case ASCII_L:
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    upper = 1;
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 1;
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (upper)
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 0;
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *tokPtr = XML_TOK_XML_DECL;
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return 1;
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* ptr points to character following "<?" */
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(scanPi)(const ENCODING *enc, const char *ptr,
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char *end, const char **nextTokPtr)
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int tok;
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *target = ptr;
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr == end)
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_PARTIAL;
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (BYTE_TYPE(enc, ptr)) {
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_INVALID;
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_S: case BT_CR: case BT_LF:
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID;
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      while (ptr != end) {
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        switch (BYTE_TYPE(enc, ptr)) {
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        INVALID_CASES(ptr, nextTokPtr)
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        case BT_QUEST:
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ptr += MINBPC(enc);
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (ptr == end)
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_TOK_PARTIAL;
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            *nextTokPtr = ptr + MINBPC(enc);
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return tok;
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        default:
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ptr += MINBPC(enc);
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_PARTIAL;
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_QUEST:
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID;
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == end)
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PARTIAL;
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr + MINBPC(enc);
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return tok;
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* fall through */
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_PARTIAL;
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr,
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         const char *end, const char **nextTokPtr)
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const char CDATA_LSQB[] = { ASCII_C, ASCII_D, ASCII_A,
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     ASCII_T, ASCII_A, ASCII_LSQB };
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int i;
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* CDATA[ */
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (end - ptr < 6 * MINBPC(enc))
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_PARTIAL;
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *nextTokPtr = ptr;
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_CDATA_SECT_OPEN;
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr,
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        const char *end, const char **nextTokPtr)
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr == end)
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_NONE;
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (MINBPC(enc) > 1) {
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    size_t n = end - ptr;
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (n & (MINBPC(enc) - 1)) {
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      n &= ~(MINBPC(enc) - 1);
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (n == 0)
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PARTIAL;
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      end = ptr + n;
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (BYTE_TYPE(enc, ptr)) {
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_RSQB:
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc);
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ptr == end)
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_PARTIAL;
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB))
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc);
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ptr == end)
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_PARTIAL;
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr -= MINBPC(enc);
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr + MINBPC(enc);
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_CDATA_SECT_CLOSE;
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_CR:
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc);
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ptr == end)
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_PARTIAL;
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (BYTE_TYPE(enc, ptr) == BT_LF)
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_DATA_NEWLINE;
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_LF:
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr + MINBPC(enc);
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_DATA_NEWLINE;
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  INVALID_CASES(ptr, nextTokPtr)
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc);
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define LEAD_CASE(n) \
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LEAD ## n: \
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr; \
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_DATA_CHARS; \
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      } \
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += n; \
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef LEAD_CASE
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_NONXML:
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_MALFORM:
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_TRAIL:
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_CR:
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LF:
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_RSQB:
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_DATA_CHARS;
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *nextTokPtr = ptr;
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_DATA_CHARS;
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* ptr points to character following "</" */
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(scanEndTag)(const ENCODING *enc, const char *ptr,
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   const char *end, const char **nextTokPtr)
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr == end)
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_PARTIAL;
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (BYTE_TYPE(enc, ptr)) {
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_INVALID;
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_S: case BT_CR: case BT_LF:
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        switch (BYTE_TYPE(enc, ptr)) {
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        case BT_S: case BT_CR: case BT_LF:
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        case BT_GT:
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *nextTokPtr = ptr + MINBPC(enc);
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_TOK_END_TAG;
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        default:
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *nextTokPtr = ptr;
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_TOK_INVALID;
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_PARTIAL;
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_COLON:
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* no need to check qname syntax here,
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         since end-tag must match exactly */
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_GT:
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr + MINBPC(enc);
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_END_TAG;
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_PARTIAL;
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* ptr points to character following "&#X" */
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr,
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const char *end, const char **nextTokPtr)
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr != end) {
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_DIGIT:
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_HEX:
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (BYTE_TYPE(enc, ptr)) {
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_DIGIT:
4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_HEX:
4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_SEMI:
4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr + MINBPC(enc);
4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_CHAR_REF;
4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID;
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_PARTIAL;
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* ptr points to character following "&#" */
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(scanCharRef)(const ENCODING *enc, const char *ptr,
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const char *end, const char **nextTokPtr)
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr != end) {
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (CHAR_MATCHES(enc, ptr, ASCII_x))
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_DIGIT:
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (BYTE_TYPE(enc, ptr)) {
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_DIGIT:
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_SEMI:
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr + MINBPC(enc);
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_CHAR_REF;
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID;
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_PARTIAL;
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* ptr points to character following "&" */
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end,
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char **nextTokPtr)
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr == end)
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_PARTIAL;
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (BYTE_TYPE(enc, ptr)) {
5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_NUM:
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_INVALID;
5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_SEMI:
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr + MINBPC(enc);
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_ENTITY_REF;
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_PARTIAL;
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* ptr points to character following first character of attribute name */
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end,
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 const char **nextTokPtr)
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int hadColon = 0;
5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS
5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_COLON:
5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (hadColon) {
5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID;
5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      hadColon = 1;
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == end)
5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PARTIAL;
5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (BYTE_TYPE(enc, ptr)) {
5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID;
5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_S: case BT_CR: case BT_LF:
5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      for (;;) {
5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int t;
5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ptr += MINBPC(enc);
5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (ptr == end)
5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_TOK_PARTIAL;
5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        t = BYTE_TYPE(enc, ptr);
5611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (t == BT_EQUALS)
5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        switch (t) {
5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        case BT_S:
5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        case BT_LF:
5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        case BT_CR:
5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        default:
5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *nextTokPtr = ptr;
5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_TOK_INVALID;
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* fall through */
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_EQUALS:
5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int open;
5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS
5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        hadColon = 0;
5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        for (;;) {
5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ptr += MINBPC(enc);
5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (ptr == end)
5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_TOK_PARTIAL;
5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          open = BYTE_TYPE(enc, ptr);
5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (open == BT_QUOT || open == BT_APOS)
5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            break;
5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          switch (open) {
5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          case BT_S:
5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          case BT_LF:
5901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          case BT_CR:
5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            break;
5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          default:
5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            *nextTokPtr = ptr;
5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_TOK_INVALID;
5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ptr += MINBPC(enc);
5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* in attribute value */
5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        for (;;) {
6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          int t;
6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (ptr == end)
6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_TOK_PARTIAL;
6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          t = BYTE_TYPE(enc, ptr);
6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (t == open)
6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            break;
6061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          switch (t) {
6071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          INVALID_CASES(ptr, nextTokPtr)
6081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          case BT_AMP:
6091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            {
6101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              if (tok <= 0) {
6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                if (tok == XML_TOK_INVALID)
6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  *nextTokPtr = ptr;
6141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                return tok;
6151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              }
6161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              break;
6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
6181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          case BT_LT:
6191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            *nextTokPtr = ptr;
6201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_TOK_INVALID;
6211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          default:
6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ptr += MINBPC(enc);
6231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            break;
6241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
6251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
6261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ptr += MINBPC(enc);
6271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (ptr == end)
6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_TOK_PARTIAL;
6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        switch (BYTE_TYPE(enc, ptr)) {
6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        case BT_S:
6311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        case BT_CR:
6321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        case BT_LF:
6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
6341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        case BT_SOL:
6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          goto sol;
6361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        case BT_GT:
6371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          goto gt;
6381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        default:
6391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *nextTokPtr = ptr;
6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_TOK_INVALID;
6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* ptr points to closing quote */
6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        for (;;) {
6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ptr += MINBPC(enc);
6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (ptr == end)
6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_TOK_PARTIAL;
6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          switch (BYTE_TYPE(enc, ptr)) {
6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          case BT_S: case BT_CR: case BT_LF:
6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            continue;
6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          case BT_GT:
6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          gt:
6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            *nextTokPtr = ptr + MINBPC(enc);
6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_TOK_START_TAG_WITH_ATTS;
6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          case BT_SOL:
6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          sol:
6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ptr += MINBPC(enc);
6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (ptr == end)
6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              return XML_TOK_PARTIAL;
6601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              *nextTokPtr = ptr;
6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              return XML_TOK_INVALID;
6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            *nextTokPtr = ptr + MINBPC(enc);
6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          default:
6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            *nextTokPtr = ptr;
6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_TOK_INVALID;
6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_PARTIAL;
6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* ptr points to character following "<" */
6831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end,
6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const char **nextTokPtr)
6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS
6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int hadColon;
6901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr == end)
6921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_PARTIAL;
6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (BYTE_TYPE(enc, ptr)) {
6941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
6951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_EXCL:
6961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if ((ptr += MINBPC(enc)) == end)
6971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_PARTIAL;
6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_MINUS:
7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
7011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LSQB:
7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc),
7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      end, nextTokPtr);
7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
7051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
7061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_INVALID;
7071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_QUEST:
7081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
7091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_SOL:
7101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
7111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
7121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
7131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_INVALID;
7141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS
7161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hadColon = 0;
7171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
7181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* we have a start-tag */
7191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
7201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
7211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
7221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS
7231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_COLON:
7241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (hadColon) {
7251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
7261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID;
7271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
7281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      hadColon = 1;
7291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == end)
7311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PARTIAL;
7321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (BYTE_TYPE(enc, ptr)) {
7331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
7341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
7351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID;
7371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
7381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
7391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
7401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_S: case BT_CR: case BT_LF:
7411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ptr += MINBPC(enc);
7431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        while (ptr != end) {
7441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          switch (BYTE_TYPE(enc, ptr)) {
7451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
7461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          case BT_GT:
7471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            goto gt;
7481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          case BT_SOL:
7491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            goto sol;
7501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          case BT_S: case BT_CR: case BT_LF:
7511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ptr += MINBPC(enc);
7521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            continue;
7531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          default:
7541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            *nextTokPtr = ptr;
7551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_TOK_INVALID;
7561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
7571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
7581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
7591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PARTIAL;
7601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
7611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_GT:
7621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gt:
7631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr + MINBPC(enc);
7641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_START_TAG_NO_ATTS;
7651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_SOL:
7661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sol:
7671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
7681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == end)
7691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PARTIAL;
7701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
7711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
7721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID;
7731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
7741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr + MINBPC(enc);
7751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
7761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
7771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
7781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
7791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
7801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_PARTIAL;
7821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
7831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
7851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
7861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   const char **nextTokPtr)
7871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
7881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr == end)
7891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_NONE;
7901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (MINBPC(enc) > 1) {
7911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    size_t n = end - ptr;
7921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (n & (MINBPC(enc) - 1)) {
7931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      n &= ~(MINBPC(enc) - 1);
7941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (n == 0)
7951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PARTIAL;
7961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      end = ptr + n;
7971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
7981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (BYTE_TYPE(enc, ptr)) {
8001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_LT:
8011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
8021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_AMP:
8031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
8041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_CR:
8051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc);
8061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ptr == end)
8071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_TRAILING_CR;
8081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (BYTE_TYPE(enc, ptr) == BT_LF)
8091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
8101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
8111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_DATA_NEWLINE;
8121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_LF:
8131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr + MINBPC(enc);
8141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_DATA_NEWLINE;
8151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_RSQB:
8161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc);
8171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ptr == end)
8181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_TRAILING_RSQB;
8191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB))
8201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc);
8221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ptr == end)
8231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_TRAILING_RSQB;
8241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
8251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr -= MINBPC(enc);
8261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
8271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
8281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
8291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_INVALID;
8301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  INVALID_CASES(ptr, nextTokPtr)
8311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
8321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc);
8331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
8341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
8351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
8361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
8371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define LEAD_CASE(n) \
8381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LEAD ## n: \
8391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \
8401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr; \
8411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_DATA_CHARS; \
8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      } \
8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += n; \
8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef LEAD_CASE
8471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_RSQB:
8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr + MINBPC(enc) != end) {
8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           ptr += MINBPC(enc);
8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           break;
8521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         }
8531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         if (ptr + 2*MINBPC(enc) != end) {
8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) {
8551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             ptr += MINBPC(enc);
8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             break;
8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           }
8581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           *nextTokPtr = ptr + 2*MINBPC(enc);
8591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           return XML_TOK_INVALID;
8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         }
8611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
8621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* fall through */
8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_AMP:
8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LT:
8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_NONXML:
8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_MALFORM:
8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_TRAIL:
8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_CR:
8691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LF:
8701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
8711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_DATA_CHARS;
8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
8731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
8751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
8761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *nextTokPtr = ptr;
8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_DATA_CHARS;
8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
8801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* ptr points to character following "%" */
8821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
8841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,
8851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const char **nextTokPtr)
8861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
8871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr == end)
8881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_PARTIAL;
8891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (BYTE_TYPE(enc, ptr)) {
8901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
8911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_S: case BT_LF: case BT_CR: case BT_PERCNT:
8921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
8931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_PERCENT;
8941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
8951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
8961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_INVALID;
8971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
8981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
8991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
9001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
9011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_SEMI:
9021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr + MINBPC(enc);
9031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_PARAM_ENTITY_REF;
9041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
9051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
9061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
9071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
9081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
9091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_PARTIAL;
9101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
9111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
9131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
9141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      const char **nextTokPtr)
9151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
9161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr == end)
9171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_PARTIAL;
9181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (BYTE_TYPE(enc, ptr)) {
9191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
9201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
9211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
9221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_INVALID;
9231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
9241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
9251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
9261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
9271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_CR: case BT_LF: case BT_S:
9281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR:
9291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
9301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_POUND_NAME;
9311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
9321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
9331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
9341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
9351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
9361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return -XML_TOK_POUND_NAME;
9371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
9381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
9401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(scanLit)(int open, const ENCODING *enc,
9411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char *ptr, const char *end,
9421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const char **nextTokPtr)
9431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
9441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
9451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int t = BYTE_TYPE(enc, ptr);
9461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (t) {
9471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    INVALID_CASES(ptr, nextTokPtr)
9481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_QUOT:
9491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_APOS:
9501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
9511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (t != open)
9521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
9531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == end)
9541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return -XML_TOK_LITERAL;
9551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
9561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (BYTE_TYPE(enc, ptr)) {
9571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_S: case BT_CR: case BT_LF:
9581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_GT: case BT_PERCNT: case BT_LSQB:
9591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_LITERAL;
9601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
9611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID;
9621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
9631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
9641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
9651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
9661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
9671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
9681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_PARTIAL;
9691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
9701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
9721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
9731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  const char **nextTokPtr)
9741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
9751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int tok;
9761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr == end)
9771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_NONE;
9781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (MINBPC(enc) > 1) {
9791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    size_t n = end - ptr;
9801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (n & (MINBPC(enc) - 1)) {
9811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      n &= ~(MINBPC(enc) - 1);
9821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (n == 0)
9831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PARTIAL;
9841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      end = ptr + n;
9851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
9861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
9871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (BYTE_TYPE(enc, ptr)) {
9881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_QUOT:
9891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
9901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_APOS:
9911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
9921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_LT:
9931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
9941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
9951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == end)
9961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PARTIAL;
9971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (BYTE_TYPE(enc, ptr)) {
9981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_EXCL:
9991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
10001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_QUEST:
10011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
10021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_NMSTRT:
10031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_HEX:
10041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_NONASCII:
10051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_LEAD2:
10061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_LEAD3:
10071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_LEAD4:
10081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr - MINBPC(enc);
10091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INSTANCE_START;
10101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
10111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
10121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
10131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
10141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_CR:
10151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ptr + MINBPC(enc) == end) {
10161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = end;
10171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* indicate that this might be part of a CR/LF pair */
10181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return -XML_TOK_PROLOG_S;
10191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
10201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* fall through */
10211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_S: case BT_LF:
10221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (;;) {
10231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
10241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == end)
10251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
10261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (BYTE_TYPE(enc, ptr)) {
10271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_S: case BT_LF:
10281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
10291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_CR:
10301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* don't split CR/LF pair */
10311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (ptr + MINBPC(enc) != end)
10321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
10331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /* fall through */
10341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
10351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
10361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PROLOG_S;
10371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
10381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
10391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
10401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_PROLOG_S;
10411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_PERCNT:
10421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
10431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_COMMA:
10441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr + MINBPC(enc);
10451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_COMMA;
10461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_LSQB:
10471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr + MINBPC(enc);
10481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_OPEN_BRACKET;
10491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_RSQB:
10501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc);
10511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ptr == end)
10521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return -XML_TOK_CLOSE_BRACKET;
10531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
10541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr + MINBPC(enc) == end)
10551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PARTIAL;
10561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
10571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr + 2*MINBPC(enc);
10581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_COND_SECT_CLOSE;
10591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
10601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
10611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
10621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_CLOSE_BRACKET;
10631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_LPAR:
10641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr + MINBPC(enc);
10651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_OPEN_PAREN;
10661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_RPAR:
10671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc);
10681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ptr == end)
10691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return -XML_TOK_CLOSE_PAREN;
10701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
10711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_AST:
10721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr + MINBPC(enc);
10731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_CLOSE_PAREN_ASTERISK;
10741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_QUEST:
10751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr + MINBPC(enc);
10761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_CLOSE_PAREN_QUESTION;
10771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_PLUS:
10781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr + MINBPC(enc);
10791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_CLOSE_PAREN_PLUS;
10801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_CR: case BT_LF: case BT_S:
10811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_GT: case BT_COMMA: case BT_VERBAR:
10821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_RPAR:
10831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
10841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_CLOSE_PAREN;
10851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
10861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
10871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_INVALID;
10881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_VERBAR:
10891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr + MINBPC(enc);
10901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_OR;
10911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_GT:
10921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr + MINBPC(enc);
10931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_DECL_CLOSE;
10941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_NUM:
10951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
10961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define LEAD_CASE(n) \
10971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_LEAD ## n: \
10981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (end - ptr < n) \
10991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_PARTIAL_CHAR; \
11001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (IS_NMSTRT_CHAR(enc, ptr, n)) { \
11011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += n; \
11021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      tok = XML_TOK_NAME; \
11031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break; \
11041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    } \
11051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (IS_NAME_CHAR(enc, ptr, n)) { \
11061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += n; \
11071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      tok = XML_TOK_NMTOKEN; \
11081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break; \
11091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    } \
11101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr; \
11111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_INVALID;
11121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
11131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef LEAD_CASE
11141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_NMSTRT:
11151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_HEX:
11161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tok = XML_TOK_NAME;
11171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc);
11181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
11191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_DIGIT:
11201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_NAME:
11211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_MINUS:
11221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS
11231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_COLON:
11241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
11251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tok = XML_TOK_NMTOKEN;
11261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ptr += MINBPC(enc);
11271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
11281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case BT_NONASCII:
11291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
11301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
11311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      tok = XML_TOK_NAME;
11321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
11331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
11341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
11351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
11361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      tok = XML_TOK_NMTOKEN;
11371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
11381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
11391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /* fall through */
11401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  default:
11411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *nextTokPtr = ptr;
11421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_INVALID;
11431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
11441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
11451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
11461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
11471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_GT: case BT_RPAR: case BT_COMMA:
11481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_VERBAR: case BT_LSQB: case BT_PERCNT:
11491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_S: case BT_CR: case BT_LF:
11501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
11511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return tok;
11521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS
11531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_COLON:
11541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
11551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (tok) {
11561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_NAME:
11571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (ptr == end)
11581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_TOK_PARTIAL;
11591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tok = XML_TOK_PREFIXED_NAME;
11601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        switch (BYTE_TYPE(enc, ptr)) {
11611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
11621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        default:
11631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          tok = XML_TOK_NMTOKEN;
11641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          break;
11651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
11661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
11671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case XML_TOK_PREFIXED_NAME:
11681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tok = XML_TOK_NMTOKEN;
11691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
11701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
11711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
11721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
11731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_PLUS:
11741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (tok == XML_TOK_NMTOKEN)  {
11751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
11761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID;
11771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
11781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr + MINBPC(enc);
11791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_NAME_PLUS;
11801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_AST:
11811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (tok == XML_TOK_NMTOKEN)  {
11821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
11831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID;
11841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
11851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr + MINBPC(enc);
11861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_NAME_ASTERISK;
11871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_QUEST:
11881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (tok == XML_TOK_NMTOKEN)  {
11891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
11901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_INVALID;
11911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
11921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr + MINBPC(enc);
11931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_NAME_QUESTION;
11941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
11951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
11961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
11971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
11981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
11991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return -tok;
12001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
12031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr,
12041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          const char *end, const char **nextTokPtr)
12051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
12061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *start;
12071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr == end)
12081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_NONE;
12091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  start = ptr;
12101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
12111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
12121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define LEAD_CASE(n) \
12131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LEAD ## n: ptr += n; break;
12141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
12151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef LEAD_CASE
12161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_AMP:
12171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == start)
12181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
12191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
12201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_DATA_CHARS;
12211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LT:
12221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* this is for inside entity references */
12231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
12241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_INVALID;
12251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LF:
12261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == start) {
12271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr + MINBPC(enc);
12281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_DATA_NEWLINE;
12291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
12301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
12311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_DATA_CHARS;
12321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_CR:
12331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == start) {
12341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ptr += MINBPC(enc);
12351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (ptr == end)
12361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_TOK_TRAILING_CR;
12371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (BYTE_TYPE(enc, ptr) == BT_LF)
12381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ptr += MINBPC(enc);
12391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
12401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_DATA_NEWLINE;
12411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
12421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
12431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_DATA_CHARS;
12441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_S:
12451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == start) {
12461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr + MINBPC(enc);
12471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_ATTRIBUTE_VALUE_S;
12481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
12491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
12501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_DATA_CHARS;
12511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
12521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
12531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
12541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
12551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
12561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *nextTokPtr = ptr;
12571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_DATA_CHARS;
12581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
12591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
12611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(entityValueTok)(const ENCODING *enc, const char *ptr,
12621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const char *end, const char **nextTokPtr)
12631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
12641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *start;
12651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ptr == end)
12661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return XML_TOK_NONE;
12671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  start = ptr;
12681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
12691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
12701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define LEAD_CASE(n) \
12711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LEAD ## n: ptr += n; break;
12721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
12731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef LEAD_CASE
12741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_AMP:
12751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == start)
12761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
12771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
12781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_DATA_CHARS;
12791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_PERCNT:
12801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == start) {
12811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int tok =  PREFIX(scanPercent)(enc, ptr + MINBPC(enc),
12821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       end, nextTokPtr);
12831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
12841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
12851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
12861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_DATA_CHARS;
12871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LF:
12881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == start) {
12891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr + MINBPC(enc);
12901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_DATA_NEWLINE;
12911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
12921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
12931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_DATA_CHARS;
12941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_CR:
12951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr == start) {
12961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ptr += MINBPC(enc);
12971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (ptr == end)
12981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_TOK_TRAILING_CR;
12991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (BYTE_TYPE(enc, ptr) == BT_LF)
13001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ptr += MINBPC(enc);
13011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *nextTokPtr = ptr;
13021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_DATA_NEWLINE;
13031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
13041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *nextTokPtr = ptr;
13051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return XML_TOK_DATA_CHARS;
13061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
13071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
13081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
13091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
13101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
13111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *nextTokPtr = ptr;
13121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_DATA_CHARS;
13131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD
13161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
13181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr,
13191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         const char *end, const char **nextTokPtr)
13201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
13211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int level = 0;
13221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (MINBPC(enc) > 1) {
13231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    size_t n = end - ptr;
13241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (n & (MINBPC(enc) - 1)) {
13251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      n &= ~(MINBPC(enc) - 1);
13261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      end = ptr + n;
13271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
13281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
13291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr != end) {
13301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
13311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    INVALID_CASES(ptr, nextTokPtr)
13321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LT:
13331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if ((ptr += MINBPC(enc)) == end)
13341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PARTIAL;
13351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
13361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if ((ptr += MINBPC(enc)) == end)
13371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_TOK_PARTIAL;
13381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
13391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ++level;
13401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ptr += MINBPC(enc);
13411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
13421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
13431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
13441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_RSQB:
13451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if ((ptr += MINBPC(enc)) == end)
13461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return XML_TOK_PARTIAL;
13471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
13481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if ((ptr += MINBPC(enc)) == end)
13491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return XML_TOK_PARTIAL;
13501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
13511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ptr += MINBPC(enc);
13521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (level == 0) {
13531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            *nextTokPtr = ptr;
13541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return XML_TOK_IGNORE_SECT;
13551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
13561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          --level;
13571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
13581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
13591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
13601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
13611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
13621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
13631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
13641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
13651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return XML_TOK_PARTIAL;
13661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */
13691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
13711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
13721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   const char **badPtr)
13731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
13741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ptr += MINBPC(enc);
13751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  end -= MINBPC(enc);
13761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (; ptr != end; ptr += MINBPC(enc)) {
13771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
13781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_DIGIT:
13791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_HEX:
13801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_MINUS:
13811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_APOS:
13821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LPAR:
13831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_RPAR:
13841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_PLUS:
13851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_COMMA:
13861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_SOL:
13871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_EQUALS:
13881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_QUEST:
13891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_CR:
13901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LF:
13911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_SEMI:
13921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_EXCL:
13931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_AST:
13941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_PERCNT:
13951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_NUM:
13961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS
13971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_COLON:
13981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
13991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
14001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_S:
14011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
14021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *badPtr = ptr;
14031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
14041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
14051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
14061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_NAME:
14071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_NMSTRT:
14081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f))
14091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
14101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
14111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (BYTE_TO_ASCII(enc, ptr)) {
14121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case 0x24: /* $ */
14131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case 0x40: /* @ */
14141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
14151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
14161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *badPtr = ptr;
14171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
14181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
14191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
14201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
14211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
14221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return 1;
14231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* This must only be called for a well-formed start-tag or empty
14261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   element tag.  Returns the number of attributes.  Pointers to the
14271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   first attsMax attributes are stored in atts.
14281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/
14291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
14311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(getAtts)(const ENCODING *enc, const char *ptr,
14321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                int attsMax, ATTRIBUTE *atts)
14331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
14341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum { other, inName, inValue } state = inName;
14351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int nAtts = 0;
14361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int open = 0; /* defined when state == inValue;
14371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   initialization just to shut up compilers */
14381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
14401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
14411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define START_NAME \
14421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (state == other) { \
14431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (nAtts < attsMax) { \
14441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          atts[nAtts].name = ptr; \
14451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          atts[nAtts].normalized = 1; \
14461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        } \
14471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        state = inName; \
14481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
14491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define LEAD_CASE(n) \
14501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break;
14511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
14521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef LEAD_CASE
14531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_NONASCII:
14541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_NMSTRT:
14551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_HEX:
14561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      START_NAME
14571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
14581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef START_NAME
14591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_QUOT:
14601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (state != inValue) {
14611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (nAtts < attsMax)
14621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          atts[nAtts].valuePtr = ptr + MINBPC(enc);
14631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        state = inValue;
14641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        open = BT_QUOT;
14651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
14661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (open == BT_QUOT) {
14671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        state = other;
14681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (nAtts < attsMax)
14691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          atts[nAtts].valueEnd = ptr;
14701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nAtts++;
14711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
14721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
14731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_APOS:
14741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (state != inValue) {
14751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (nAtts < attsMax)
14761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          atts[nAtts].valuePtr = ptr + MINBPC(enc);
14771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        state = inValue;
14781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        open = BT_APOS;
14791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
14801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (open == BT_APOS) {
14811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        state = other;
14821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (nAtts < attsMax)
14831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          atts[nAtts].valueEnd = ptr;
14841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nAtts++;
14851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
14861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
14871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_AMP:
14881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (nAtts < attsMax)
14891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        atts[nAtts].normalized = 0;
14901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
14911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_S:
14921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (state == inName)
14931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        state = other;
14941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (state == inValue
14951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               && nAtts < attsMax
14961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               && atts[nAtts].normalized
14971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               && (ptr == atts[nAtts].valuePtr
14981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
14991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
15001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
15011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        atts[nAtts].normalized = 0;
15021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
15031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_CR: case BT_LF:
15041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* This case ensures that the first attribute name is counted
15051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         Apart from that we could just change state on the quote. */
15061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (state == inName)
15071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        state = other;
15081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (state == inValue && nAtts < attsMax)
15091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        atts[nAtts].normalized = 0;
15101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
15111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_GT:
15121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_SOL:
15131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (state != inValue)
15141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return nAtts;
15151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
15161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
15171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
15181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
15191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
15201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* not reached */
15211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
15221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
15231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRFASTCALL
15241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(charRefNumber)(const ENCODING *enc, const char *ptr)
15251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
15261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int result = 0;
15271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* skip &# */
15281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ptr += 2*MINBPC(enc);
15291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
15301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (ptr += MINBPC(enc);
15311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         !CHAR_MATCHES(enc, ptr, ASCII_SEMI);
15321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         ptr += MINBPC(enc)) {
15331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int c = BYTE_TO_ASCII(enc, ptr);
15341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (c) {
15351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4:
15361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9:
15371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result <<= 4;
15381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result |= (c - ASCII_0);
15391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
15401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case ASCII_A: case ASCII_B: case ASCII_C:
15411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case ASCII_D: case ASCII_E: case ASCII_F:
15421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result <<= 4;
15431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result += 10 + (c - ASCII_A);
15441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
15451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case ASCII_a: case ASCII_b: case ASCII_c:
15461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case ASCII_d: case ASCII_e: case ASCII_f:
15471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result <<= 4;
15481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result += 10 + (c - ASCII_a);
15491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
15501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
15511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (result >= 0x110000)
15521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return -1;
15531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
15541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
15551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else {
15561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
15571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int c = BYTE_TO_ASCII(enc, ptr);
15581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result *= 10;
15591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result += (c - ASCII_0);
15601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (result >= 0x110000)
15611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return -1;
15621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
15631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
15641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return checkCharRefNumber(result);
15651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
15661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
15671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
15681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr,
15691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const char *end)
15701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
15711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch ((end - ptr)/MINBPC(enc)) {
15721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case 2:
15731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
15741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (BYTE_TO_ASCII(enc, ptr)) {
15751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case ASCII_l:
15761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return ASCII_LT;
15771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case ASCII_g:
15781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return ASCII_GT;
15791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
15801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
15811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
15821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case 3:
15831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
15841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
15851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
15861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ptr += MINBPC(enc);
15871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (CHAR_MATCHES(enc, ptr, ASCII_p))
15881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return ASCII_AMP;
15891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
15901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
15911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
15921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  case 4:
15931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TO_ASCII(enc, ptr)) {
15941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ASCII_q:
15951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
15961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
15971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ptr += MINBPC(enc);
15981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
15991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ptr += MINBPC(enc);
16001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (CHAR_MATCHES(enc, ptr, ASCII_t))
16011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return ASCII_QUOT;
16021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
16031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
16041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
16051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ASCII_a:
16061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
16071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
16081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ptr += MINBPC(enc);
16091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
16101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ptr += MINBPC(enc);
16111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (CHAR_MATCHES(enc, ptr, ASCII_s))
16121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return ASCII_APOS;
16131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
16141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
16151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
16161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
16171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
16181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return 0;
16191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
16201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
16221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2)
16231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
16241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
16251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr1)) {
16261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define LEAD_CASE(n) \
16271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LEAD ## n: \
16281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (*ptr1++ != *ptr2++) \
16291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
16301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2)
16311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef LEAD_CASE
16321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      /* fall through */
16331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (*ptr1++ != *ptr2++)
16341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
16351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
16361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_NONASCII:
16371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_NMSTRT:
16381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS
16391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_COLON:
16401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
16411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_HEX:
16421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_DIGIT:
16431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_NAME:
16441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_MINUS:
16451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (*ptr2++ != *ptr1++)
16461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
16471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (MINBPC(enc) > 1) {
16481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (*ptr2++ != *ptr1++)
16491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return 0;
16501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (MINBPC(enc) > 2) {
16511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (*ptr2++ != *ptr1++)
16521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return 0;
16531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (MINBPC(enc) > 3) {
16541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (*ptr2++ != *ptr1++)
16551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              return 0;
16561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
16571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
16581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
16591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
16601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
16611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (MINBPC(enc) == 1 && *ptr1 == *ptr2)
16621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 1;
16631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switch (BYTE_TYPE(enc, ptr2)) {
16641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_LEAD2:
16651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_LEAD3:
16661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_LEAD4:
16671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_NONASCII:
16681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_NMSTRT:
16691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS
16701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_COLON:
16711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
16721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_HEX:
16731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_DIGIT:
16741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_NAME:
16751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case BT_MINUS:
16761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 0;
16771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      default:
16781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return 1;
16791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
16801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
16811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
16821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /* not reached */
16831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
16841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRCALL
16861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1,
16871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         const char *end1, const char *ptr2)
16881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
16891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
16901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ptr1 == end1)
16911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0;
16921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!CHAR_MATCHES(enc, ptr1, *ptr2))
16931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0;
16941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
16951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return ptr1 == end1;
16961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
16971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int PTRFASTCALL
16991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(nameLength)(const ENCODING *enc, const char *ptr)
17001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
17011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char *start = ptr;
17021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
17031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
17041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define LEAD_CASE(n) \
17051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LEAD ## n: ptr += n; break;
17061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
17071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef LEAD_CASE
17081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_NONASCII:
17091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_NMSTRT:
17101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS
17111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_COLON:
17121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
17131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_HEX:
17141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_DIGIT:
17151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_NAME:
17161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_MINUS:
17171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
17181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
17191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
17201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return (int)(ptr - start);
17211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
17221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
17231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
17241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
17251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const char * PTRFASTCALL
17261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(skipS)(const ENCODING *enc, const char *ptr)
17271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
17281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (;;) {
17291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
17301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LF:
17311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_CR:
17321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_S:
17331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
17341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
17351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
17361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return ptr;
17371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
17381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
17391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
17401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
17411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void PTRCALL
17421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPREFIX(updatePosition)(const ENCODING *enc,
17431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const char *ptr,
17441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const char *end,
17451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       POSITION *pos)
17461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
17471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (ptr < end) {
17481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    switch (BYTE_TYPE(enc, ptr)) {
17491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define LEAD_CASE(n) \
17501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LEAD ## n: \
17511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += n; \
17521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
17531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
17541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef LEAD_CASE
17551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_LF:
17561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pos->columnNumber = (XML_Size)-1;
17571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pos->lineNumber++;
17581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
17591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
17601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BT_CR:
17611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pos->lineNumber++;
17621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
17631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF)
17641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ptr += MINBPC(enc);
17651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pos->columnNumber = (XML_Size)-1;
17661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
17671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
17681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ptr += MINBPC(enc);
17691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
17701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
17711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pos->columnNumber++;
17721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
17731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
17741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
17751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef DO_LEAD_CASE
17761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef MULTIBYTE_CASES
17771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef INVALID_CASES
17781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef CHECK_NAME_CASE
17791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef CHECK_NAME_CASES
17801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef CHECK_NMSTRT_CASE
17811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef CHECK_NMSTRT_CASES
17821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
17831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_TOK_IMPL_C */
1784