17eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
27eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   See the file COPYING for copying permission.
37eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel*/
47eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
57eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* This file is included! */
67eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_TOK_IMPL_C
77eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
87eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifndef IS_INVALID_CHAR
97eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define IS_INVALID_CHAR(enc, ptr, n) (0)
107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \
137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LEAD ## n: \
147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (end - ptr < n) \
157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PARTIAL_CHAR; \
167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (IS_INVALID_CHAR(enc, ptr, n)) { \
177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *(nextTokPtr) = (ptr); \
187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID; \
197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      } \
207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += n; \
217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define INVALID_CASES(ptr, nextTokPtr) \
247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  INVALID_LEAD_CASE(2, ptr, nextTokPtr) \
257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  INVALID_LEAD_CASE(3, ptr, nextTokPtr) \
267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  INVALID_LEAD_CASE(4, ptr, nextTokPtr) \
277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_NONXML: \
287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_MALFORM: \
297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_TRAIL: \
307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *(nextTokPtr) = (ptr); \
317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_INVALID;
327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \
347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   case BT_LEAD ## n: \
357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     if (end - ptr < n) \
367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel       return XML_TOK_PARTIAL_CHAR; \
377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     if (!IS_NAME_CHAR(enc, ptr, n)) { \
387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel       *nextTokPtr = ptr; \
397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel       return XML_TOK_INVALID; \
407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     } \
417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     ptr += n; \
427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     break;
437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \
457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_NONASCII: \
467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \
477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr; \
487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID; \
497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } \
507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_NMSTRT: \
517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_HEX: \
527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_DIGIT: \
537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_NAME: \
547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_MINUS: \
557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc); \
567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break; \
577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \
587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \
597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \
627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   case BT_LEAD ## n: \
637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     if (end - ptr < n) \
647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel       return XML_TOK_PARTIAL_CHAR; \
657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \
667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel       *nextTokPtr = ptr; \
677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel       return XML_TOK_INVALID; \
687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     } \
697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     ptr += n; \
707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     break;
717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \
737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_NONASCII: \
747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \
757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr; \
767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID; \
777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } \
787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_NMSTRT: \
797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_HEX: \
807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc); \
817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break; \
827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \
837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \
847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr)
857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifndef PREFIX
877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define PREFIX(ident) ident
887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ptr points to character following "<!-" */
917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(scanComment)(const ENCODING *enc, const char *ptr,
947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    const char *end, const char **nextTokPtr)
957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr != end) {
977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
1007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc);
1027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    while (ptr != end) {
1037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      switch (BYTE_TYPE(enc, ptr)) {
1047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      INVALID_CASES(ptr, nextTokPtr)
1057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_MINUS:
1067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if ((ptr += MINBPC(enc)) == end)
1077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return XML_TOK_PARTIAL;
1087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
1097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          if ((ptr += MINBPC(enc)) == end)
1107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return XML_TOK_PARTIAL;
1117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            *nextTokPtr = ptr;
1137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return XML_TOK_INVALID;
1147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          }
1157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          *nextTokPtr = ptr + MINBPC(enc);
1167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return XML_TOK_COMMENT;
1177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
1187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
1197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      default:
1207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        ptr += MINBPC(enc);
1217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
1227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
1237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
1257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_PARTIAL;
1267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ptr points to character following "<!" */
1297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
1317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(scanDecl)(const ENCODING *enc, const char *ptr,
1327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                 const char *end, const char **nextTokPtr)
1337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
1347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr == end)
1357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_PARTIAL;
1367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  switch (BYTE_TYPE(enc, ptr)) {
1377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_MINUS:
1387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_LSQB:
1407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr + MINBPC(enc);
1417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_COND_SECT_OPEN;
1427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_NMSTRT:
1437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_HEX:
1447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc);
1457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break;
1467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  default:
1477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
1487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_INVALID;
1497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
1507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
1517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
1527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_PERCNT:
1537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr + MINBPC(enc) == end)
1547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PARTIAL;
1557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      /* don't allow <!ENTITY% foo "whatever"> */
1567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
1577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_S: case BT_CR: case BT_LF: case BT_PERCNT:
1587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
1597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID;
1607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
1617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      /* fall through */
1627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_S: case BT_CR: case BT_LF:
1637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
1647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_DECL_OPEN;
1657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_NMSTRT:
1667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_HEX:
1677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
1687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
1697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
1707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
1717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
1727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
1747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_PARTIAL;
1757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
1787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr,
1797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                      const char *end, int *tokPtr)
1807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
1817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  int upper = 0;
1827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  *tokPtr = XML_TOK_PI;
1837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (end - ptr != MINBPC(enc)*3)
1847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return 1;
1857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  switch (BYTE_TO_ASCII(enc, ptr)) {
1867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case ASCII_x:
1877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break;
1887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case ASCII_X:
1897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    upper = 1;
1907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break;
1917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  default:
1927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return 1;
1937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
1947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  ptr += MINBPC(enc);
1957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  switch (BYTE_TO_ASCII(enc, ptr)) {
1967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case ASCII_m:
1977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break;
1987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case ASCII_M:
1997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    upper = 1;
2007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break;
2017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  default:
2027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return 1;
2037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
2047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  ptr += MINBPC(enc);
2057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  switch (BYTE_TO_ASCII(enc, ptr)) {
2067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case ASCII_l:
2077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break;
2087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case ASCII_L:
2097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    upper = 1;
2107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break;
2117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  default:
2127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return 1;
2137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
2147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (upper)
2157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return 0;
2167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  *tokPtr = XML_TOK_XML_DECL;
2177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return 1;
2187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
2197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ptr points to character following "<?" */
2217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
2237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(scanPi)(const ENCODING *enc, const char *ptr,
2247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel               const char *end, const char **nextTokPtr)
2257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
2267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  int tok;
2277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  const char *target = ptr;
2287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr == end)
2297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_PARTIAL;
2307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  switch (BYTE_TYPE(enc, ptr)) {
2317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
2327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  default:
2337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
2347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_INVALID;
2357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
2367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
2377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
2387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
2397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_S: case BT_CR: case BT_LF:
2407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
2417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
2427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID;
2437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
2447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
2457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      while (ptr != end) {
2467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        switch (BYTE_TYPE(enc, ptr)) {
2477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        INVALID_CASES(ptr, nextTokPtr)
2487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        case BT_QUEST:
2497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          ptr += MINBPC(enc);
2507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          if (ptr == end)
2517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return XML_TOK_PARTIAL;
2527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
2537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            *nextTokPtr = ptr + MINBPC(enc);
2547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return tok;
2557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          }
2567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          break;
2577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        default:
2587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          ptr += MINBPC(enc);
2597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          break;
2607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
2617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
2627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_PARTIAL;
2637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_QUEST:
2647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
2657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
2667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID;
2677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
2687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
2697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == end)
2707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PARTIAL;
2717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
2727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr + MINBPC(enc);
2737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return tok;
2747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
2757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      /* fall through */
2767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
2777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
2787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
2797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
2807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
2817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_PARTIAL;
2827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
2837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
2857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr,
2867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                         const char *end, const char **nextTokPtr)
2877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
2887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  static const char CDATA_LSQB[] = { ASCII_C, ASCII_D, ASCII_A,
2897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                     ASCII_T, ASCII_A, ASCII_LSQB };
2907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  int i;
2917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  /* CDATA[ */
2927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (end - ptr < 6 * MINBPC(enc))
2937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_PARTIAL;
2947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
2957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
2967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
2977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
2987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
2997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
3007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  *nextTokPtr = ptr;
3017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_CDATA_SECT_OPEN;
3027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
3037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
3057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr,
3067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                        const char *end, const char **nextTokPtr)
3077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
3087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr == end)
3097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_NONE;
3107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (MINBPC(enc) > 1) {
3117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    size_t n = end - ptr;
3127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (n & (MINBPC(enc) - 1)) {
3137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      n &= ~(MINBPC(enc) - 1);
3147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (n == 0)
3157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PARTIAL;
3167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      end = ptr + n;
3177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
3187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
3197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  switch (BYTE_TYPE(enc, ptr)) {
3207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_RSQB:
3217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc);
3227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (ptr == end)
3237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_PARTIAL;
3247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB))
3257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
3267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc);
3277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (ptr == end)
3287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_PARTIAL;
3297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
3307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr -= MINBPC(enc);
3317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
3327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
3337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr + MINBPC(enc);
3347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_CDATA_SECT_CLOSE;
3357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_CR:
3367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc);
3377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (ptr == end)
3387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_PARTIAL;
3397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (BYTE_TYPE(enc, ptr) == BT_LF)
3407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
3417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
3427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_DATA_NEWLINE;
3437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_LF:
3447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr + MINBPC(enc);
3457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_DATA_NEWLINE;
3467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  INVALID_CASES(ptr, nextTokPtr)
3477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  default:
3487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc);
3497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break;
3507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
3517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
3527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
3537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define LEAD_CASE(n) \
3547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LEAD ## n: \
3557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \
3567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr; \
3577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_DATA_CHARS; \
3587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      } \
3597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += n; \
3607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
3617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
3627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef LEAD_CASE
3637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_NONXML:
3647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_MALFORM:
3657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_TRAIL:
3667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_CR:
3677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LF:
3687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_RSQB:
3697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
3707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_DATA_CHARS;
3717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
3727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
3737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
3747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
3757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
3767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  *nextTokPtr = ptr;
3777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_DATA_CHARS;
3787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
3797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ptr points to character following "</" */
3817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
3837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(scanEndTag)(const ENCODING *enc, const char *ptr,
3847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                   const char *end, const char **nextTokPtr)
3857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
3867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr == end)
3877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_PARTIAL;
3887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  switch (BYTE_TYPE(enc, ptr)) {
3897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
3907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  default:
3917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
3927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_INVALID;
3937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
3947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
3957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
3967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
3977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_S: case BT_CR: case BT_LF:
3987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
3997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        switch (BYTE_TYPE(enc, ptr)) {
4007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        case BT_S: case BT_CR: case BT_LF:
4017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          break;
4027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        case BT_GT:
4037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          *nextTokPtr = ptr + MINBPC(enc);
4047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return XML_TOK_END_TAG;
4057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        default:
4067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          *nextTokPtr = ptr;
4077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return XML_TOK_INVALID;
4087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
4097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
4107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_PARTIAL;
4117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_NS
4127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_COLON:
4137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      /* no need to check qname syntax here,
4147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel         since end-tag must match exactly */
4157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
4167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
4177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
4187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_GT:
4197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr + MINBPC(enc);
4207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_END_TAG;
4217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
4227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
4237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
4247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
4257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
4267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_PARTIAL;
4277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
4287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ptr points to character following "&#X" */
4307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
4327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr,
4337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                       const char *end, const char **nextTokPtr)
4347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
4357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr != end) {
4367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
4377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_DIGIT:
4387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_HEX:
4397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
4407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
4417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
4427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
4437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
4447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
4457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      switch (BYTE_TYPE(enc, ptr)) {
4467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_DIGIT:
4477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_HEX:
4487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
4497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_SEMI:
4507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr + MINBPC(enc);
4517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_CHAR_REF;
4527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      default:
4537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
4547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID;
4557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
4567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
4577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
4587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_PARTIAL;
4597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
4607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ptr points to character following "&#" */
4627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
4647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(scanCharRef)(const ENCODING *enc, const char *ptr,
4657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    const char *end, const char **nextTokPtr)
4667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
4677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr != end) {
4687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (CHAR_MATCHES(enc, ptr, ASCII_x))
4697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
4707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
4717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_DIGIT:
4727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
4737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
4747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
4757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
4767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
4777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
4787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      switch (BYTE_TYPE(enc, ptr)) {
4797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_DIGIT:
4807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
4817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_SEMI:
4827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr + MINBPC(enc);
4837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_CHAR_REF;
4847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      default:
4857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
4867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID;
4877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
4887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
4897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
4907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_PARTIAL;
4917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
4927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ptr points to character following "&" */
4947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
4967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end,
4977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                const char **nextTokPtr)
4987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
4997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr == end)
5007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_PARTIAL;
5017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  switch (BYTE_TYPE(enc, ptr)) {
5027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
5037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_NUM:
5047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
5057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  default:
5067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
5077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_INVALID;
5087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
5097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
5107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
5117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
5127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_SEMI:
5137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr + MINBPC(enc);
5147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_ENTITY_REF;
5157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
5167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
5177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
5187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
5197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
5207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_PARTIAL;
5217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
5227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ptr points to character following first character of attribute name */
5247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
5267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end,
5277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                 const char **nextTokPtr)
5287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
5297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_NS
5307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  int hadColon = 0;
5317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
5327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
5337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
5347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
5357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_NS
5367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_COLON:
5377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (hadColon) {
5387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
5397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID;
5407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
5417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      hadColon = 1;
5427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
5437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == end)
5447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PARTIAL;
5457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      switch (BYTE_TYPE(enc, ptr)) {
5467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
5477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      default:
5487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
5497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID;
5507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
5517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
5527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
5537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_S: case BT_CR: case BT_LF:
5547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      for (;;) {
5557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        int t;
5567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        ptr += MINBPC(enc);
5587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (ptr == end)
5597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return XML_TOK_PARTIAL;
5607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        t = BYTE_TYPE(enc, ptr);
5617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (t == BT_EQUALS)
5627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          break;
5637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        switch (t) {
5647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        case BT_S:
5657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        case BT_LF:
5667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        case BT_CR:
5677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          break;
5687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        default:
5697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          *nextTokPtr = ptr;
5707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return XML_TOK_INVALID;
5717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
5727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
5737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* fall through */
5747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_EQUALS:
5757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      {
5767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        int open;
5777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_NS
5787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        hadColon = 0;
5797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
5807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        for (;;) {
5817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          ptr += MINBPC(enc);
5827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          if (ptr == end)
5837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return XML_TOK_PARTIAL;
5847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          open = BYTE_TYPE(enc, ptr);
5857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          if (open == BT_QUOT || open == BT_APOS)
5867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            break;
5877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          switch (open) {
5887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          case BT_S:
5897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          case BT_LF:
5907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          case BT_CR:
5917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            break;
5927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          default:
5937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            *nextTokPtr = ptr;
5947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return XML_TOK_INVALID;
5957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          }
5967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
5977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        ptr += MINBPC(enc);
5987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        /* in attribute value */
5997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        for (;;) {
6007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          int t;
6017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          if (ptr == end)
6027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return XML_TOK_PARTIAL;
6037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          t = BYTE_TYPE(enc, ptr);
6047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          if (t == open)
6057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            break;
6067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          switch (t) {
6077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          INVALID_CASES(ptr, nextTokPtr)
6087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          case BT_AMP:
6097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            {
6107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel              int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
6117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel              if (tok <= 0) {
6127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                if (tok == XML_TOK_INVALID)
6137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                  *nextTokPtr = ptr;
6147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                return tok;
6157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel              }
6167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel              break;
6177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            }
6187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          case BT_LT:
6197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            *nextTokPtr = ptr;
6207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return XML_TOK_INVALID;
6217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          default:
6227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            ptr += MINBPC(enc);
6237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            break;
6247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          }
6257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
6267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        ptr += MINBPC(enc);
6277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (ptr == end)
6287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return XML_TOK_PARTIAL;
6297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        switch (BYTE_TYPE(enc, ptr)) {
6307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        case BT_S:
6317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        case BT_CR:
6327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        case BT_LF:
6337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          break;
6347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        case BT_SOL:
6357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          goto sol;
6367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        case BT_GT:
6377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          goto gt;
6387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        default:
6397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          *nextTokPtr = ptr;
6407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return XML_TOK_INVALID;
6417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
6427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        /* ptr points to closing quote */
6437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        for (;;) {
6447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          ptr += MINBPC(enc);
6457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          if (ptr == end)
6467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return XML_TOK_PARTIAL;
6477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          switch (BYTE_TYPE(enc, ptr)) {
6487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
6497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          case BT_S: case BT_CR: case BT_LF:
6507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            continue;
6517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          case BT_GT:
6527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          gt:
6537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            *nextTokPtr = ptr + MINBPC(enc);
6547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return XML_TOK_START_TAG_WITH_ATTS;
6557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          case BT_SOL:
6567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          sol:
6577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            ptr += MINBPC(enc);
6587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            if (ptr == end)
6597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel              return XML_TOK_PARTIAL;
6607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
6617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel              *nextTokPtr = ptr;
6627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel              return XML_TOK_INVALID;
6637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            }
6647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            *nextTokPtr = ptr + MINBPC(enc);
6657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
6667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          default:
6677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            *nextTokPtr = ptr;
6687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return XML_TOK_INVALID;
6697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          }
6707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          break;
6717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
6727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
6737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
6747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
6757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
6767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
6777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
6787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
6797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_PARTIAL;
6807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
6817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ptr points to character following "<" */
6837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
6857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end,
6867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel               const char **nextTokPtr)
6877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
6887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_NS
6897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  int hadColon;
6907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
6917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr == end)
6927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_PARTIAL;
6937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  switch (BYTE_TYPE(enc, ptr)) {
6947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
6957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_EXCL:
6967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if ((ptr += MINBPC(enc)) == end)
6977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_PARTIAL;
6987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
6997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_MINUS:
7007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
7017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LSQB:
7027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc),
7037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                      end, nextTokPtr);
7047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
7057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
7067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_INVALID;
7077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_QUEST:
7087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
7097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_SOL:
7107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
7117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  default:
7127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
7137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_INVALID;
7147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
7157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_NS
7167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  hadColon = 0;
7177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
7187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  /* we have a start-tag */
7197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
7207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
7217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
7227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_NS
7237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_COLON:
7247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (hadColon) {
7257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
7267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID;
7277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
7287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      hadColon = 1;
7297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
7307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == end)
7317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PARTIAL;
7327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      switch (BYTE_TYPE(enc, ptr)) {
7337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
7347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      default:
7357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
7367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID;
7377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
7387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
7397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
7407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_S: case BT_CR: case BT_LF:
7417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      {
7427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        ptr += MINBPC(enc);
7437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        while (ptr != end) {
7447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          switch (BYTE_TYPE(enc, ptr)) {
7457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
7467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          case BT_GT:
7477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            goto gt;
7487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          case BT_SOL:
7497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            goto sol;
7507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          case BT_S: case BT_CR: case BT_LF:
7517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            ptr += MINBPC(enc);
7527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            continue;
7537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          default:
7547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            *nextTokPtr = ptr;
7557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return XML_TOK_INVALID;
7567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          }
7577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
7587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
7597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PARTIAL;
7607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
7617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_GT:
7627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gt:
7637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr + MINBPC(enc);
7647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_START_TAG_NO_ATTS;
7657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_SOL:
7667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    sol:
7677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
7687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == end)
7697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PARTIAL;
7707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
7717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
7727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID;
7737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
7747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr + MINBPC(enc);
7757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
7767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
7777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
7787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
7797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
7807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
7817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_PARTIAL;
7827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
7837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
7847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
7857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
7867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                   const char **nextTokPtr)
7877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
7887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr == end)
7897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_NONE;
7907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (MINBPC(enc) > 1) {
7917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    size_t n = end - ptr;
7927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (n & (MINBPC(enc) - 1)) {
7937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      n &= ~(MINBPC(enc) - 1);
7947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (n == 0)
7957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PARTIAL;
7967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      end = ptr + n;
7977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
7987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
7997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  switch (BYTE_TYPE(enc, ptr)) {
8007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_LT:
8017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
8027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_AMP:
8037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
8047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_CR:
8057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc);
8067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (ptr == end)
8077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_TRAILING_CR;
8087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (BYTE_TYPE(enc, ptr) == BT_LF)
8097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
8107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
8117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_DATA_NEWLINE;
8127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_LF:
8137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr + MINBPC(enc);
8147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_DATA_NEWLINE;
8157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_RSQB:
8167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc);
8177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (ptr == end)
8187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_TRAILING_RSQB;
8197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB))
8207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
8217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc);
8227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (ptr == end)
8237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_TRAILING_RSQB;
8247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
8257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr -= MINBPC(enc);
8267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
8277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
8287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
8297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_INVALID;
8307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  INVALID_CASES(ptr, nextTokPtr)
8317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  default:
8327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc);
8337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break;
8347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
8357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
8367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
8377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define LEAD_CASE(n) \
8387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LEAD ## n: \
8397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \
8407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr; \
8417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_DATA_CHARS; \
8427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      } \
8437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += n; \
8447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
8457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
8467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef LEAD_CASE
8477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_RSQB:
8487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr + MINBPC(enc) != end) {
8497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel         if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
8507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel           ptr += MINBPC(enc);
8517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel           break;
8527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel         }
8537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel         if (ptr + 2*MINBPC(enc) != end) {
8547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel           if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) {
8557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel             ptr += MINBPC(enc);
8567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel             break;
8577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel           }
8587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel           *nextTokPtr = ptr + 2*MINBPC(enc);
8597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel           return XML_TOK_INVALID;
8607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel         }
8617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
8627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      /* fall through */
8637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_AMP:
8647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LT:
8657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_NONXML:
8667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_MALFORM:
8677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_TRAIL:
8687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_CR:
8697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LF:
8707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
8717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_DATA_CHARS;
8727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
8737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
8747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
8757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
8767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
8777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  *nextTokPtr = ptr;
8787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_DATA_CHARS;
8797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
8807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ptr points to character following "%" */
8827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
8837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
8847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,
8857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    const char **nextTokPtr)
8867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
8877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr == end)
8887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_PARTIAL;
8897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  switch (BYTE_TYPE(enc, ptr)) {
8907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
8917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_S: case BT_LF: case BT_CR: case BT_PERCNT:
8927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
8937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_PERCENT;
8947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  default:
8957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
8967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_INVALID;
8977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
8987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
8997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
9007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
9017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_SEMI:
9027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr + MINBPC(enc);
9037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_PARAM_ENTITY_REF;
9047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
9057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
9067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
9077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
9087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
9097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_PARTIAL;
9107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
9117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
9137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
9147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                      const char **nextTokPtr)
9157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
9167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr == end)
9177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_PARTIAL;
9187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  switch (BYTE_TYPE(enc, ptr)) {
9197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
9207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  default:
9217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
9227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_INVALID;
9237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
9247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
9257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
9267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
9277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_CR: case BT_LF: case BT_S:
9287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR:
9297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
9307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_POUND_NAME;
9317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
9327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
9337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
9347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
9357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
9367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return -XML_TOK_POUND_NAME;
9377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
9387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
9407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(scanLit)(int open, const ENCODING *enc,
9417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                const char *ptr, const char *end,
9427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                const char **nextTokPtr)
9437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
9447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
9457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int t = BYTE_TYPE(enc, ptr);
9467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (t) {
9477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    INVALID_CASES(ptr, nextTokPtr)
9487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_QUOT:
9497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_APOS:
9507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
9517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (t != open)
9527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
9537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == end)
9547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return -XML_TOK_LITERAL;
9557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
9567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      switch (BYTE_TYPE(enc, ptr)) {
9577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_S: case BT_CR: case BT_LF:
9587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_GT: case BT_PERCNT: case BT_LSQB:
9597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_LITERAL;
9607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      default:
9617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID;
9627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
9637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
9647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
9657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
9667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
9677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
9687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_PARTIAL;
9697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
9707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
9717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
9727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
9737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                  const char **nextTokPtr)
9747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
9757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  int tok;
9767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr == end)
9777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_NONE;
9787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (MINBPC(enc) > 1) {
9797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    size_t n = end - ptr;
9807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (n & (MINBPC(enc) - 1)) {
9817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      n &= ~(MINBPC(enc) - 1);
9827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (n == 0)
9837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PARTIAL;
9847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      end = ptr + n;
9857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
9867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
9877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  switch (BYTE_TYPE(enc, ptr)) {
9887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_QUOT:
9897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
9907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_APOS:
9917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
9927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_LT:
9937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    {
9947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
9957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == end)
9967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PARTIAL;
9977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      switch (BYTE_TYPE(enc, ptr)) {
9987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_EXCL:
9997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
10007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_QUEST:
10017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
10027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_NMSTRT:
10037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_HEX:
10047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_NONASCII:
10057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_LEAD2:
10067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_LEAD3:
10077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_LEAD4:
10087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr - MINBPC(enc);
10097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INSTANCE_START;
10107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
10117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
10127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
10137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
10147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_CR:
10157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (ptr + MINBPC(enc) == end) {
10167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = end;
10177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      /* indicate that this might be part of a CR/LF pair */
10187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return -XML_TOK_PROLOG_S;
10197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
10207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* fall through */
10217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_S: case BT_LF:
10227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    for (;;) {
10237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
10247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == end)
10257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
10267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      switch (BYTE_TYPE(enc, ptr)) {
10277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_S: case BT_LF:
10287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
10297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_CR:
10307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        /* don't split CR/LF pair */
10317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (ptr + MINBPC(enc) != end)
10327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          break;
10337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        /* fall through */
10347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      default:
10357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
10367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PROLOG_S;
10377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
10387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
10397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
10407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_PROLOG_S;
10417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_PERCNT:
10427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
10437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_COMMA:
10447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr + MINBPC(enc);
10457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_COMMA;
10467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_LSQB:
10477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr + MINBPC(enc);
10487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_OPEN_BRACKET;
10497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_RSQB:
10507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc);
10517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (ptr == end)
10527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return -XML_TOK_CLOSE_BRACKET;
10537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
10547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr + MINBPC(enc) == end)
10557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PARTIAL;
10567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
10577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr + 2*MINBPC(enc);
10587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_COND_SECT_CLOSE;
10597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
10607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
10617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
10627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_CLOSE_BRACKET;
10637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_LPAR:
10647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr + MINBPC(enc);
10657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_OPEN_PAREN;
10667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_RPAR:
10677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc);
10687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (ptr == end)
10697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return -XML_TOK_CLOSE_PAREN;
10707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
10717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_AST:
10727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr + MINBPC(enc);
10737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_CLOSE_PAREN_ASTERISK;
10747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_QUEST:
10757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr + MINBPC(enc);
10767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_CLOSE_PAREN_QUESTION;
10777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_PLUS:
10787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr + MINBPC(enc);
10797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_CLOSE_PAREN_PLUS;
10807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_CR: case BT_LF: case BT_S:
10817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_GT: case BT_COMMA: case BT_VERBAR:
10827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_RPAR:
10837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
10847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_CLOSE_PAREN;
10857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
10867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
10877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_INVALID;
10887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_VERBAR:
10897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr + MINBPC(enc);
10907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_OR;
10917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_GT:
10927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr + MINBPC(enc);
10937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_DECL_CLOSE;
10947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_NUM:
10957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
10967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define LEAD_CASE(n) \
10977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_LEAD ## n: \
10987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (end - ptr < n) \
10997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_PARTIAL_CHAR; \
11007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (IS_NMSTRT_CHAR(enc, ptr, n)) { \
11017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += n; \
11027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      tok = XML_TOK_NAME; \
11037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break; \
11047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } \
11057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (IS_NAME_CHAR(enc, ptr, n)) { \
11067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += n; \
11077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      tok = XML_TOK_NMTOKEN; \
11087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break; \
11097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } \
11107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr; \
11117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_INVALID;
11127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
11137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef LEAD_CASE
11147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_NMSTRT:
11157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_HEX:
11167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    tok = XML_TOK_NAME;
11177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc);
11187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break;
11197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_DIGIT:
11207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_NAME:
11217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_MINUS:
11227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_NS
11237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_COLON:
11247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
11257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    tok = XML_TOK_NMTOKEN;
11267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    ptr += MINBPC(enc);
11277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break;
11287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case BT_NONASCII:
11297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
11307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
11317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      tok = XML_TOK_NAME;
11327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
11337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
11347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
11357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
11367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      tok = XML_TOK_NMTOKEN;
11377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
11387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
11397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* fall through */
11407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  default:
11417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *nextTokPtr = ptr;
11427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_INVALID;
11437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
11447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
11457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
11467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
11477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_GT: case BT_RPAR: case BT_COMMA:
11487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_VERBAR: case BT_LSQB: case BT_PERCNT:
11497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_S: case BT_CR: case BT_LF:
11507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
11517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return tok;
11527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_NS
11537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_COLON:
11547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
11557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      switch (tok) {
11567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case XML_TOK_NAME:
11577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (ptr == end)
11587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return XML_TOK_PARTIAL;
11597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        tok = XML_TOK_PREFIXED_NAME;
11607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        switch (BYTE_TYPE(enc, ptr)) {
11617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
11627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        default:
11637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          tok = XML_TOK_NMTOKEN;
11647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          break;
11657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
11667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
11677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case XML_TOK_PREFIXED_NAME:
11687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        tok = XML_TOK_NMTOKEN;
11697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
11707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
11717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
11727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
11737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_PLUS:
11747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (tok == XML_TOK_NMTOKEN)  {
11757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
11767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID;
11777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
11787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr + MINBPC(enc);
11797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_NAME_PLUS;
11807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_AST:
11817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (tok == XML_TOK_NMTOKEN)  {
11827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
11837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID;
11847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
11857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr + MINBPC(enc);
11867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_NAME_ASTERISK;
11877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_QUEST:
11887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (tok == XML_TOK_NMTOKEN)  {
11897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
11907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_INVALID;
11917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
11927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr + MINBPC(enc);
11937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_NAME_QUESTION;
11947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
11957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
11967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
11977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
11987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
11997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return -tok;
12007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
12017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
12027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
12037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr,
12047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                          const char *end, const char **nextTokPtr)
12057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
12067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  const char *start;
12077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr == end)
12087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_NONE;
12097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  start = ptr;
12107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
12117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
12127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define LEAD_CASE(n) \
12137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LEAD ## n: ptr += n; break;
12147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
12157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef LEAD_CASE
12167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_AMP:
12177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == start)
12187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
12197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
12207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_DATA_CHARS;
12217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LT:
12227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      /* this is for inside entity references */
12237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
12247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_INVALID;
12257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LF:
12267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == start) {
12277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr + MINBPC(enc);
12287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_DATA_NEWLINE;
12297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
12307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
12317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_DATA_CHARS;
12327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_CR:
12337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == start) {
12347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        ptr += MINBPC(enc);
12357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (ptr == end)
12367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return XML_TOK_TRAILING_CR;
12377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (BYTE_TYPE(enc, ptr) == BT_LF)
12387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          ptr += MINBPC(enc);
12397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
12407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_DATA_NEWLINE;
12417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
12427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
12437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_DATA_CHARS;
12447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_S:
12457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == start) {
12467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr + MINBPC(enc);
12477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_ATTRIBUTE_VALUE_S;
12487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
12497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
12507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_DATA_CHARS;
12517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
12527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
12537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
12547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
12557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
12567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  *nextTokPtr = ptr;
12577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_DATA_CHARS;
12587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
12597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
12607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
12617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(entityValueTok)(const ENCODING *enc, const char *ptr,
12627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                       const char *end, const char **nextTokPtr)
12637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
12647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  const char *start;
12657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (ptr == end)
12667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return XML_TOK_NONE;
12677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  start = ptr;
12687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
12697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
12707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define LEAD_CASE(n) \
12717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LEAD ## n: ptr += n; break;
12727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
12737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef LEAD_CASE
12747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_AMP:
12757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == start)
12767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
12777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
12787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_DATA_CHARS;
12797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_PERCNT:
12807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == start) {
12817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        int tok =  PREFIX(scanPercent)(enc, ptr + MINBPC(enc),
12827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                       end, nextTokPtr);
12837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
12847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
12857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
12867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_DATA_CHARS;
12877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LF:
12887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == start) {
12897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr + MINBPC(enc);
12907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_DATA_NEWLINE;
12917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
12927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
12937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_DATA_CHARS;
12947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_CR:
12957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr == start) {
12967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        ptr += MINBPC(enc);
12977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (ptr == end)
12987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return XML_TOK_TRAILING_CR;
12997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (BYTE_TYPE(enc, ptr) == BT_LF)
13007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          ptr += MINBPC(enc);
13017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *nextTokPtr = ptr;
13027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_DATA_NEWLINE;
13037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
13047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      *nextTokPtr = ptr;
13057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return XML_TOK_DATA_CHARS;
13067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
13077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
13087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
13097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
13107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
13117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  *nextTokPtr = ptr;
13127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_DATA_CHARS;
13137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
13147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
13157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_DTD
13167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
13177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
13187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr,
13197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                         const char *end, const char **nextTokPtr)
13207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
13217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  int level = 0;
13227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (MINBPC(enc) > 1) {
13237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    size_t n = end - ptr;
13247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (n & (MINBPC(enc) - 1)) {
13257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      n &= ~(MINBPC(enc) - 1);
13267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      end = ptr + n;
13277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
13287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
13297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr != end) {
13307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
13317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    INVALID_CASES(ptr, nextTokPtr)
13327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LT:
13337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if ((ptr += MINBPC(enc)) == end)
13347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PARTIAL;
13357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
13367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if ((ptr += MINBPC(enc)) == end)
13377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return XML_TOK_PARTIAL;
13387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
13397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          ++level;
13407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          ptr += MINBPC(enc);
13417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
13427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
13437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
13447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_RSQB:
13457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if ((ptr += MINBPC(enc)) == end)
13467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return XML_TOK_PARTIAL;
13477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
13487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if ((ptr += MINBPC(enc)) == end)
13497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return XML_TOK_PARTIAL;
13507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
13517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          ptr += MINBPC(enc);
13527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          if (level == 0) {
13537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            *nextTokPtr = ptr;
13547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return XML_TOK_IGNORE_SECT;
13557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          }
13567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          --level;
13577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
13587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
13597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
13607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
13617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
13627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
13637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
13647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
13657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return XML_TOK_PARTIAL;
13667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
13677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
13687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif /* XML_DTD */
13697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
13707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
13717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
13727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                   const char **badPtr)
13737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
13747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  ptr += MINBPC(enc);
13757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  end -= MINBPC(enc);
13767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  for (; ptr != end; ptr += MINBPC(enc)) {
13777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
13787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_DIGIT:
13797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_HEX:
13807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_MINUS:
13817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_APOS:
13827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LPAR:
13837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_RPAR:
13847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_PLUS:
13857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_COMMA:
13867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_SOL:
13877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_EQUALS:
13887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_QUEST:
13897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_CR:
13907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LF:
13917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_SEMI:
13927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_EXCL:
13937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_AST:
13947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_PERCNT:
13957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_NUM:
13967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_NS
13977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_COLON:
13987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
13997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
14007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_S:
14017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
14027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *badPtr = ptr;
14037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return 0;
14047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
14057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
14067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_NAME:
14077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_NMSTRT:
14087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f))
14097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
14107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
14117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      switch (BYTE_TO_ASCII(enc, ptr)) {
14127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case 0x24: /* $ */
14137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case 0x40: /* @ */
14147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
14157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      default:
14167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        *badPtr = ptr;
14177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return 0;
14187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
14197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
14207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
14217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
14227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return 1;
14237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
14247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
14257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* This must only be called for a well-formed start-tag or empty
14267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   element tag.  Returns the number of attributes.  Pointers to the
14277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   first attsMax attributes are stored in atts.
14287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel*/
14297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
14307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
14317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(getAtts)(const ENCODING *enc, const char *ptr,
14327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                int attsMax, ATTRIBUTE *atts)
14337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
14347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  enum { other, inName, inValue } state = inName;
14357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  int nAtts = 0;
14367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  int open = 0; /* defined when state == inValue;
14377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                   initialization just to shut up compilers */
14387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
14397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
14407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
14417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define START_NAME \
14427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (state == other) { \
14437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (nAtts < attsMax) { \
14447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          atts[nAtts].name = ptr; \
14457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          atts[nAtts].normalized = 1; \
14467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        } \
14477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        state = inName; \
14487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
14497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define LEAD_CASE(n) \
14507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break;
14517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
14527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef LEAD_CASE
14537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_NONASCII:
14547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_NMSTRT:
14557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_HEX:
14567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      START_NAME
14577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
14587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef START_NAME
14597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_QUOT:
14607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (state != inValue) {
14617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (nAtts < attsMax)
14627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          atts[nAtts].valuePtr = ptr + MINBPC(enc);
14637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        state = inValue;
14647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        open = BT_QUOT;
14657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
14667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      else if (open == BT_QUOT) {
14677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        state = other;
14687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (nAtts < attsMax)
14697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          atts[nAtts].valueEnd = ptr;
14707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        nAtts++;
14717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
14727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
14737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_APOS:
14747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (state != inValue) {
14757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (nAtts < attsMax)
14767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          atts[nAtts].valuePtr = ptr + MINBPC(enc);
14777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        state = inValue;
14787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        open = BT_APOS;
14797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
14807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      else if (open == BT_APOS) {
14817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        state = other;
14827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (nAtts < attsMax)
14837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          atts[nAtts].valueEnd = ptr;
14847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        nAtts++;
14857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
14867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
14877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_AMP:
14887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (nAtts < attsMax)
14897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        atts[nAtts].normalized = 0;
14907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
14917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_S:
14927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (state == inName)
14937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        state = other;
14947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      else if (state == inValue
14957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel               && nAtts < attsMax
14967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel               && atts[nAtts].normalized
14977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel               && (ptr == atts[nAtts].valuePtr
14987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
14997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
15007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
15017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        atts[nAtts].normalized = 0;
15027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
15037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_CR: case BT_LF:
15047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      /* This case ensures that the first attribute name is counted
15057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel         Apart from that we could just change state on the quote. */
15067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (state == inName)
15077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        state = other;
15087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      else if (state == inValue && nAtts < attsMax)
15097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        atts[nAtts].normalized = 0;
15107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
15117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_GT:
15127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_SOL:
15137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (state != inValue)
15147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return nAtts;
15157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
15167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
15177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
15187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
15197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
15207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  /* not reached */
15217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
15227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
15237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRFASTCALL
15247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(charRefNumber)(const ENCODING *enc, const char *ptr)
15257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
15267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  int result = 0;
15277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  /* skip &# */
15287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  ptr += 2*MINBPC(enc);
15297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
15307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    for (ptr += MINBPC(enc);
15317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel         !CHAR_MATCHES(enc, ptr, ASCII_SEMI);
15327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel         ptr += MINBPC(enc)) {
15337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      int c = BYTE_TO_ASCII(enc, ptr);
15347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      switch (c) {
15357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4:
15367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9:
15377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        result <<= 4;
15387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        result |= (c - ASCII_0);
15397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
15407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case ASCII_A: case ASCII_B: case ASCII_C:
15417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case ASCII_D: case ASCII_E: case ASCII_F:
15427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        result <<= 4;
15437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        result += 10 + (c - ASCII_A);
15447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
15457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case ASCII_a: case ASCII_b: case ASCII_c:
15467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case ASCII_d: case ASCII_e: case ASCII_f:
15477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        result <<= 4;
15487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        result += 10 + (c - ASCII_a);
15497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
15507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
15517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (result >= 0x110000)
15527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return -1;
15537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
15547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
15557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  else {
15567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
15577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      int c = BYTE_TO_ASCII(enc, ptr);
15587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      result *= 10;
15597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      result += (c - ASCII_0);
15607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (result >= 0x110000)
15617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return -1;
15627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
15637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
15647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return checkCharRefNumber(result);
15657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
15667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
15677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
15687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr,
15697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                             const char *end)
15707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
15717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  switch ((end - ptr)/MINBPC(enc)) {
15727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case 2:
15737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
15747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      switch (BYTE_TO_ASCII(enc, ptr)) {
15757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case ASCII_l:
15767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return ASCII_LT;
15777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case ASCII_g:
15787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return ASCII_GT;
15797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
15807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
15817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break;
15827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case 3:
15837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
15847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
15857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
15867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        ptr += MINBPC(enc);
15877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (CHAR_MATCHES(enc, ptr, ASCII_p))
15887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return ASCII_AMP;
15897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
15907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
15917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    break;
15927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  case 4:
15937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TO_ASCII(enc, ptr)) {
15947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case ASCII_q:
15957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
15967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
15977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        ptr += MINBPC(enc);
15987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
15997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          ptr += MINBPC(enc);
16007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          if (CHAR_MATCHES(enc, ptr, ASCII_t))
16017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return ASCII_QUOT;
16027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
16037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
16047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
16057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case ASCII_a:
16067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
16077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
16087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        ptr += MINBPC(enc);
16097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
16107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          ptr += MINBPC(enc);
16117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          if (CHAR_MATCHES(enc, ptr, ASCII_s))
16127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return ASCII_APOS;
16137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
16147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
16157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
16167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
16177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
16187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return 0;
16197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
16207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
16217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
16227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2)
16237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
16247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  for (;;) {
16257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr1)) {
16267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define LEAD_CASE(n) \
16277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LEAD ## n: \
16287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (*ptr1++ != *ptr2++) \
16297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return 0;
16307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2)
16317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef LEAD_CASE
16327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      /* fall through */
16337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (*ptr1++ != *ptr2++)
16347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return 0;
16357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
16367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_NONASCII:
16377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_NMSTRT:
16387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_NS
16397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_COLON:
16407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
16417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_HEX:
16427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_DIGIT:
16437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_NAME:
16447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_MINUS:
16457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (*ptr2++ != *ptr1++)
16467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return 0;
16477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (MINBPC(enc) > 1) {
16487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (*ptr2++ != *ptr1++)
16497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          return 0;
16507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (MINBPC(enc) > 2) {
16517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          if (*ptr2++ != *ptr1++)
16527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return 0;
16537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          if (MINBPC(enc) > 3) {
16547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            if (*ptr2++ != *ptr1++)
16557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel              return 0;
16567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel          }
16577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
16587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
16597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
16607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
16617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (MINBPC(enc) == 1 && *ptr1 == *ptr2)
16627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return 1;
16637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      switch (BYTE_TYPE(enc, ptr2)) {
16647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_LEAD2:
16657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_LEAD3:
16667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_LEAD4:
16677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_NONASCII:
16687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_NMSTRT:
16697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_NS
16707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_COLON:
16717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
16727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_HEX:
16737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_DIGIT:
16747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_NAME:
16757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      case BT_MINUS:
16767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return 0;
16777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      default:
16787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return 1;
16797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      }
16807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
16817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
16827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  /* not reached */
16837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
16847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
16857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRCALL
16867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1,
16877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                         const char *end1, const char *ptr2)
16887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
16897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
16907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (ptr1 == end1)
16917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return 0;
16927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!CHAR_MATCHES(enc, ptr1, *ptr2))
16937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return 0;
16947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
16957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  return ptr1 == end1;
16967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
16977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
16987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic int PTRFASTCALL
16997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(nameLength)(const ENCODING *enc, const char *ptr)
17007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
17017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  const char *start = ptr;
17027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  for (;;) {
17037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
17047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define LEAD_CASE(n) \
17057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LEAD ## n: ptr += n; break;
17067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
17077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef LEAD_CASE
17087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_NONASCII:
17097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_NMSTRT:
17107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef XML_NS
17117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_COLON:
17127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
17137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_HEX:
17147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_DIGIT:
17157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_NAME:
17167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_MINUS:
17177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
17187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
17197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
17207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return (int)(ptr - start);
17217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
17227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
17237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
17247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
17257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic const char * PTRFASTCALL
17267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(skipS)(const ENCODING *enc, const char *ptr)
17277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
17287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  for (;;) {
17297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
17307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LF:
17317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_CR:
17327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_S:
17337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
17347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
17357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
17367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      return ptr;
17377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
17387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
17397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
17407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
17417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic void PTRCALL
17427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielPREFIX(updatePosition)(const ENCODING *enc,
17437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                       const char *ptr,
17447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                       const char *end,
17457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                       POSITION *pos)
17467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
17477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  while (ptr < end) {
17487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    switch (BYTE_TYPE(enc, ptr)) {
17497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define LEAD_CASE(n) \
17507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LEAD ## n: \
17517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += n; \
17527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
17537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
17547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef LEAD_CASE
17557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_LF:
17567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      pos->columnNumber = (XML_Size)-1;
17577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      pos->lineNumber++;
17587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
17597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
17607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    case BT_CR:
17617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      pos->lineNumber++;
17627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
17637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF)
17647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        ptr += MINBPC(enc);
17657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      pos->columnNumber = (XML_Size)-1;
17667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
17677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    default:
17687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      ptr += MINBPC(enc);
17697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      break;
17707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
17717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    pos->columnNumber++;
17727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  }
17737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
17747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
17757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef DO_LEAD_CASE
17767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef MULTIBYTE_CASES
17777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef INVALID_CASES
17787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef CHECK_NAME_CASE
17797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef CHECK_NAME_CASES
17807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef CHECK_NMSTRT_CASE
17817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#undef CHECK_NMSTRT_CASES
17827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
17837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif /* XML_TOK_IMPL_C */
1784