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