Index: third_party/expat/files/lib/xmltok_impl.c |
diff --git a/third_party/expat/files/lib/xmltok_impl.c b/third_party/expat/files/lib/xmltok_impl.c |
index 9c2895b87739ef031ecd933df4b95e2441f8962b..5f779c0571b5b16f5296adc0fc8336dce16e8b8d 100644 |
--- a/third_party/expat/files/lib/xmltok_impl.c |
+++ b/third_party/expat/files/lib/xmltok_impl.c |
@@ -87,27 +87,45 @@ |
#define PREFIX(ident) ident |
#endif |
+ |
+#define HAS_CHARS(enc, ptr, end, count) \ |
+ (end - ptr >= count * MINBPC(enc)) |
+ |
+#define HAS_CHAR(enc, ptr, end) \ |
+ HAS_CHARS(enc, ptr, end, 1) |
+ |
+#define REQUIRE_CHARS(enc, ptr, end, count) \ |
+ { \ |
+ if (! HAS_CHARS(enc, ptr, end, count)) { \ |
+ return XML_TOK_PARTIAL; \ |
+ } \ |
+ } |
+ |
+#define REQUIRE_CHAR(enc, ptr, end) \ |
+ REQUIRE_CHARS(enc, ptr, end, 1) |
+ |
+ |
/* ptr points to character following "<!-" */ |
static int PTRCALL |
PREFIX(scanComment)(const ENCODING *enc, const char *ptr, |
const char *end, const char **nextTokPtr) |
{ |
- if (ptr != end) { |
+ if (HAS_CHAR(enc, ptr, end)) { |
if (!CHAR_MATCHES(enc, ptr, ASCII_MINUS)) { |
*nextTokPtr = ptr; |
return XML_TOK_INVALID; |
} |
ptr += MINBPC(enc); |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
INVALID_CASES(ptr, nextTokPtr) |
case BT_MINUS: |
- if ((ptr += MINBPC(enc)) == end) |
- return XML_TOK_PARTIAL; |
+ ptr += MINBPC(enc); |
+ REQUIRE_CHAR(enc, ptr, end); |
if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) { |
- if ((ptr += MINBPC(enc)) == end) |
- return XML_TOK_PARTIAL; |
+ ptr += MINBPC(enc); |
+ REQUIRE_CHAR(enc, ptr, end); |
if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { |
*nextTokPtr = ptr; |
return XML_TOK_INVALID; |
@@ -131,8 +149,7 @@ static int PTRCALL |
PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, |
const char *end, const char **nextTokPtr) |
{ |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
switch (BYTE_TYPE(enc, ptr)) { |
case BT_MINUS: |
return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr); |
@@ -147,11 +164,10 @@ PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, |
*nextTokPtr = ptr; |
return XML_TOK_INVALID; |
} |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
case BT_PERCNT: |
- if (ptr + MINBPC(enc) == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHARS(enc, ptr, end, 2); |
/* don't allow <!ENTITY% foo "whatever"> */ |
switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { |
case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: |
@@ -175,7 +191,7 @@ PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, |
} |
static int PTRCALL |
-PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, |
+PREFIX(checkPiTarget)(const ENCODING *UNUSED_P(enc), const char *ptr, |
const char *end, int *tokPtr) |
{ |
int upper = 0; |
@@ -225,15 +241,14 @@ PREFIX(scanPi)(const ENCODING *enc, const char *ptr, |
{ |
int tok; |
const char *target = ptr; |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) |
default: |
*nextTokPtr = ptr; |
return XML_TOK_INVALID; |
} |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) |
case BT_S: case BT_CR: case BT_LF: |
@@ -242,13 +257,12 @@ PREFIX(scanPi)(const ENCODING *enc, const char *ptr, |
return XML_TOK_INVALID; |
} |
ptr += MINBPC(enc); |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
INVALID_CASES(ptr, nextTokPtr) |
case BT_QUEST: |
ptr += MINBPC(enc); |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { |
*nextTokPtr = ptr + MINBPC(enc); |
return tok; |
@@ -266,8 +280,7 @@ PREFIX(scanPi)(const ENCODING *enc, const char *ptr, |
return XML_TOK_INVALID; |
} |
ptr += MINBPC(enc); |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { |
*nextTokPtr = ptr + MINBPC(enc); |
return tok; |
@@ -282,15 +295,14 @@ PREFIX(scanPi)(const ENCODING *enc, const char *ptr, |
} |
static int PTRCALL |
-PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, |
+PREFIX(scanCdataSection)(const ENCODING *UNUSED_P(enc), const char *ptr, |
const char *end, const char **nextTokPtr) |
{ |
static const char CDATA_LSQB[] = { ASCII_C, ASCII_D, ASCII_A, |
ASCII_T, ASCII_A, ASCII_LSQB }; |
int i; |
/* CDATA[ */ |
- if (end - ptr < 6 * MINBPC(enc)) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHARS(enc, ptr, end, 6); |
for (i = 0; i < 6; i++, ptr += MINBPC(enc)) { |
if (!CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) { |
*nextTokPtr = ptr; |
@@ -305,7 +317,7 @@ static int PTRCALL |
PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, |
const char *end, const char **nextTokPtr) |
{ |
- if (ptr == end) |
+ if (ptr >= end) |
return XML_TOK_NONE; |
if (MINBPC(enc) > 1) { |
size_t n = end - ptr; |
@@ -319,13 +331,11 @@ PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, |
switch (BYTE_TYPE(enc, ptr)) { |
case BT_RSQB: |
ptr += MINBPC(enc); |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) |
break; |
ptr += MINBPC(enc); |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { |
ptr -= MINBPC(enc); |
break; |
@@ -334,8 +344,7 @@ PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, |
return XML_TOK_CDATA_SECT_CLOSE; |
case BT_CR: |
ptr += MINBPC(enc); |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
if (BYTE_TYPE(enc, ptr) == BT_LF) |
ptr += MINBPC(enc); |
*nextTokPtr = ptr; |
@@ -348,7 +357,7 @@ PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, |
ptr += MINBPC(enc); |
break; |
} |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
#define LEAD_CASE(n) \ |
case BT_LEAD ## n: \ |
@@ -383,19 +392,18 @@ static int PTRCALL |
PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, |
const char *end, const char **nextTokPtr) |
{ |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) |
default: |
*nextTokPtr = ptr; |
return XML_TOK_INVALID; |
} |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) |
case BT_S: case BT_CR: case BT_LF: |
- for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { |
+ for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) { |
switch (BYTE_TYPE(enc, ptr)) { |
case BT_S: case BT_CR: case BT_LF: |
break; |
@@ -432,7 +440,7 @@ static int PTRCALL |
PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, |
const char *end, const char **nextTokPtr) |
{ |
- if (ptr != end) { |
+ if (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
case BT_DIGIT: |
case BT_HEX: |
@@ -441,7 +449,7 @@ PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, |
*nextTokPtr = ptr; |
return XML_TOK_INVALID; |
} |
- for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { |
+ for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) { |
switch (BYTE_TYPE(enc, ptr)) { |
case BT_DIGIT: |
case BT_HEX: |
@@ -464,7 +472,7 @@ static int PTRCALL |
PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, |
const char *end, const char **nextTokPtr) |
{ |
- if (ptr != end) { |
+ if (HAS_CHAR(enc, ptr, end)) { |
if (CHAR_MATCHES(enc, ptr, ASCII_x)) |
return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); |
switch (BYTE_TYPE(enc, ptr)) { |
@@ -474,7 +482,7 @@ PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, |
*nextTokPtr = ptr; |
return XML_TOK_INVALID; |
} |
- for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { |
+ for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) { |
switch (BYTE_TYPE(enc, ptr)) { |
case BT_DIGIT: |
break; |
@@ -496,8 +504,7 @@ static int PTRCALL |
PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end, |
const char **nextTokPtr) |
{ |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) |
case BT_NUM: |
@@ -506,7 +513,7 @@ PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end, |
*nextTokPtr = ptr; |
return XML_TOK_INVALID; |
} |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) |
case BT_SEMI: |
@@ -529,7 +536,7 @@ PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end, |
#ifdef XML_NS |
int hadColon = 0; |
#endif |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) |
#ifdef XML_NS |
@@ -540,8 +547,7 @@ PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end, |
} |
hadColon = 1; |
ptr += MINBPC(enc); |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) |
default: |
@@ -555,8 +561,7 @@ PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end, |
int t; |
ptr += MINBPC(enc); |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
t = BYTE_TYPE(enc, ptr); |
if (t == BT_EQUALS) |
break; |
@@ -579,8 +584,7 @@ PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end, |
#endif |
for (;;) { |
ptr += MINBPC(enc); |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
open = BYTE_TYPE(enc, ptr); |
if (open == BT_QUOT || open == BT_APOS) |
break; |
@@ -598,8 +602,7 @@ PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end, |
/* in attribute value */ |
for (;;) { |
int t; |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
t = BYTE_TYPE(enc, ptr); |
if (t == open) |
break; |
@@ -624,8 +627,7 @@ PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end, |
} |
} |
ptr += MINBPC(enc); |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
switch (BYTE_TYPE(enc, ptr)) { |
case BT_S: |
case BT_CR: |
@@ -642,8 +644,7 @@ PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end, |
/* ptr points to closing quote */ |
for (;;) { |
ptr += MINBPC(enc); |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) |
case BT_S: case BT_CR: case BT_LF: |
@@ -655,8 +656,7 @@ PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end, |
case BT_SOL: |
sol: |
ptr += MINBPC(enc); |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { |
*nextTokPtr = ptr; |
return XML_TOK_INVALID; |
@@ -688,13 +688,12 @@ PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end, |
#ifdef XML_NS |
int hadColon; |
#endif |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) |
case BT_EXCL: |
- if ((ptr += MINBPC(enc)) == end) |
- return XML_TOK_PARTIAL; |
+ ptr += MINBPC(enc); |
+ REQUIRE_CHAR(enc, ptr, end); |
switch (BYTE_TYPE(enc, ptr)) { |
case BT_MINUS: |
return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr); |
@@ -716,7 +715,7 @@ PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end, |
hadColon = 0; |
#endif |
/* we have a start-tag */ |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) |
#ifdef XML_NS |
@@ -727,8 +726,7 @@ PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end, |
} |
hadColon = 1; |
ptr += MINBPC(enc); |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) |
default: |
@@ -740,7 +738,7 @@ PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end, |
case BT_S: case BT_CR: case BT_LF: |
{ |
ptr += MINBPC(enc); |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) |
case BT_GT: |
@@ -765,8 +763,7 @@ PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end, |
case BT_SOL: |
sol: |
ptr += MINBPC(enc); |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { |
*nextTokPtr = ptr; |
return XML_TOK_INVALID; |
@@ -785,7 +782,7 @@ static int PTRCALL |
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, |
const char **nextTokPtr) |
{ |
- if (ptr == end) |
+ if (ptr >= end) |
return XML_TOK_NONE; |
if (MINBPC(enc) > 1) { |
size_t n = end - ptr; |
@@ -803,7 +800,7 @@ PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, |
return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); |
case BT_CR: |
ptr += MINBPC(enc); |
- if (ptr == end) |
+ if (! HAS_CHAR(enc, ptr, end)) |
return XML_TOK_TRAILING_CR; |
if (BYTE_TYPE(enc, ptr) == BT_LF) |
ptr += MINBPC(enc); |
@@ -814,12 +811,12 @@ PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, |
return XML_TOK_DATA_NEWLINE; |
case BT_RSQB: |
ptr += MINBPC(enc); |
- if (ptr == end) |
+ if (! HAS_CHAR(enc, ptr, end)) |
return XML_TOK_TRAILING_RSQB; |
if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) |
break; |
ptr += MINBPC(enc); |
- if (ptr == end) |
+ if (! HAS_CHAR(enc, ptr, end)) |
return XML_TOK_TRAILING_RSQB; |
if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { |
ptr -= MINBPC(enc); |
@@ -832,7 +829,7 @@ PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, |
ptr += MINBPC(enc); |
break; |
} |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
#define LEAD_CASE(n) \ |
case BT_LEAD ## n: \ |
@@ -845,12 +842,12 @@ PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, |
LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) |
#undef LEAD_CASE |
case BT_RSQB: |
- if (ptr + MINBPC(enc) != end) { |
+ if (HAS_CHARS(enc, ptr, end, 2)) { |
if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) { |
ptr += MINBPC(enc); |
break; |
} |
- if (ptr + 2*MINBPC(enc) != end) { |
+ if (HAS_CHARS(enc, ptr, end, 3)) { |
if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) { |
ptr += MINBPC(enc); |
break; |
@@ -884,8 +881,7 @@ static int PTRCALL |
PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, |
const char **nextTokPtr) |
{ |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) |
case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: |
@@ -895,7 +891,7 @@ PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, |
*nextTokPtr = ptr; |
return XML_TOK_INVALID; |
} |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) |
case BT_SEMI: |
@@ -913,15 +909,14 @@ static int PTRCALL |
PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, |
const char **nextTokPtr) |
{ |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) |
default: |
*nextTokPtr = ptr; |
return XML_TOK_INVALID; |
} |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) |
case BT_CR: case BT_LF: case BT_S: |
@@ -941,7 +936,7 @@ PREFIX(scanLit)(int open, const ENCODING *enc, |
const char *ptr, const char *end, |
const char **nextTokPtr) |
{ |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
int t = BYTE_TYPE(enc, ptr); |
switch (t) { |
INVALID_CASES(ptr, nextTokPtr) |
@@ -950,7 +945,7 @@ PREFIX(scanLit)(int open, const ENCODING *enc, |
ptr += MINBPC(enc); |
if (t != open) |
break; |
- if (ptr == end) |
+ if (! HAS_CHAR(enc, ptr, end)) |
return -XML_TOK_LITERAL; |
*nextTokPtr = ptr; |
switch (BYTE_TYPE(enc, ptr)) { |
@@ -973,7 +968,7 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, |
const char **nextTokPtr) |
{ |
int tok; |
- if (ptr == end) |
+ if (ptr >= end) |
return XML_TOK_NONE; |
if (MINBPC(enc) > 1) { |
size_t n = end - ptr; |
@@ -992,8 +987,7 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, |
case BT_LT: |
{ |
ptr += MINBPC(enc); |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
switch (BYTE_TYPE(enc, ptr)) { |
case BT_EXCL: |
return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr); |
@@ -1021,7 +1015,7 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, |
case BT_S: case BT_LF: |
for (;;) { |
ptr += MINBPC(enc); |
- if (ptr == end) |
+ if (! HAS_CHAR(enc, ptr, end)) |
break; |
switch (BYTE_TYPE(enc, ptr)) { |
case BT_S: case BT_LF: |
@@ -1048,11 +1042,10 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, |
return XML_TOK_OPEN_BRACKET; |
case BT_RSQB: |
ptr += MINBPC(enc); |
- if (ptr == end) |
+ if (! HAS_CHAR(enc, ptr, end)) |
return -XML_TOK_CLOSE_BRACKET; |
if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { |
- if (ptr + MINBPC(enc) == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHARS(enc, ptr, end, 2); |
if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) { |
*nextTokPtr = ptr + 2*MINBPC(enc); |
return XML_TOK_COND_SECT_CLOSE; |
@@ -1065,7 +1058,7 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, |
return XML_TOK_OPEN_PAREN; |
case BT_RPAR: |
ptr += MINBPC(enc); |
- if (ptr == end) |
+ if (! HAS_CHAR(enc, ptr, end)) |
return -XML_TOK_CLOSE_PAREN; |
switch (BYTE_TYPE(enc, ptr)) { |
case BT_AST: |
@@ -1141,7 +1134,7 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, |
*nextTokPtr = ptr; |
return XML_TOK_INVALID; |
} |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) |
case BT_GT: case BT_RPAR: case BT_COMMA: |
@@ -1154,8 +1147,7 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, |
ptr += MINBPC(enc); |
switch (tok) { |
case XML_TOK_NAME: |
- if (ptr == end) |
- return XML_TOK_PARTIAL; |
+ REQUIRE_CHAR(enc, ptr, end); |
tok = XML_TOK_PREFIXED_NAME; |
switch (BYTE_TYPE(enc, ptr)) { |
CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) |
@@ -1204,10 +1196,12 @@ PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, |
const char *end, const char **nextTokPtr) |
{ |
const char *start; |
- if (ptr == end) |
+ if (ptr >= end) |
return XML_TOK_NONE; |
+ else if (! HAS_CHAR(enc, ptr, end)) |
+ return XML_TOK_PARTIAL; |
start = ptr; |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
#define LEAD_CASE(n) \ |
case BT_LEAD ## n: ptr += n; break; |
@@ -1232,7 +1226,7 @@ PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, |
case BT_CR: |
if (ptr == start) { |
ptr += MINBPC(enc); |
- if (ptr == end) |
+ if (! HAS_CHAR(enc, ptr, end)) |
return XML_TOK_TRAILING_CR; |
if (BYTE_TYPE(enc, ptr) == BT_LF) |
ptr += MINBPC(enc); |
@@ -1262,10 +1256,12 @@ PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, |
const char *end, const char **nextTokPtr) |
{ |
const char *start; |
- if (ptr == end) |
+ if (ptr >= end) |
return XML_TOK_NONE; |
+ else if (! HAS_CHAR(enc, ptr, end)) |
+ return XML_TOK_PARTIAL; |
start = ptr; |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
#define LEAD_CASE(n) \ |
case BT_LEAD ## n: ptr += n; break; |
@@ -1294,7 +1290,7 @@ PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, |
case BT_CR: |
if (ptr == start) { |
ptr += MINBPC(enc); |
- if (ptr == end) |
+ if (! HAS_CHAR(enc, ptr, end)) |
return XML_TOK_TRAILING_CR; |
if (BYTE_TYPE(enc, ptr) == BT_LF) |
ptr += MINBPC(enc); |
@@ -1326,15 +1322,15 @@ PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, |
end = ptr + n; |
} |
} |
- while (ptr != end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
INVALID_CASES(ptr, nextTokPtr) |
case BT_LT: |
- if ((ptr += MINBPC(enc)) == end) |
- return XML_TOK_PARTIAL; |
+ ptr += MINBPC(enc); |
+ REQUIRE_CHAR(enc, ptr, end); |
if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) { |
- if ((ptr += MINBPC(enc)) == end) |
- return XML_TOK_PARTIAL; |
+ ptr += MINBPC(enc); |
+ REQUIRE_CHAR(enc, ptr, end); |
if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) { |
++level; |
ptr += MINBPC(enc); |
@@ -1342,11 +1338,11 @@ PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, |
} |
break; |
case BT_RSQB: |
- if ((ptr += MINBPC(enc)) == end) |
- return XML_TOK_PARTIAL; |
+ ptr += MINBPC(enc); |
+ REQUIRE_CHAR(enc, ptr, end); |
if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { |
- if ((ptr += MINBPC(enc)) == end) |
- return XML_TOK_PARTIAL; |
+ ptr += MINBPC(enc); |
+ REQUIRE_CHAR(enc, ptr, end); |
if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { |
ptr += MINBPC(enc); |
if (level == 0) { |
@@ -1373,7 +1369,7 @@ PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, |
{ |
ptr += MINBPC(enc); |
end -= MINBPC(enc); |
- for (; ptr != end; ptr += MINBPC(enc)) { |
+ for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) { |
switch (BYTE_TYPE(enc, ptr)) { |
case BT_DIGIT: |
case BT_HEX: |
@@ -1521,7 +1517,7 @@ PREFIX(getAtts)(const ENCODING *enc, const char *ptr, |
} |
static int PTRFASTCALL |
-PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) |
+PREFIX(charRefNumber)(const ENCODING *UNUSED_P(enc), const char *ptr) |
{ |
int result = 0; |
/* skip &# */ |
@@ -1565,7 +1561,7 @@ PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) |
} |
static int PTRCALL |
-PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, |
+PREFIX(predefinedEntityName)(const ENCODING *UNUSED_P(enc), const char *ptr, |
const char *end) |
{ |
switch ((end - ptr)/MINBPC(enc)) { |
@@ -1683,11 +1679,11 @@ PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2) |
} |
static int PTRCALL |
-PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, |
+PREFIX(nameMatchesAscii)(const ENCODING *UNUSED_P(enc), const char *ptr1, |
const char *end1, const char *ptr2) |
{ |
for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) { |
- if (ptr1 == end1) |
+ if (end1 - ptr1 < MINBPC(enc)) |
return 0; |
if (!CHAR_MATCHES(enc, ptr1, *ptr2)) |
return 0; |
@@ -1744,7 +1740,7 @@ PREFIX(updatePosition)(const ENCODING *enc, |
const char *end, |
POSITION *pos) |
{ |
- while (ptr < end) { |
+ while (HAS_CHAR(enc, ptr, end)) { |
switch (BYTE_TYPE(enc, ptr)) { |
#define LEAD_CASE(n) \ |
case BT_LEAD ## n: \ |
@@ -1760,7 +1756,7 @@ PREFIX(updatePosition)(const ENCODING *enc, |
case BT_CR: |
pos->lineNumber++; |
ptr += MINBPC(enc); |
- if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF) |
+ if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF) |
ptr += MINBPC(enc); |
pos->columnNumber = (XML_Size)-1; |
break; |