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