Fixes for CVE-2016-0718 from upstream.diff -r1.771 -r1.772 src/distrib/sets/lists/base/shl.mi
(spz)
--- src/distrib/sets/lists/base/shl.mi 2016/05/14 14:39:39 1.771
+++ src/distrib/sets/lists/base/shl.mi 2016/05/17 23:53:02 1.772
@@ -1,14 +1,14 @@ | @@ -1,14 +1,14 @@ | |||
1 | # $NetBSD: shl.mi,v 1.771 2016/05/14 14:39:39 spz Exp $ | 1 | # $NetBSD: shl.mi,v 1.772 2016/05/17 23:53:02 spz Exp $ | |
2 | # | 2 | # | |
3 | # Note: Don't delete entries from here - mark them as "obsolete" instead, | 3 | # Note: Don't delete entries from here - mark them as "obsolete" instead, | |
4 | # unless otherwise stated below. | 4 | # unless otherwise stated below. | |
5 | # | 5 | # | |
6 | # Note: Do not mark "old" major and major.minor shared libraries as | 6 | # Note: Do not mark "old" major and major.minor shared libraries as | |
7 | # "obsolete"; just remove the entry, as third-party applications | 7 | # "obsolete"; just remove the entry, as third-party applications | |
8 | # may be linked against the old major shared library, and | 8 | # may be linked against the old major shared library, and | |
9 | # that is a symlink to the old major.minor shared library. | 9 | # that is a symlink to the old major.minor shared library. | |
10 | # e.g., "lib<name>.so.<N>" and "lib<name>.so.<N>.<M>" | 10 | # e.g., "lib<name>.so.<N>" and "lib<name>.so.<N>.<M>" | |
11 | # Exceptions to this rule may include shared libraries that | 11 | # Exceptions to this rule may include shared libraries that | |
12 | # are dlopen()ed at run-time, such as extra locales, etc. | 12 | # are dlopen()ed at run-time, such as extra locales, etc. | |
13 | # | 13 | # | |
14 | # Note: libtermcap and libtermlib are hardlinked and share the same version. | 14 | # Note: libtermcap and libtermlib are hardlinked and share the same version. | |
@@ -266,27 +266,27 @@ | @@ -266,27 +266,27 @@ | |||
266 | ./usr/lib/libevent.so.4 base-sys-shlib compatfile | 266 | ./usr/lib/libevent.so.4 base-sys-shlib compatfile | |
267 | ./usr/lib/libevent.so.4.0 base-sys-shlib compatfile | 267 | ./usr/lib/libevent.so.4.0 base-sys-shlib compatfile | |
268 | ./usr/lib/libevent_openssl.so base-sys-shlib compatfile,crypto | 268 | ./usr/lib/libevent_openssl.so base-sys-shlib compatfile,crypto | |
269 | ./usr/lib/libevent_openssl.so.4 base-sys-shlib compatfile,crypto | 269 | ./usr/lib/libevent_openssl.so.4 base-sys-shlib compatfile,crypto | |
270 | ./usr/lib/libevent_openssl.so.4.0 base-sys-shlib compatfile,crypto | 270 | ./usr/lib/libevent_openssl.so.4.0 base-sys-shlib compatfile,crypto | |
271 | ./usr/lib/libevent_pthreads.so base-sys-shlib compatfile | 271 | ./usr/lib/libevent_pthreads.so base-sys-shlib compatfile | |
272 | ./usr/lib/libevent_pthreads.so.4 base-sys-shlib compatfile | 272 | ./usr/lib/libevent_pthreads.so.4 base-sys-shlib compatfile | |
273 | ./usr/lib/libevent_pthreads.so.4.0 base-sys-shlib compatfile | 273 | ./usr/lib/libevent_pthreads.so.4.0 base-sys-shlib compatfile | |
274 | ./usr/lib/libexecinfo.so base-sys-shlib compatfile | 274 | ./usr/lib/libexecinfo.so base-sys-shlib compatfile | |
275 | ./usr/lib/libexecinfo.so.0 base-sys-shlib compatfile | 275 | ./usr/lib/libexecinfo.so.0 base-sys-shlib compatfile | |
276 | ./usr/lib/libexecinfo.so.0.0 base-sys-shlib compatfile | 276 | ./usr/lib/libexecinfo.so.0.0 base-sys-shlib compatfile | |
277 | ./usr/lib/libexpat.so base-sys-shlib compatfile | 277 | ./usr/lib/libexpat.so base-sys-shlib compatfile | |
278 | ./usr/lib/libexpat.so.2 base-sys-shlib compatfile | 278 | ./usr/lib/libexpat.so.2 base-sys-shlib compatfile | |
279 | ./usr/lib/libexpat.so.2.2 base-sys-shlib compatfile | 279 | ./usr/lib/libexpat.so.2.3 base-sys-shlib compatfile | |
280 | ./usr/lib/libfetch.so base-sys-shlib compatfile | 280 | ./usr/lib/libfetch.so base-sys-shlib compatfile | |
281 | ./usr/lib/libfetch.so.3 base-sys-shlib compatfile | 281 | ./usr/lib/libfetch.so.3 base-sys-shlib compatfile | |
282 | ./usr/lib/libfetch.so.3.0 base-sys-shlib compatfile | 282 | ./usr/lib/libfetch.so.3.0 base-sys-shlib compatfile | |
283 | ./usr/lib/libform.so base-sys-shlib compatfile | 283 | ./usr/lib/libform.so base-sys-shlib compatfile | |
284 | ./usr/lib/libform.so.6 base-sys-shlib compatfile | 284 | ./usr/lib/libform.so.6 base-sys-shlib compatfile | |
285 | ./usr/lib/libform.so.6.0 base-sys-shlib compatfile | 285 | ./usr/lib/libform.so.6.0 base-sys-shlib compatfile | |
286 | ./usr/lib/libgcc_s.so base-sys-shlib compatfile,gcc | 286 | ./usr/lib/libgcc_s.so base-sys-shlib compatfile,gcc | |
287 | ./usr/lib/libgcc_s.so.1 base-sys-shlib compatfile,gcc | 287 | ./usr/lib/libgcc_s.so.1 base-sys-shlib compatfile,gcc | |
288 | ./usr/lib/libgcc_s.so.1.0 base-sys-shlib compatfile,gcc | 288 | ./usr/lib/libgcc_s.so.1.0 base-sys-shlib compatfile,gcc | |
289 | ./usr/lib/libgnumalloc.so base-sys-shlib compatfile | 289 | ./usr/lib/libgnumalloc.so base-sys-shlib compatfile | |
290 | ./usr/lib/libgnumalloc.so.1 base-sys-shlib compatfile | 290 | ./usr/lib/libgnumalloc.so.1 base-sys-shlib compatfile | |
291 | ./usr/lib/libgnumalloc.so.1.0 base-sys-shlib compatfile | 291 | ./usr/lib/libgnumalloc.so.1.0 base-sys-shlib compatfile | |
292 | ./usr/lib/libgomp.so base-sys-shlib compatfile,gcc | 292 | ./usr/lib/libgomp.so base-sys-shlib compatfile,gcc |
--- src/distrib/sets/lists/debug/shl.mi 2016/05/14 14:39:39 1.133
+++ src/distrib/sets/lists/debug/shl.mi 2016/05/17 23:53:02 1.134
@@ -1,14 +1,14 @@ | @@ -1,14 +1,14 @@ | |||
1 | # $NetBSD: shl.mi,v 1.133 2016/05/14 14:39:39 spz Exp $ | 1 | # $NetBSD: shl.mi,v 1.134 2016/05/17 23:53:02 spz Exp $ | |
2 | ./usr/libdata/debug/lib base-sys-usr debug,dynamicroot,compatdir | 2 | ./usr/libdata/debug/lib base-sys-usr debug,dynamicroot,compatdir | |
3 | ./usr/libdata/debug/lib/libblacklist.so.0.0.debug comp-sys-debug debug,dynamicroot | 3 | ./usr/libdata/debug/lib/libblacklist.so.0.0.debug comp-sys-debug debug,dynamicroot | |
4 | ./usr/libdata/debug/lib/libc.so.12.202.debug comp-sys-debug debug,dynamicroot | 4 | ./usr/libdata/debug/lib/libc.so.12.202.debug comp-sys-debug debug,dynamicroot | |
5 | ./usr/libdata/debug/lib/libcrypt.so.1.0.debug comp-sys-debug debug,dynamicroot | 5 | ./usr/libdata/debug/lib/libcrypt.so.1.0.debug comp-sys-debug debug,dynamicroot | |
6 | ./usr/libdata/debug/lib/libcrypto.so.11.0.debug comp-sys-debug debug,dynamicroot | 6 | ./usr/libdata/debug/lib/libcrypto.so.11.0.debug comp-sys-debug debug,dynamicroot | |
7 | ./usr/libdata/debug/lib/libdevmapper.so.1.0.debug comp-sys-debug debug,dynamicroot | 7 | ./usr/libdata/debug/lib/libdevmapper.so.1.0.debug comp-sys-debug debug,dynamicroot | |
8 | ./usr/libdata/debug/lib/libdm.so.0.0.debug comp-sys-debug debug,dynamicroot | 8 | ./usr/libdata/debug/lib/libdm.so.0.0.debug comp-sys-debug debug,dynamicroot | |
9 | ./usr/libdata/debug/lib/libedit.so.3.1.debug comp-sys-debug debug,dynamicroot | 9 | ./usr/libdata/debug/lib/libedit.so.3.1.debug comp-sys-debug debug,dynamicroot | |
10 | ./usr/libdata/debug/lib/libevent.so.4.0.debug comp-sys-debug debug,dynamicroot | 10 | ./usr/libdata/debug/lib/libevent.so.4.0.debug comp-sys-debug debug,dynamicroot | |
11 | ./usr/libdata/debug/lib/libgcc_s.so.1.0.debug comp-sys-debug debug,dynamicroot,gcc | 11 | ./usr/libdata/debug/lib/libgcc_s.so.1.0.debug comp-sys-debug debug,dynamicroot,gcc | |
12 | ./usr/libdata/debug/lib/libipsec.so.3.0.debug comp-sys-debug debug,dynamicroot | 12 | ./usr/libdata/debug/lib/libipsec.so.3.0.debug comp-sys-debug debug,dynamicroot | |
13 | ./usr/libdata/debug/lib/libkvm.so.6.0.debug comp-sys-debug debug,dynamicroot | 13 | ./usr/libdata/debug/lib/libkvm.so.6.0.debug comp-sys-debug debug,dynamicroot | |
14 | ./usr/libdata/debug/lib/liblzf.so.1.0.debug comp-sys-debug debug,dynamicroot | 14 | ./usr/libdata/debug/lib/liblzf.so.1.0.debug comp-sys-debug debug,dynamicroot | |
@@ -80,27 +80,27 @@ | @@ -80,27 +80,27 @@ | |||
80 | ./usr/libdata/debug/usr/lib/libdes.so.11.0.debug comp-crypto-debug debug,compatfile,crypto | 80 | ./usr/libdata/debug/usr/lib/libdes.so.11.0.debug comp-crypto-debug debug,compatfile,crypto | |
81 | ./usr/libdata/debug/usr/lib/libdevmapper.so.1.0.debug comp-lvm-debug debug,compatfile,lvm | 81 | ./usr/libdata/debug/usr/lib/libdevmapper.so.1.0.debug comp-lvm-debug debug,compatfile,lvm | |
82 | ./usr/libdata/debug/usr/lib/libdm.so.0.0.debug comp-sys-debug debug,compatfile | 82 | ./usr/libdata/debug/usr/lib/libdm.so.0.0.debug comp-sys-debug debug,compatfile | |
83 | ./usr/libdata/debug/usr/lib/libdns.so.8.4.debug comp-bind-debug debug,compatfile | 83 | ./usr/libdata/debug/usr/lib/libdns.so.8.4.debug comp-bind-debug debug,compatfile | |
84 | ./usr/libdata/debug/usr/lib/libdns_sd.so.0.0.debug comp-mdns-debug debug,compatfile,mdns | 84 | ./usr/libdata/debug/usr/lib/libdns_sd.so.0.0.debug comp-mdns-debug debug,compatfile,mdns | |
85 | ./usr/libdata/debug/usr/lib/libdtrace.so.3.0.debug comp-sys-debug debug,compatfile,dtrace | 85 | ./usr/libdata/debug/usr/lib/libdtrace.so.3.0.debug comp-sys-debug debug,compatfile,dtrace | |
86 | ./usr/libdata/debug/usr/lib/libdwarf.so.2.0.debug comp-sys-debug debug,compatfile | 86 | ./usr/libdata/debug/usr/lib/libdwarf.so.2.0.debug comp-sys-debug debug,compatfile | |
87 | ./usr/libdata/debug/usr/lib/libedit.so.3.1.debug comp-sys-debug debug,compatfile | 87 | ./usr/libdata/debug/usr/lib/libedit.so.3.1.debug comp-sys-debug debug,compatfile | |
88 | ./usr/libdata/debug/usr/lib/libelf.so.2.0.debug comp-sys-debug debug,compatfile | 88 | ./usr/libdata/debug/usr/lib/libelf.so.2.0.debug comp-sys-debug debug,compatfile | |
89 | ./usr/libdata/debug/usr/lib/libevent.so.4.0.debug comp-sys-debug debug,compatfile | 89 | ./usr/libdata/debug/usr/lib/libevent.so.4.0.debug comp-sys-debug debug,compatfile | |
90 | ./usr/libdata/debug/usr/lib/libevent_openssl.so.4.0.debug comp-sys-debug debug,compatfile,crypto | 90 | ./usr/libdata/debug/usr/lib/libevent_openssl.so.4.0.debug comp-sys-debug debug,compatfile,crypto | |
91 | ./usr/libdata/debug/usr/lib/libevent_pthreads.so.4.0.debug comp-sys-debug debug,compatfile | 91 | ./usr/libdata/debug/usr/lib/libevent_pthreads.so.4.0.debug comp-sys-debug debug,compatfile | |
92 | ./usr/libdata/debug/usr/lib/libexecinfo.so.0.0.debug comp-sys-debug debug,compatfile | 92 | ./usr/libdata/debug/usr/lib/libexecinfo.so.0.0.debug comp-sys-debug debug,compatfile | |
93 | ./usr/libdata/debug/usr/lib/libexpat.so.2.2.debug comp-sys-debug debug,compatfile | 93 | ./usr/libdata/debug/usr/lib/libexpat.so.2.3.debug comp-sys-debug debug,compatfile | |
94 | ./usr/libdata/debug/usr/lib/libfetch.so.3.0.debug comp-sys-debug debug,compatfile | 94 | ./usr/libdata/debug/usr/lib/libfetch.so.3.0.debug comp-sys-debug debug,compatfile | |
95 | ./usr/libdata/debug/usr/lib/libform.so.6.0.debug comp-sys-debug debug,compatfile | 95 | ./usr/libdata/debug/usr/lib/libform.so.6.0.debug comp-sys-debug debug,compatfile | |
96 | ./usr/libdata/debug/usr/lib/libg2c.so.2.0.debug comp-sys-debug obsolete | 96 | ./usr/libdata/debug/usr/lib/libg2c.so.2.0.debug comp-sys-debug obsolete | |
97 | ./usr/libdata/debug/usr/lib/libgcc_s.so.1.0.debug comp-sys-debug debug,compatfile,gcc | 97 | ./usr/libdata/debug/usr/lib/libgcc_s.so.1.0.debug comp-sys-debug debug,compatfile,gcc | |
98 | ./usr/libdata/debug/usr/lib/libgmp.so.10.2.debug comp-c-shlib obsolete | 98 | ./usr/libdata/debug/usr/lib/libgmp.so.10.2.debug comp-c-shlib obsolete | |
99 | ./usr/libdata/debug/usr/lib/libgnumalloc.so.1.0.debug comp-sys-debug debug,compatfile | 99 | ./usr/libdata/debug/usr/lib/libgnumalloc.so.1.0.debug comp-sys-debug debug,compatfile | |
100 | ./usr/libdata/debug/usr/lib/libgomp.so.1.1.debug comp-sys-debug debug,compatfile,gcc=48 | 100 | ./usr/libdata/debug/usr/lib/libgomp.so.1.1.debug comp-sys-debug debug,compatfile,gcc=48 | |
101 | ./usr/libdata/debug/usr/lib/libgomp.so.1.2.debug comp-sys-debug debug,compatfile,gcc=53 | 101 | ./usr/libdata/debug/usr/lib/libgomp.so.1.2.debug comp-sys-debug debug,compatfile,gcc=53 | |
102 | ./usr/libdata/debug/usr/lib/libgssapi.so.10.0.debug comp-krb5-debug debug,compatfile,kerberos | 102 | ./usr/libdata/debug/usr/lib/libgssapi.so.10.0.debug comp-krb5-debug debug,compatfile,kerberos | |
103 | ./usr/libdata/debug/usr/lib/libhdb.so.14.0.debug comp-krb5-debug debug,compatfile,kerberos | 103 | ./usr/libdata/debug/usr/lib/libhdb.so.14.0.debug comp-krb5-debug debug,compatfile,kerberos | |
104 | ./usr/libdata/debug/usr/lib/libheimbase.so.1.0.debug comp-krb5-debug debug,compatfile,kerberos | 104 | ./usr/libdata/debug/usr/lib/libheimbase.so.1.0.debug comp-krb5-debug debug,compatfile,kerberos | |
105 | ./usr/libdata/debug/usr/lib/libheimntlm.so.4.0.debug comp-krb5-debug debug,compatfile,kerberos | 105 | ./usr/libdata/debug/usr/lib/libheimntlm.so.4.0.debug comp-krb5-debug debug,compatfile,kerberos | |
106 | ./usr/libdata/debug/usr/lib/libhx509.so.5.0.debug comp-krb5-debug debug,compatfile,kerberos | 106 | ./usr/libdata/debug/usr/lib/libhx509.so.5.0.debug comp-krb5-debug debug,compatfile,kerberos |
--- src/external/mit/expat/dist/lib/xmlparse.c 2016/05/14 14:39:39 1.4
+++ src/external/mit/expat/dist/lib/xmlparse.c 2016/05/17 23:53:02 1.5
@@ -1683,27 +1683,28 @@ XML_GetBuffer(XML_Parser parser, int len | @@ -1683,27 +1683,28 @@ XML_GetBuffer(XML_Parser parser, int len | |||
1683 | return NULL; | 1683 | return NULL; | |
1684 | } | 1684 | } | |
1685 | switch (ps_parsing) { | 1685 | switch (ps_parsing) { | |
1686 | case XML_SUSPENDED: | 1686 | case XML_SUSPENDED: | |
1687 | errorCode = XML_ERROR_SUSPENDED; | 1687 | errorCode = XML_ERROR_SUSPENDED; | |
1688 | return NULL; | 1688 | return NULL; | |
1689 | case XML_FINISHED: | 1689 | case XML_FINISHED: | |
1690 | errorCode = XML_ERROR_FINISHED; | 1690 | errorCode = XML_ERROR_FINISHED; | |
1691 | return NULL; | 1691 | return NULL; | |
1692 | default: ; | 1692 | default: ; | |
1693 | } | 1693 | } | |
1694 | 1694 | |||
1695 | if (len > bufferLim - bufferEnd) { | 1695 | if (len > bufferLim - bufferEnd) { | |
1696 | int neededSize = len + (int)(bufferEnd - bufferPtr); | 1696 | /* Do not invoke signed arithmetic overflow: */ | |
1697 | int neededSize = (int) ((unsigned)len + (unsigned)(bufferEnd - bufferPtr)); | |||
1697 | if (neededSize < 0) { | 1698 | if (neededSize < 0) { | |
1698 | errorCode = XML_ERROR_NO_MEMORY; | 1699 | errorCode = XML_ERROR_NO_MEMORY; | |
1699 | return NULL; | 1700 | return NULL; | |
1700 | } | 1701 | } | |
1701 | #ifdef XML_CONTEXT_BYTES | 1702 | #ifdef XML_CONTEXT_BYTES | |
1702 | int keep = (int)(bufferPtr - buffer); | 1703 | int keep = (int)(bufferPtr - buffer); | |
1703 | 1704 | |||
1704 | if (keep > XML_CONTEXT_BYTES) | 1705 | if (keep > XML_CONTEXT_BYTES) | |
1705 | keep = XML_CONTEXT_BYTES; | 1706 | keep = XML_CONTEXT_BYTES; | |
1706 | neededSize += keep; | 1707 | neededSize += keep; | |
1707 | #endif /* defined XML_CONTEXT_BYTES */ | 1708 | #endif /* defined XML_CONTEXT_BYTES */ | |
1708 | if (neededSize <= bufferLim - buffer) { | 1709 | if (neededSize <= bufferLim - buffer) { | |
1709 | #ifdef XML_CONTEXT_BYTES | 1710 | #ifdef XML_CONTEXT_BYTES | |
@@ -1715,27 +1716,28 @@ XML_GetBuffer(XML_Parser parser, int len | @@ -1715,27 +1716,28 @@ XML_GetBuffer(XML_Parser parser, int len | |||
1715 | } | 1716 | } | |
1716 | #else | 1717 | #else | |
1717 | memmove(buffer, bufferPtr, bufferEnd - bufferPtr); | 1718 | memmove(buffer, bufferPtr, bufferEnd - bufferPtr); | |
1718 | bufferEnd = buffer + (bufferEnd - bufferPtr); | 1719 | bufferEnd = buffer + (bufferEnd - bufferPtr); | |
1719 | bufferPtr = buffer; | 1720 | bufferPtr = buffer; | |
1720 | #endif /* not defined XML_CONTEXT_BYTES */ | 1721 | #endif /* not defined XML_CONTEXT_BYTES */ | |
1721 | } | 1722 | } | |
1722 | else { | 1723 | else { | |
1723 | char *newBuf; | 1724 | char *newBuf; | |
1724 | int bufferSize = (int)(bufferLim - bufferPtr); | 1725 | int bufferSize = (int)(bufferLim - bufferPtr); | |
1725 | if (bufferSize == 0) | 1726 | if (bufferSize == 0) | |
1726 | bufferSize = INIT_BUFFER_SIZE; | 1727 | bufferSize = INIT_BUFFER_SIZE; | |
1727 | do { | 1728 | do { | |
1728 | bufferSize *= 2; | 1729 | /* Do not invoke signed arithmetic overflow: */ | |
1730 | bufferSize = (int) (2U * (unsigned) bufferSize); | |||
1729 | } while (bufferSize < neededSize && bufferSize > 0); | 1731 | } while (bufferSize < neededSize && bufferSize > 0); | |
1730 | if (bufferSize <= 0) { | 1732 | if (bufferSize <= 0) { | |
1731 | errorCode = XML_ERROR_NO_MEMORY; | 1733 | errorCode = XML_ERROR_NO_MEMORY; | |
1732 | return NULL; | 1734 | return NULL; | |
1733 | } | 1735 | } | |
1734 | newBuf = (char *)MALLOC(bufferSize); | 1736 | newBuf = (char *)MALLOC(bufferSize); | |
1735 | if (newBuf == 0) { | 1737 | if (newBuf == 0) { | |
1736 | errorCode = XML_ERROR_NO_MEMORY; | 1738 | errorCode = XML_ERROR_NO_MEMORY; | |
1737 | return NULL; | 1739 | return NULL; | |
1738 | } | 1740 | } | |
1739 | bufferLim = newBuf + bufferSize; | 1741 | bufferLim = newBuf + bufferSize; | |
1740 | #ifdef XML_CONTEXT_BYTES | 1742 | #ifdef XML_CONTEXT_BYTES | |
1741 | if (bufferPtr) { | 1743 | if (bufferPtr) { | |
@@ -2416,31 +2418,31 @@ doContent(XML_Parser parser, | @@ -2416,31 +2418,31 @@ doContent(XML_Parser parser, | |||
2416 | tagStack = tag; | 2418 | tagStack = tag; | |
2417 | tag->name.localPart = NULL; | 2419 | tag->name.localPart = NULL; | |
2418 | tag->name.prefix = NULL; | 2420 | tag->name.prefix = NULL; | |
2419 | tag->rawName = s + enc->minBytesPerChar; | 2421 | tag->rawName = s + enc->minBytesPerChar; | |
2420 | tag->rawNameLength = XmlNameLength(enc, tag->rawName); | 2422 | tag->rawNameLength = XmlNameLength(enc, tag->rawName); | |
2421 | ++tagLevel; | 2423 | ++tagLevel; | |
2422 | { | 2424 | { | |
2423 | const char *rawNameEnd = tag->rawName + tag->rawNameLength; | 2425 | const char *rawNameEnd = tag->rawName + tag->rawNameLength; | |
2424 | const char *fromPtr = tag->rawName; | 2426 | const char *fromPtr = tag->rawName; | |
2425 | toPtr = (XML_Char *)tag->buf; | 2427 | toPtr = (XML_Char *)tag->buf; | |
2426 | for (;;) { | 2428 | for (;;) { | |
2427 | int bufSize; | 2429 | int bufSize; | |
2428 | int convLen; | 2430 | int convLen; | |
2429 | XmlConvert(enc, | 2431 | const enum XML_Convert_Result convert_res = XmlConvert(enc, | |
2430 | &fromPtr, rawNameEnd, | 2432 | &fromPtr, rawNameEnd, | |
2431 | (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); | 2433 | (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); | |
2432 | convLen = (int)(toPtr - (XML_Char *)tag->buf); | 2434 | convLen = (int)(toPtr - (XML_Char *)tag->buf); | |
2433 | if (fromPtr == rawNameEnd) { | 2435 | if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) { | |
2434 | tag->name.strLen = convLen; | 2436 | tag->name.strLen = convLen; | |
2435 | break; | 2437 | break; | |
2436 | } | 2438 | } | |
2437 | bufSize = (int)(tag->bufEnd - tag->buf) << 1; | 2439 | bufSize = (int)(tag->bufEnd - tag->buf) << 1; | |
2438 | { | 2440 | { | |
2439 | char *temp = (char *)REALLOC(tag->buf, bufSize); | 2441 | char *temp = (char *)REALLOC(tag->buf, bufSize); | |
2440 | if (temp == NULL) | 2442 | if (temp == NULL) | |
2441 | return XML_ERROR_NO_MEMORY; | 2443 | return XML_ERROR_NO_MEMORY; | |
2442 | tag->buf = temp; | 2444 | tag->buf = temp; | |
2443 | tag->bufEnd = temp + bufSize; | 2445 | tag->bufEnd = temp + bufSize; | |
2444 | toPtr = (XML_Char *)temp + convLen; | 2446 | toPtr = (XML_Char *)temp + convLen; | |
2445 | } | 2447 | } | |
2446 | } | 2448 | } | |
@@ -2641,31 +2643,31 @@ doContent(XML_Parser parser, | @@ -2641,31 +2643,31 @@ doContent(XML_Parser parser, | |||
2641 | if (tagLevel != startTagLevel) { | 2643 | if (tagLevel != startTagLevel) { | |
2642 | *eventPP = end; | 2644 | *eventPP = end; | |
2643 | return XML_ERROR_ASYNC_ENTITY; | 2645 | return XML_ERROR_ASYNC_ENTITY; | |
2644 | } | 2646 | } | |
2645 | *nextPtr = end; | 2647 | *nextPtr = end; | |
2646 | return XML_ERROR_NONE; | 2648 | return XML_ERROR_NONE; | |
2647 | case XML_TOK_DATA_CHARS: | 2649 | case XML_TOK_DATA_CHARS: | |
2648 | { | 2650 | { | |
2649 | XML_CharacterDataHandler charDataHandler = characterDataHandler; | 2651 | XML_CharacterDataHandler charDataHandler = characterDataHandler; | |
2650 | if (charDataHandler) { | 2652 | if (charDataHandler) { | |
2651 | if (MUST_CONVERT(enc, s)) { | 2653 | if (MUST_CONVERT(enc, s)) { | |
2652 | for (;;) { | 2654 | for (;;) { | |
2653 | ICHAR *dataPtr = (ICHAR *)dataBuf; | 2655 | ICHAR *dataPtr = (ICHAR *)dataBuf; | |
2654 | XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); | 2656 | const enum XML_Convert_Result convert_res = XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); | |
2655 | *eventEndPP = s; | 2657 | *eventEndPP = s; | |
2656 | charDataHandler(handlerArg, dataBuf, | 2658 | charDataHandler(handlerArg, dataBuf, | |
2657 | (int)(dataPtr - (ICHAR *)dataBuf)); | 2659 | (int)(dataPtr - (ICHAR *)dataBuf)); | |
2658 | if (s == next) | 2660 | if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) | |
2659 | break; | 2661 | break; | |
2660 | *eventPP = s; | 2662 | *eventPP = s; | |
2661 | } | 2663 | } | |
2662 | } | 2664 | } | |
2663 | else | 2665 | else | |
2664 | charDataHandler(handlerArg, | 2666 | charDataHandler(handlerArg, | |
2665 | (XML_Char *)s, | 2667 | (XML_Char *)s, | |
2666 | (int)((XML_Char *)next - (XML_Char *)s)); | 2668 | (int)((XML_Char *)next - (XML_Char *)s)); | |
2667 | } | 2669 | } | |
2668 | else if (defaultHandler) | 2670 | else if (defaultHandler) | |
2669 | reportDefault(parser, enc, s, next); | 2671 | reportDefault(parser, enc, s, next); | |
2670 | } | 2672 | } | |
2671 | break; | 2673 | break; | |
@@ -3251,31 +3253,31 @@ doCdataSection(XML_Parser parser, | @@ -3251,31 +3253,31 @@ doCdataSection(XML_Parser parser, | |||
3251 | XML_Char c = 0xA; | 3253 | XML_Char c = 0xA; | |
3252 | characterDataHandler(handlerArg, &c, 1); | 3254 | characterDataHandler(handlerArg, &c, 1); | |
3253 | } | 3255 | } | |
3254 | else if (defaultHandler) | 3256 | else if (defaultHandler) | |
3255 | reportDefault(parser, enc, s, next); | 3257 | reportDefault(parser, enc, s, next); | |
3256 | break; | 3258 | break; | |
3257 | case XML_TOK_DATA_CHARS: | 3259 | case XML_TOK_DATA_CHARS: | |
3258 | { | 3260 | { | |
3259 | XML_CharacterDataHandler charDataHandler = characterDataHandler; | 3261 | XML_CharacterDataHandler charDataHandler = characterDataHandler; | |
3260 | if (charDataHandler) { | 3262 | if (charDataHandler) { | |
3261 | if (MUST_CONVERT(enc, s)) { | 3263 | if (MUST_CONVERT(enc, s)) { | |
3262 | for (;;) { | 3264 | for (;;) { | |
3263 | ICHAR *dataPtr = (ICHAR *)dataBuf; | 3265 | ICHAR *dataPtr = (ICHAR *)dataBuf; | |
3264 | XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); | 3266 | const enum XML_Convert_Result convert_res = XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); | |
3265 | *eventEndPP = next; | 3267 | *eventEndPP = next; | |
3266 | charDataHandler(handlerArg, dataBuf, | 3268 | charDataHandler(handlerArg, dataBuf, | |
3267 | (int)(dataPtr - (ICHAR *)dataBuf)); | 3269 | (int)(dataPtr - (ICHAR *)dataBuf)); | |
3268 | if (s == next) | 3270 | if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) | |
3269 | break; | 3271 | break; | |
3270 | *eventPP = s; | 3272 | *eventPP = s; | |
3271 | } | 3273 | } | |
3272 | } | 3274 | } | |
3273 | else | 3275 | else | |
3274 | charDataHandler(handlerArg, | 3276 | charDataHandler(handlerArg, | |
3275 | (XML_Char *)s, | 3277 | (XML_Char *)s, | |
3276 | (int)((XML_Char *)next - (XML_Char *)s)); | 3278 | (int)((XML_Char *)next - (XML_Char *)s)); | |
3277 | } | 3279 | } | |
3278 | else if (defaultHandler) | 3280 | else if (defaultHandler) | |
3279 | reportDefault(parser, enc, s, next); | 3281 | reportDefault(parser, enc, s, next); | |
3280 | } | 3282 | } | |
3281 | break; | 3283 | break; | |
@@ -5332,43 +5334,44 @@ reportComment(XML_Parser parser, const E | @@ -5332,43 +5334,44 @@ reportComment(XML_Parser parser, const E | |||
5332 | if (!data) | 5334 | if (!data) | |
5333 | return 0; | 5335 | return 0; | |
5334 | normalizeLines(data); | 5336 | normalizeLines(data); | |
5335 | commentHandler(handlerArg, data); | 5337 | commentHandler(handlerArg, data); | |
5336 | poolClear(&tempPool); | 5338 | poolClear(&tempPool); | |
5337 | return 1; | 5339 | return 1; | |
5338 | } | 5340 | } | |
5339 | 5341 | |||
5340 | static void | 5342 | static void | |
5341 | reportDefault(XML_Parser parser, const ENCODING *enc, | 5343 | reportDefault(XML_Parser parser, const ENCODING *enc, | |
5342 | const char *s, const char *end) | 5344 | const char *s, const char *end) | |
5343 | { | 5345 | { | |
5344 | if (MUST_CONVERT(enc, s)) { | 5346 | if (MUST_CONVERT(enc, s)) { | |
5347 | enum XML_Convert_Result convert_res; | |||
5345 | const char **eventPP; | 5348 | const char **eventPP; | |
5346 | const char **eventEndPP; | 5349 | const char **eventEndPP; | |
5347 | if (enc == encoding) { | 5350 | if (enc == encoding) { | |
5348 | eventPP = &eventPtr; | 5351 | eventPP = &eventPtr; | |
5349 | eventEndPP = &eventEndPtr; | 5352 | eventEndPP = &eventEndPtr; | |
5350 | } | 5353 | } | |
5351 | else { | 5354 | else { | |
5352 | eventPP = &(openInternalEntities->internalEventPtr); | 5355 | eventPP = &(openInternalEntities->internalEventPtr); | |
5353 | eventEndPP = &(openInternalEntities->internalEventEndPtr); | 5356 | eventEndPP = &(openInternalEntities->internalEventEndPtr); | |
5354 | } | 5357 | } | |
5355 | do { | 5358 | do { | |
5356 | ICHAR *dataPtr = (ICHAR *)dataBuf; | 5359 | ICHAR *dataPtr = (ICHAR *)dataBuf; | |
5357 | XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); | 5360 | convert_res = XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); | |
5358 | *eventEndPP = s; | 5361 | *eventEndPP = s; | |
5359 | defaultHandler(handlerArg, dataBuf, (int)(dataPtr - (ICHAR *)dataBuf)); | 5362 | defaultHandler(handlerArg, dataBuf, (int)(dataPtr - (ICHAR *)dataBuf)); | |
5360 | *eventPP = s; | 5363 | *eventPP = s; | |
5361 | } while (s != end); | 5364 | } while ((convert_res != XML_CONVERT_COMPLETED) && (convert_res != XML_CONVERT_INPUT_INCOMPLETE)); | |
5362 | } | 5365 | } | |
5363 | else | 5366 | else | |
5364 | defaultHandler(handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s)); | 5367 | defaultHandler(handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s)); | |
5365 | } | 5368 | } | |
5366 | 5369 | |||
5367 | 5370 | |||
5368 | static int | 5371 | static int | |
5369 | defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, | 5372 | defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, | |
5370 | XML_Bool isId, const XML_Char *value, XML_Parser parser) | 5373 | XML_Bool isId, const XML_Char *value, XML_Parser parser) | |
5371 | { | 5374 | { | |
5372 | DEFAULT_ATTRIBUTE *att; | 5375 | DEFAULT_ATTRIBUTE *att; | |
5373 | if (value || isId) { | 5376 | if (value || isId) { | |
5374 | /* The handling of default attributes gets messed up if we have | 5377 | /* The handling of default attributes gets messed up if we have | |
@@ -6153,28 +6156,28 @@ poolDestroy(STRING_POOL *pool) | @@ -6153,28 +6156,28 @@ poolDestroy(STRING_POOL *pool) | |||
6153 | BLOCK *tem = p->next; | 6156 | BLOCK *tem = p->next; | |
6154 | pool->mem->free_fcn(p); | 6157 | pool->mem->free_fcn(p); | |
6155 | p = tem; | 6158 | p = tem; | |
6156 | } | 6159 | } | |
6157 | } | 6160 | } | |
6158 | 6161 | |||
6159 | static XML_Char * | 6162 | static XML_Char * | |
6160 | poolAppend(STRING_POOL *pool, const ENCODING *enc, | 6163 | poolAppend(STRING_POOL *pool, const ENCODING *enc, | |
6161 | const char *ptr, const char *end) | 6164 | const char *ptr, const char *end) | |
6162 | { | 6165 | { | |
6163 | if (!pool->ptr && !poolGrow(pool)) | 6166 | if (!pool->ptr && !poolGrow(pool)) | |
6164 | return NULL; | 6167 | return NULL; | |
6165 | for (;;) { | 6168 | for (;;) { | |
6166 | XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); | 6169 | const enum XML_Convert_Result convert_res = XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); | |
6167 | if (ptr == end) | 6170 | if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) | |
6168 | break; | 6171 | break; | |
6169 | if (!poolGrow(pool)) | 6172 | if (!poolGrow(pool)) | |
6170 | return NULL; | 6173 | return NULL; | |
6171 | } | 6174 | } | |
6172 | return pool->start; | 6175 | return pool->start; | |
6173 | } | 6176 | } | |
6174 | 6177 | |||
6175 | static const XML_Char * FASTCALL | 6178 | static const XML_Char * FASTCALL | |
6176 | poolCopyString(STRING_POOL *pool, const XML_Char *s) | 6179 | poolCopyString(STRING_POOL *pool, const XML_Char *s) | |
6177 | { | 6180 | { | |
6178 | do { | 6181 | do { | |
6179 | if (!poolAppendChar(pool, *s)) | 6182 | if (!poolAppendChar(pool, *s)) | |
6180 | return NULL; | 6183 | return NULL; | |
@@ -6238,42 +6241,51 @@ poolGrow(STRING_POOL *pool) | @@ -6238,42 +6241,51 @@ poolGrow(STRING_POOL *pool) | |||
6238 | BLOCK *tem = pool->freeBlocks->next; | 6241 | BLOCK *tem = pool->freeBlocks->next; | |
6239 | pool->freeBlocks->next = pool->blocks; | 6242 | pool->freeBlocks->next = pool->blocks; | |
6240 | pool->blocks = pool->freeBlocks; | 6243 | pool->blocks = pool->freeBlocks; | |
6241 | pool->freeBlocks = tem; | 6244 | pool->freeBlocks = tem; | |
6242 | memcpy(pool->blocks->s, pool->start, | 6245 | memcpy(pool->blocks->s, pool->start, | |
6243 | (pool->end - pool->start) * sizeof(XML_Char)); | 6246 | (pool->end - pool->start) * sizeof(XML_Char)); | |
6244 | pool->ptr = pool->blocks->s + (pool->ptr - pool->start); | 6247 | pool->ptr = pool->blocks->s + (pool->ptr - pool->start); | |
6245 | pool->start = pool->blocks->s; | 6248 | pool->start = pool->blocks->s; | |
6246 | pool->end = pool->start + pool->blocks->size; | 6249 | pool->end = pool->start + pool->blocks->size; | |
6247 | return XML_TRUE; | 6250 | return XML_TRUE; | |
6248 | } | 6251 | } | |
6249 | } | 6252 | } | |
6250 | if (pool->blocks && pool->start == pool->blocks->s) { | 6253 | if (pool->blocks && pool->start == pool->blocks->s) { | |
6251 | int blockSize = (int)(pool->end - pool->start)*2; | 6254 | BLOCK *temp; | |
6252 | BLOCK *temp = (BLOCK *) | 6255 | int blockSize = (int)((unsigned)(pool->end - pool->start)*2U); | |
6256 | ||||
6257 | if (blockSize < 0) | |||
6258 | return XML_FALSE; | |||
6259 | ||||
6260 | temp = (BLOCK *) | |||
6253 | pool->mem->realloc_fcn(pool->blocks, | 6261 | pool->mem->realloc_fcn(pool->blocks, | |
6254 | (offsetof(BLOCK, s) | 6262 | (offsetof(BLOCK, s) | |
6255 | + blockSize * sizeof(XML_Char))); | 6263 | + blockSize * sizeof(XML_Char))); | |
6256 | if (temp == NULL) | 6264 | if (temp == NULL) | |
6257 | return XML_FALSE; | 6265 | return XML_FALSE; | |
6258 | pool->blocks = temp; | 6266 | pool->blocks = temp; | |
6259 | pool->blocks->size = blockSize; | 6267 | pool->blocks->size = blockSize; | |
6260 | pool->ptr = pool->blocks->s + (pool->ptr - pool->start); | 6268 | pool->ptr = pool->blocks->s + (pool->ptr - pool->start); | |
6261 | pool->start = pool->blocks->s; | 6269 | pool->start = pool->blocks->s; | |
6262 | pool->end = pool->start + blockSize; | 6270 | pool->end = pool->start + blockSize; | |
6263 | } | 6271 | } | |
6264 | else { | 6272 | else { | |
6265 | BLOCK *tem; | 6273 | BLOCK *tem; | |
6266 | int blockSize = (int)(pool->end - pool->start); | 6274 | int blockSize = (int)(pool->end - pool->start); | |
6275 | ||||
6276 | if (blockSize < 0) | |||
6277 | return XML_FALSE; | |||
6278 | ||||
6267 | if (blockSize < INIT_BLOCK_SIZE) | 6279 | if (blockSize < INIT_BLOCK_SIZE) | |
6268 | blockSize = INIT_BLOCK_SIZE; | 6280 | blockSize = INIT_BLOCK_SIZE; | |
6269 | else | 6281 | else | |
6270 | blockSize *= 2; | 6282 | blockSize *= 2; | |
6271 | tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s) | 6283 | tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s) | |
6272 | + blockSize * sizeof(XML_Char)); | 6284 | + blockSize * sizeof(XML_Char)); | |
6273 | if (!tem) | 6285 | if (!tem) | |
6274 | return XML_FALSE; | 6286 | return XML_FALSE; | |
6275 | tem->size = blockSize; | 6287 | tem->size = blockSize; | |
6276 | tem->next = pool->blocks; | 6288 | tem->next = pool->blocks; | |
6277 | pool->blocks = tem; | 6289 | pool->blocks = tem; | |
6278 | if (pool->ptr != pool->start) | 6290 | if (pool->ptr != pool->start) | |
6279 | memcpy(tem->s, pool->start, | 6291 | memcpy(tem->s, pool->start, |
--- src/external/mit/expat/dist/lib/xmltok.c 2012/04/06 10:23:40 1.1.1.2
+++ src/external/mit/expat/dist/lib/xmltok.c 2016/05/17 23:53:02 1.2
@@ -36,50 +36,50 @@ | @@ -36,50 +36,50 @@ | |||
36 | PREFIX(sameName), \ | 36 | PREFIX(sameName), \ | |
37 | PREFIX(nameMatchesAscii), \ | 37 | PREFIX(nameMatchesAscii), \ | |
38 | PREFIX(nameLength), \ | 38 | PREFIX(nameLength), \ | |
39 | PREFIX(skipS), \ | 39 | PREFIX(skipS), \ | |
40 | PREFIX(getAtts), \ | 40 | PREFIX(getAtts), \ | |
41 | PREFIX(charRefNumber), \ | 41 | PREFIX(charRefNumber), \ | |
42 | PREFIX(predefinedEntityName), \ | 42 | PREFIX(predefinedEntityName), \ | |
43 | PREFIX(updatePosition), \ | 43 | PREFIX(updatePosition), \ | |
44 | PREFIX(isPublicId) | 44 | PREFIX(isPublicId) | |
45 | 45 | |||
46 | #define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) | 46 | #define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) | |
47 | 47 | |||
48 | #define UCS2_GET_NAMING(pages, hi, lo) \ | 48 | #define UCS2_GET_NAMING(pages, hi, lo) \ | |
49 | (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1 << ((lo) & 0x1F))) | 49 | (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1u << ((lo) & 0x1F))) | |
50 | 50 | |||
51 | /* A 2 byte UTF-8 representation splits the characters 11 bits between | 51 | /* A 2 byte UTF-8 representation splits the characters 11 bits between | |
52 | the bottom 5 and 6 bits of the bytes. We need 8 bits to index into | 52 | the bottom 5 and 6 bits of the bytes. We need 8 bits to index into | |
53 | pages, 3 bits to add to that index and 5 bits to generate the mask. | 53 | pages, 3 bits to add to that index and 5 bits to generate the mask. | |
54 | */ | 54 | */ | |
55 | #define UTF8_GET_NAMING2(pages, byte) \ | 55 | #define UTF8_GET_NAMING2(pages, byte) \ | |
56 | (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ | 56 | (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ | |
57 | + ((((byte)[0]) & 3) << 1) \ | 57 | + ((((byte)[0]) & 3) << 1) \ | |
58 | + ((((byte)[1]) >> 5) & 1)] \ | 58 | + ((((byte)[1]) >> 5) & 1)] \ | |
59 | & (1 << (((byte)[1]) & 0x1F))) | 59 | & (1u << (((byte)[1]) & 0x1F))) | |
60 | 60 | |||
61 | /* A 3 byte UTF-8 representation splits the characters 16 bits between | 61 | /* A 3 byte UTF-8 representation splits the characters 16 bits between | |
62 | the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index | 62 | the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index | |
63 | into pages, 3 bits to add to that index and 5 bits to generate the | 63 | into pages, 3 bits to add to that index and 5 bits to generate the | |
64 | mask. | 64 | mask. | |
65 | */ | 65 | */ | |
66 | #define UTF8_GET_NAMING3(pages, byte) \ | 66 | #define UTF8_GET_NAMING3(pages, byte) \ | |
67 | (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \ | 67 | (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \ | |
68 | + ((((byte)[1]) >> 2) & 0xF)] \ | 68 | + ((((byte)[1]) >> 2) & 0xF)] \ | |
69 | << 3) \ | 69 | << 3) \ | |
70 | + ((((byte)[1]) & 3) << 1) \ | 70 | + ((((byte)[1]) & 3) << 1) \ | |
71 | + ((((byte)[2]) >> 5) & 1)] \ | 71 | + ((((byte)[2]) >> 5) & 1)] \ | |
72 | & (1 << (((byte)[2]) & 0x1F))) | 72 | & (1u << (((byte)[2]) & 0x1F))) | |
73 | 73 | |||
74 | #define UTF8_GET_NAMING(pages, p, n) \ | 74 | #define UTF8_GET_NAMING(pages, p, n) \ | |
75 | ((n) == 2 \ | 75 | ((n) == 2 \ | |
76 | ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ | 76 | ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ | |
77 | : ((n) == 3 \ | 77 | : ((n) == 3 \ | |
78 | ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \ | 78 | ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \ | |
79 | : 0)) | 79 | : 0)) | |
80 | 80 | |||
81 | /* Detection of invalid UTF-8 sequences is based on Table 3.1B | 81 | /* Detection of invalid UTF-8 sequences is based on Table 3.1B | |
82 | of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/ | 82 | of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/ | |
83 | with the additional restriction of not allowing the Unicode | 83 | with the additional restriction of not allowing the Unicode | |
84 | code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE). | 84 | code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE). | |
85 | Implementation details: | 85 | Implementation details: | |
@@ -308,85 +308,108 @@ sb_charMatches(const ENCODING *enc, cons | @@ -308,85 +308,108 @@ sb_charMatches(const ENCODING *enc, cons | |||
308 | #undef IS_NAME_CHAR | 308 | #undef IS_NAME_CHAR | |
309 | #undef IS_NAME_CHAR_MINBPC | 309 | #undef IS_NAME_CHAR_MINBPC | |
310 | #undef IS_NMSTRT_CHAR | 310 | #undef IS_NMSTRT_CHAR | |
311 | #undef IS_NMSTRT_CHAR_MINBPC | 311 | #undef IS_NMSTRT_CHAR_MINBPC | |
312 | #undef IS_INVALID_CHAR | 312 | #undef IS_INVALID_CHAR | |
313 | 313 | |||
314 | enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ | 314 | enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ | |
315 | UTF8_cval1 = 0x00, | 315 | UTF8_cval1 = 0x00, | |
316 | UTF8_cval2 = 0xc0, | 316 | UTF8_cval2 = 0xc0, | |
317 | UTF8_cval3 = 0xe0, | 317 | UTF8_cval3 = 0xe0, | |
318 | UTF8_cval4 = 0xf0 | 318 | UTF8_cval4 = 0xf0 | |
319 | }; | 319 | }; | |
320 | 320 | |||
321 | static void PTRCALL | 321 | static enum XML_Convert_Result PTRCALL | |
322 | utf8_toUtf8(const ENCODING *enc, | 322 | utf8_toUtf8(const ENCODING *enc, | |
323 | const char **fromP, const char *fromLim, | 323 | const char **fromP, const char *fromLim, | |
324 | char **toP, const char *toLim) | 324 | char **toP, const char *toLim) | |
325 | { | 325 | { | |
326 | enum XML_Convert_Result res = XML_CONVERT_COMPLETED; | |||
326 | char *to; | 327 | char *to; | |
327 | const char *from; | 328 | const char *from; | |
328 | if (fromLim - *fromP > toLim - *toP) { | 329 | if (fromLim - *fromP > toLim - *toP) { | |
329 | /* Avoid copying partial characters. */ | 330 | /* Avoid copying partial characters. */ | |
331 | res = XML_CONVERT_OUTPUT_EXHAUSTED; | |||
330 | for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) | 332 | for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) | |
331 | if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) | 333 | if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) | |
332 | break; | 334 | break; | |
333 | } | 335 | } | |
334 | for (to = *toP, from = *fromP; from != fromLim; from++, to++) | 336 | for (to = *toP, from = *fromP; (from < fromLim) && (to < toLim); from++, to++) | |
335 | *to = *from; | 337 | *to = *from; | |
336 | *fromP = from; | 338 | *fromP = from; | |
337 | *toP = to; | 339 | *toP = to; | |
340 | ||||
341 | if ((to == toLim) && (from < fromLim)) | |||
342 | return XML_CONVERT_OUTPUT_EXHAUSTED; | |||
343 | else | |||
344 | return res; | |||
338 | } | 345 | } | |
339 | 346 | |||
340 | static void PTRCALL | 347 | static enum XML_Convert_Result PTRCALL | |
341 | utf8_toUtf16(const ENCODING *enc, | 348 | utf8_toUtf16(const ENCODING *enc, | |
342 | const char **fromP, const char *fromLim, | 349 | const char **fromP, const char *fromLim, | |
343 | unsigned short **toP, const unsigned short *toLim) | 350 | unsigned short **toP, const unsigned short *toLim) | |
344 | { | 351 | { | |
352 | enum XML_Convert_Result res = XML_CONVERT_COMPLETED; | |||
345 | unsigned short *to = *toP; | 353 | unsigned short *to = *toP; | |
346 | const char *from = *fromP; | 354 | const char *from = *fromP; | |
347 | while (from != fromLim && to != toLim) { | 355 | while (from < fromLim && to < toLim) { | |
348 | switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) { | 356 | switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) { | |
349 | case BT_LEAD2: | 357 | case BT_LEAD2: | |
358 | if (fromLim - from < 2) { | |||
359 | res = XML_CONVERT_INPUT_INCOMPLETE; | |||
360 | break; | |||
361 | } | |||
350 | *to++ = (unsigned short)(((from[0] & 0x1f) << 6) | (from[1] & 0x3f)); | 362 | *to++ = (unsigned short)(((from[0] & 0x1f) << 6) | (from[1] & 0x3f)); | |
351 | from += 2; | 363 | from += 2; | |
352 | break; | 364 | break; | |
353 | case BT_LEAD3: | 365 | case BT_LEAD3: | |
366 | if (fromLim - from < 3) { | |||
367 | res = XML_CONVERT_INPUT_INCOMPLETE; | |||
368 | break; | |||
369 | } | |||
354 | *to++ = (unsigned short)(((from[0] & 0xf) << 12) | 370 | *to++ = (unsigned short)(((from[0] & 0xf) << 12) | |
355 | | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f)); | 371 | | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f)); | |
356 | from += 3; | 372 | from += 3; | |
357 | break; | 373 | break; | |
358 | case BT_LEAD4: | 374 | case BT_LEAD4: | |
359 | { | 375 | { | |
360 | unsigned long n; | 376 | unsigned long n; | |
361 | if (to + 1 == toLim) | 377 | if (toLim - to < 2) { | |
378 | res = XML_CONVERT_OUTPUT_EXHAUSTED; | |||
362 | goto after; | 379 | goto after; | |
380 | } | |||
381 | if (fromLim - from < 4) { | |||
382 | res = XML_CONVERT_INPUT_INCOMPLETE; | |||
383 | goto after; | |||
384 | } | |||
363 | n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) | 385 | n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) | |
364 | | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); | 386 | | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); | |
365 | n -= 0x10000; | 387 | n -= 0x10000; | |
366 | to[0] = (unsigned short)((n >> 10) | 0xD800); | 388 | to[0] = (unsigned short)((n >> 10) | 0xD800); | |
367 | to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); | 389 | to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); | |
368 | to += 2; | 390 | to += 2; | |
369 | from += 4; | 391 | from += 4; | |
370 | } | 392 | } | |
371 | break; | 393 | break; | |
372 | default: | 394 | default: | |
373 | *to++ = *from++; | 395 | *to++ = *from++; | |
374 | break; | 396 | break; | |
375 | } | 397 | } | |
376 | } | 398 | } | |
377 | after: | 399 | after: | |
378 | *fromP = from; | 400 | *fromP = from; | |
379 | *toP = to; | 401 | *toP = to; | |
402 | return res; | |||
380 | } | 403 | } | |
381 | 404 | |||
382 | #ifdef XML_NS | 405 | #ifdef XML_NS | |
383 | static const struct normal_encoding utf8_encoding_ns = { | 406 | static const struct normal_encoding utf8_encoding_ns = { | |
384 | { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, | 407 | { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, | |
385 | { | 408 | { | |
386 | #include "asciitab.h" | 409 | #include "asciitab.h" | |
387 | #include "utf8tab.h" | 410 | #include "utf8tab.h" | |
388 | }, | 411 | }, | |
389 | STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) | 412 | STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) | |
390 | }; | 413 | }; | |
391 | #endif | 414 | #endif | |
392 | 415 | |||
@@ -415,91 +438,101 @@ static const struct normal_encoding inte | @@ -415,91 +438,101 @@ static const struct normal_encoding inte | |||
415 | #endif | 438 | #endif | |
416 | 439 | |||
417 | static const struct normal_encoding internal_utf8_encoding = { | 440 | static const struct normal_encoding internal_utf8_encoding = { | |
418 | { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, | 441 | { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, | |
419 | { | 442 | { | |
420 | #define BT_COLON BT_NMSTRT | 443 | #define BT_COLON BT_NMSTRT | |
421 | #include "iasciitab.h" | 444 | #include "iasciitab.h" | |
422 | #undef BT_COLON | 445 | #undef BT_COLON | |
423 | #include "utf8tab.h" | 446 | #include "utf8tab.h" | |
424 | }, | 447 | }, | |
425 | STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) | 448 | STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) | |
426 | }; | 449 | }; | |
427 | 450 | |||
428 | static void PTRCALL | 451 | static enum XML_Convert_Result PTRCALL | |
429 | latin1_toUtf8(const ENCODING *enc, | 452 | latin1_toUtf8(const ENCODING *enc, | |
430 | const char **fromP, const char *fromLim, | 453 | const char **fromP, const char *fromLim, | |
431 | char **toP, const char *toLim) | 454 | char **toP, const char *toLim) | |
432 | { | 455 | { | |
433 | for (;;) { | 456 | for (;;) { | |
434 | unsigned char c; | 457 | unsigned char c; | |
435 | if (*fromP == fromLim) | 458 | if (*fromP == fromLim) | |
436 | break; | 459 | return XML_CONVERT_COMPLETED; | |
437 | c = (unsigned char)**fromP; | 460 | c = (unsigned char)**fromP; | |
438 | if (c & 0x80) { | 461 | if (c & 0x80) { | |
439 | if (toLim - *toP < 2) | 462 | if (toLim - *toP < 2) | |
440 | break; | 463 | return XML_CONVERT_OUTPUT_EXHAUSTED; | |
441 | *(*toP)++ = (char)((c >> 6) | UTF8_cval2); | 464 | *(*toP)++ = (char)((c >> 6) | UTF8_cval2); | |
442 | *(*toP)++ = (char)((c & 0x3f) | 0x80); | 465 | *(*toP)++ = (char)((c & 0x3f) | 0x80); | |
443 | (*fromP)++; | 466 | (*fromP)++; | |
444 | } | 467 | } | |
445 | else { | 468 | else { | |
446 | if (*toP == toLim) | 469 | if (*toP == toLim) | |
447 | break; | 470 | return XML_CONVERT_OUTPUT_EXHAUSTED; | |
448 | *(*toP)++ = *(*fromP)++; | 471 | *(*toP)++ = *(*fromP)++; | |
449 | } | 472 | } | |
450 | } | 473 | } | |
451 | } | 474 | } | |
452 | 475 | |||
453 | static void PTRCALL | 476 | static enum XML_Convert_Result PTRCALL | |
454 | latin1_toUtf16(const ENCODING *enc, | 477 | latin1_toUtf16(const ENCODING *enc, | |
455 | const char **fromP, const char *fromLim, | 478 | const char **fromP, const char *fromLim, | |
456 | unsigned short **toP, const unsigned short *toLim) | 479 | unsigned short **toP, const unsigned short *toLim) | |
457 | { | 480 | { | |
458 | while (*fromP != fromLim && *toP != toLim) | 481 | while (*fromP < fromLim && *toP < toLim) | |
459 | *(*toP)++ = (unsigned char)*(*fromP)++; | 482 | *(*toP)++ = (unsigned char)*(*fromP)++; | |
483 | ||||
484 | if ((*toP == toLim) && (*fromP < fromLim)) | |||
485 | return XML_CONVERT_OUTPUT_EXHAUSTED; | |||
486 | else | |||
487 | return XML_CONVERT_COMPLETED; | |||
460 | } | 488 | } | |
461 | 489 | |||
462 | #ifdef XML_NS | 490 | #ifdef XML_NS | |
463 | 491 | |||
464 | static const struct normal_encoding latin1_encoding_ns = { | 492 | static const struct normal_encoding latin1_encoding_ns = { | |
465 | { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, | 493 | { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, | |
466 | { | 494 | { | |
467 | #include "asciitab.h" | 495 | #include "asciitab.h" | |
468 | #include "latin1tab.h" | 496 | #include "latin1tab.h" | |
469 | }, | 497 | }, | |
470 | STANDARD_VTABLE(sb_) | 498 | STANDARD_VTABLE(sb_) | |
471 | }; | 499 | }; | |
472 | 500 | |||
473 | #endif | 501 | #endif | |
474 | 502 | |||
475 | static const struct normal_encoding latin1_encoding = { | 503 | static const struct normal_encoding latin1_encoding = { | |
476 | { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, | 504 | { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, | |
477 | { | 505 | { | |
478 | #define BT_COLON BT_NMSTRT | 506 | #define BT_COLON BT_NMSTRT | |
479 | #include "asciitab.h" | 507 | #include "asciitab.h" | |
480 | #undef BT_COLON | 508 | #undef BT_COLON | |
481 | #include "latin1tab.h" | 509 | #include "latin1tab.h" | |
482 | }, | 510 | }, | |
483 | STANDARD_VTABLE(sb_) | 511 | STANDARD_VTABLE(sb_) | |
484 | }; | 512 | }; | |
485 | 513 | |||
486 | static void PTRCALL | 514 | static enum XML_Convert_Result PTRCALL | |
487 | ascii_toUtf8(const ENCODING *enc, | 515 | ascii_toUtf8(const ENCODING *enc, | |
488 | const char **fromP, const char *fromLim, | 516 | const char **fromP, const char *fromLim, | |
489 | char **toP, const char *toLim) | 517 | char **toP, const char *toLim) | |
490 | { | 518 | { | |
491 | while (*fromP != fromLim && *toP != toLim) | 519 | while (*fromP < fromLim && *toP < toLim) | |
492 | *(*toP)++ = *(*fromP)++; | 520 | *(*toP)++ = *(*fromP)++; | |
521 | ||||
522 | if ((*toP == toLim) && (*fromP < fromLim)) | |||
523 | return XML_CONVERT_OUTPUT_EXHAUSTED; | |||
524 | else | |||
525 | return XML_CONVERT_COMPLETED; | |||
493 | } | 526 | } | |
494 | 527 | |||
495 | #ifdef XML_NS | 528 | #ifdef XML_NS | |
496 | 529 | |||
497 | static const struct normal_encoding ascii_encoding_ns = { | 530 | static const struct normal_encoding ascii_encoding_ns = { | |
498 | { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, | 531 | { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, | |
499 | { | 532 | { | |
500 | #include "asciitab.h" | 533 | #include "asciitab.h" | |
501 | /* BT_NONXML == 0 */ | 534 | /* BT_NONXML == 0 */ | |
502 | }, | 535 | }, | |
503 | STANDARD_VTABLE(sb_) | 536 | STANDARD_VTABLE(sb_) | |
504 | }; | 537 | }; | |
505 | 538 | |||
@@ -526,100 +559,117 @@ unicode_byte_type(char hi, char lo) | @@ -526,100 +559,117 @@ unicode_byte_type(char hi, char lo) | |||
526 | return BT_TRAIL; | 559 | return BT_TRAIL; | |
527 | case 0xFF: | 560 | case 0xFF: | |
528 | switch ((unsigned char)lo) { | 561 | switch ((unsigned char)lo) { | |
529 | case 0xFF: | 562 | case 0xFF: | |
530 | case 0xFE: | 563 | case 0xFE: | |
531 | return BT_NONXML; | 564 | return BT_NONXML; | |
532 | } | 565 | } | |
533 | break; | 566 | break; | |
534 | } | 567 | } | |
535 | return BT_NONASCII; | 568 | return BT_NONASCII; | |
536 | } | 569 | } | |
537 | 570 | |||
538 | #define DEFINE_UTF16_TO_UTF8(E) \ | 571 | #define DEFINE_UTF16_TO_UTF8(E) \ | |
539 | static void PTRCALL \ | 572 | static enum XML_Convert_Result PTRCALL \ | |
540 | E ## toUtf8(const ENCODING *enc, \ | 573 | E ## toUtf8(const ENCODING *enc, \ | |
541 | const char **fromP, const char *fromLim, \ | 574 | const char **fromP, const char *fromLim, \ | |
542 | char **toP, const char *toLim) \ | 575 | char **toP, const char *toLim) \ | |
543 | { \ | 576 | { \ | |
544 | const char *from; \ | 577 | const char *from = *fromP; \ | |
545 | for (from = *fromP; from != fromLim; from += 2) { \ | 578 | fromLim = from + (((fromLim - from) >> 1) << 1); /* shrink to even */ \ | |
579 | for (; from < fromLim; from += 2) { \ | |||
546 | int plane; \ | 580 | int plane; \ | |
547 | unsigned char lo2; \ | 581 | unsigned char lo2; \ | |
548 | unsigned char lo = GET_LO(from); \ | 582 | unsigned char lo = GET_LO(from); \ | |
549 | unsigned char hi = GET_HI(from); \ | 583 | unsigned char hi = GET_HI(from); \ | |
550 | switch (hi) { \ | 584 | switch (hi) { \ | |
551 | case 0: \ | 585 | case 0: \ | |
552 | if (lo < 0x80) { \ | 586 | if (lo < 0x80) { \ | |
553 | if (*toP == toLim) { \ | 587 | if (*toP == toLim) { \ | |
554 | *fromP = from; \ | 588 | *fromP = from; \ | |
555 | return; \ | 589 | return XML_CONVERT_OUTPUT_EXHAUSTED; \ | |
556 | } \ | 590 | } \ | |
557 | *(*toP)++ = lo; \ | 591 | *(*toP)++ = lo; \ | |
558 | break; \ | 592 | break; \ | |
559 | } \ | 593 | } \ | |
560 | /* fall through */ \ | 594 | /* fall through */ \ | |
561 | case 0x1: case 0x2: case 0x3: \ | 595 | case 0x1: case 0x2: case 0x3: \ | |
562 | case 0x4: case 0x5: case 0x6: case 0x7: \ | 596 | case 0x4: case 0x5: case 0x6: case 0x7: \ | |
563 | if (toLim - *toP < 2) { \ | 597 | if (toLim - *toP < 2) { \ | |
564 | *fromP = from; \ | 598 | *fromP = from; \ | |
565 | return; \ | 599 | return XML_CONVERT_OUTPUT_EXHAUSTED; \ | |
566 | } \ | 600 | } \ | |
567 | *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ | 601 | *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ | |
568 | *(*toP)++ = ((lo & 0x3f) | 0x80); \ | 602 | *(*toP)++ = ((lo & 0x3f) | 0x80); \ | |
569 | break; \ | 603 | break; \ | |
570 | default: \ | 604 | default: \ | |
571 | if (toLim - *toP < 3) { \ | 605 | if (toLim - *toP < 3) { \ | |
572 | *fromP = from; \ | 606 | *fromP = from; \ | |
573 | return; \ | 607 | return XML_CONVERT_OUTPUT_EXHAUSTED; \ | |
574 | } \ | 608 | } \ | |
575 | /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ | 609 | /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ | |
576 | *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ | 610 | *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ | |
577 | *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ | 611 | *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ | |
578 | *(*toP)++ = ((lo & 0x3f) | 0x80); \ | 612 | *(*toP)++ = ((lo & 0x3f) | 0x80); \ | |
579 | break; \ | 613 | break; \ | |
580 | case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ | 614 | case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ | |
581 | if (toLim - *toP < 4) { \ | 615 | if (toLim - *toP < 4) { \ | |
582 | *fromP = from; \ | 616 | *fromP = from; \ | |
583 | return; \ | 617 | return XML_CONVERT_OUTPUT_EXHAUSTED; \ | |
618 | } \ | |||
619 | if (from + 4 > fromLim) { \ | |||
620 | *fromP = from; \ | |||
621 | return XML_CONVERT_INPUT_INCOMPLETE; \ | |||
584 | } \ | 622 | } \ | |
585 | plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ | 623 | plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ | |
586 | *(*toP)++ = ((plane >> 2) | UTF8_cval4); \ | 624 | *(*toP)++ = ((plane >> 2) | UTF8_cval4); \ | |
587 | *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ | 625 | *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ | |
588 | from += 2; \ | 626 | from += 2; \ | |
589 | lo2 = GET_LO(from); \ | 627 | lo2 = GET_LO(from); \ | |
590 | *(*toP)++ = (((lo & 0x3) << 4) \ | 628 | *(*toP)++ = (((lo & 0x3) << 4) \ | |
591 | | ((GET_HI(from) & 0x3) << 2) \ | 629 | | ((GET_HI(from) & 0x3) << 2) \ | |
592 | | (lo2 >> 6) \ | 630 | | (lo2 >> 6) \ | |
593 | | 0x80); \ | 631 | | 0x80); \ | |
594 | *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ | 632 | *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ | |
595 | break; \ | 633 | break; \ | |
596 | } \ | 634 | } \ | |
597 | } \ | 635 | } \ | |
598 | *fromP = from; \ | 636 | *fromP = from; \ | |
637 | if (from < fromLim) \ | |||
638 | return XML_CONVERT_INPUT_INCOMPLETE; \ | |||
639 | else \ | |||
640 | return XML_CONVERT_COMPLETED; \ | |||
599 | } | 641 | } | |
600 | 642 | |||
601 | #define DEFINE_UTF16_TO_UTF16(E) \ | 643 | #define DEFINE_UTF16_TO_UTF16(E) \ | |
602 | static void PTRCALL \ | 644 | static enum XML_Convert_Result PTRCALL \ | |
603 | E ## toUtf16(const ENCODING *enc, \ | 645 | E ## toUtf16(const ENCODING *enc, \ | |
604 | const char **fromP, const char *fromLim, \ | 646 | const char **fromP, const char *fromLim, \ | |
605 | unsigned short **toP, const unsigned short *toLim) \ | 647 | unsigned short **toP, const unsigned short *toLim) \ | |
606 | { \ | 648 | { \ | |
649 | enum XML_Convert_Result res = XML_CONVERT_COMPLETED; \ | |||
650 | fromLim = *fromP + (((fromLim - *fromP) >> 1) << 1); /* shrink to even */ \ | |||
607 | /* Avoid copying first half only of surrogate */ \ | 651 | /* Avoid copying first half only of surrogate */ \ | |
608 | if (fromLim - *fromP > ((toLim - *toP) << 1) \ | 652 | if (fromLim - *fromP > ((toLim - *toP) << 1) \ | |
609 | && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \ | 653 | && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) { \ | |
610 | fromLim -= 2; \ | 654 | fromLim -= 2; \ | |
611 | for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \ | 655 | res = XML_CONVERT_INPUT_INCOMPLETE; \ | |
656 | } \ | |||
657 | for (; *fromP < fromLim && *toP < toLim; *fromP += 2) \ | |||
612 | *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ | 658 | *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ | |
659 | if ((*toP == toLim) && (*fromP < fromLim)) \ | |||
660 | return XML_CONVERT_OUTPUT_EXHAUSTED; \ | |||
661 | else \ | |||
662 | return res; \ | |||
613 | } | 663 | } | |
614 | 664 | |||
615 | #define SET2(ptr, ch) \ | 665 | #define SET2(ptr, ch) \ | |
616 | (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8))) | 666 | (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8))) | |
617 | #define GET_LO(ptr) ((unsigned char)(ptr)[0]) | 667 | #define GET_LO(ptr) ((unsigned char)(ptr)[0]) | |
618 | #define GET_HI(ptr) ((unsigned char)(ptr)[1]) | 668 | #define GET_HI(ptr) ((unsigned char)(ptr)[1]) | |
619 | 669 | |||
620 | DEFINE_UTF16_TO_UTF8(little2_) | 670 | DEFINE_UTF16_TO_UTF8(little2_) | |
621 | DEFINE_UTF16_TO_UTF16(little2_) | 671 | DEFINE_UTF16_TO_UTF16(little2_) | |
622 | 672 | |||
623 | #undef SET2 | 673 | #undef SET2 | |
624 | #undef GET_LO | 674 | #undef GET_LO | |
625 | #undef GET_HI | 675 | #undef GET_HI | |
@@ -1278,78 +1328,83 @@ unknown_isNmstrt(const ENCODING *enc, co | @@ -1278,78 +1328,83 @@ unknown_isNmstrt(const ENCODING *enc, co | |||
1278 | if (c & ~0xFFFF) | 1328 | if (c & ~0xFFFF) | |
1279 | return 0; | 1329 | return 0; | |
1280 | return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF); | 1330 | return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF); | |
1281 | } | 1331 | } | |
1282 | 1332 | |||
1283 | static int PTRFASTCALL | 1333 | static int PTRFASTCALL | |
1284 | unknown_isInvalid(const ENCODING *enc, const char *p) | 1334 | unknown_isInvalid(const ENCODING *enc, const char *p) | |
1285 | { | 1335 | { | |
1286 | const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); | 1336 | const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); | |
1287 | int c = uenc->convert(uenc->userData, p); | 1337 | int c = uenc->convert(uenc->userData, p); | |
1288 | return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; | 1338 | return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; | |
1289 | } | 1339 | } | |
1290 | 1340 | |||
1291 | static void PTRCALL | 1341 | static enum XML_Convert_Result PTRCALL | |
1292 | unknown_toUtf8(const ENCODING *enc, | 1342 | unknown_toUtf8(const ENCODING *enc, | |
1293 | const char **fromP, const char *fromLim, | 1343 | const char **fromP, const char *fromLim, | |
1294 | char **toP, const char *toLim) | 1344 | char **toP, const char *toLim) | |
1295 | { | 1345 | { | |
1296 | const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); | 1346 | const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); | |
1297 | char buf[XML_UTF8_ENCODE_MAX]; | 1347 | char buf[XML_UTF8_ENCODE_MAX]; | |
1298 | for (;;) { | 1348 | for (;;) { | |
1299 | const char *utf8; | 1349 | const char *utf8; | |
1300 | int n; | 1350 | int n; | |
1301 | if (*fromP == fromLim) | 1351 | if (*fromP == fromLim) | |
1302 | break; | 1352 | return XML_CONVERT_COMPLETED; | |
1303 | utf8 = uenc->utf8[(unsigned char)**fromP]; | 1353 | utf8 = uenc->utf8[(unsigned char)**fromP]; | |
1304 | n = *utf8++; | 1354 | n = *utf8++; | |
1305 | if (n == 0) { | 1355 | if (n == 0) { | |
1306 | int c = uenc->convert(uenc->userData, *fromP); | 1356 | int c = uenc->convert(uenc->userData, *fromP); | |
1307 | n = XmlUtf8Encode(c, buf); | 1357 | n = XmlUtf8Encode(c, buf); | |
1308 | if (n > toLim - *toP) | 1358 | if (n > toLim - *toP) | |
1309 | break; | 1359 | return XML_CONVERT_OUTPUT_EXHAUSTED; | |
1310 | utf8 = buf; | 1360 | utf8 = buf; | |
1311 | *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] | 1361 | *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] | |
1312 | - (BT_LEAD2 - 2)); | 1362 | - (BT_LEAD2 - 2)); | |
1313 | } | 1363 | } | |
1314 | else { | 1364 | else { | |
1315 | if (n > toLim - *toP) | 1365 | if (n > toLim - *toP) | |
1316 | break; | 1366 | return XML_CONVERT_OUTPUT_EXHAUSTED; | |
1317 | (*fromP)++; | 1367 | (*fromP)++; | |
1318 | } | 1368 | } | |
1319 | do { | 1369 | do { | |
1320 | *(*toP)++ = *utf8++; | 1370 | *(*toP)++ = *utf8++; | |
1321 | } while (--n != 0); | 1371 | } while (--n != 0); | |
1322 | } | 1372 | } | |
1323 | } | 1373 | } | |
1324 | 1374 | |||
1325 | static void PTRCALL | 1375 | static enum XML_Convert_Result PTRCALL | |
1326 | unknown_toUtf16(const ENCODING *enc, | 1376 | unknown_toUtf16(const ENCODING *enc, | |
1327 | const char **fromP, const char *fromLim, | 1377 | const char **fromP, const char *fromLim, | |
1328 | unsigned short **toP, const unsigned short *toLim) | 1378 | unsigned short **toP, const unsigned short *toLim) | |
1329 | { | 1379 | { | |
1330 | const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); | 1380 | const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); | |
1331 | while (*fromP != fromLim && *toP != toLim) { | 1381 | while (*fromP < fromLim && *toP < toLim) { | |
1332 | unsigned short c = uenc->utf16[(unsigned char)**fromP]; | 1382 | unsigned short c = uenc->utf16[(unsigned char)**fromP]; | |
1333 | if (c == 0) { | 1383 | if (c == 0) { | |
1334 | c = (unsigned short) | 1384 | c = (unsigned short) | |
1335 | uenc->convert(uenc->userData, *fromP); | 1385 | uenc->convert(uenc->userData, *fromP); | |
1336 | *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] | 1386 | *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] | |
1337 | - (BT_LEAD2 - 2)); | 1387 | - (BT_LEAD2 - 2)); | |
1338 | } | 1388 | } | |
1339 | else | 1389 | else | |
1340 | (*fromP)++; | 1390 | (*fromP)++; | |
1341 | *(*toP)++ = c; | 1391 | *(*toP)++ = c; | |
1342 | } | 1392 | } | |
1393 | ||||
1394 | if ((*toP == toLim) && (*fromP < fromLim)) | |||
1395 | return XML_CONVERT_OUTPUT_EXHAUSTED; | |||
1396 | else | |||
1397 | return XML_CONVERT_COMPLETED; | |||
1343 | } | 1398 | } | |
1344 | 1399 | |||
1345 | ENCODING * | 1400 | ENCODING * | |
1346 | XmlInitUnknownEncoding(void *mem, | 1401 | XmlInitUnknownEncoding(void *mem, | |
1347 | int *table, | 1402 | int *table, | |
1348 | CONVERTER convert, | 1403 | CONVERTER convert, | |
1349 | void *userData) | 1404 | void *userData) | |
1350 | { | 1405 | { | |
1351 | int i; | 1406 | int i; | |
1352 | struct unknown_encoding *e = (struct unknown_encoding *)mem; | 1407 | struct unknown_encoding *e = (struct unknown_encoding *)mem; | |
1353 | for (i = 0; i < (int)sizeof(struct normal_encoding); i++) | 1408 | for (i = 0; i < (int)sizeof(struct normal_encoding); i++) | |
1354 | ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; | 1409 | ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; | |
1355 | for (i = 0; i < 128; i++) | 1410 | for (i = 0; i < 128; i++) | |
@@ -1493,27 +1548,27 @@ getEncodingIndex(const char *name) | @@ -1493,27 +1548,27 @@ getEncodingIndex(const char *name) | |||
1493 | */ | 1548 | */ | |
1494 | 1549 | |||
1495 | 1550 | |||
1496 | static int | 1551 | static int | |
1497 | initScan(const ENCODING * const *encodingTable, | 1552 | initScan(const ENCODING * const *encodingTable, | |
1498 | const INIT_ENCODING *enc, | 1553 | const INIT_ENCODING *enc, | |
1499 | int state, | 1554 | int state, | |
1500 | const char *ptr, | 1555 | const char *ptr, | |
1501 | const char *end, | 1556 | const char *end, | |
1502 | const char **nextTokPtr) | 1557 | const char **nextTokPtr) | |
1503 | { | 1558 | { | |
1504 | const ENCODING **encPtr; | 1559 | const ENCODING **encPtr; | |
1505 | 1560 | |||
1506 | if (ptr == end) | 1561 | if (ptr >= end) | |
1507 | return XML_TOK_NONE; | 1562 | return XML_TOK_NONE; | |
1508 | encPtr = enc->encPtr; | 1563 | encPtr = enc->encPtr; | |
1509 | if (ptr + 1 == end) { | 1564 | if (ptr + 1 == end) { | |
1510 | /* only a single byte available for auto-detection */ | 1565 | /* only a single byte available for auto-detection */ | |
1511 | #ifndef XML_DTD /* FIXME */ | 1566 | #ifndef XML_DTD /* FIXME */ | |
1512 | /* a well-formed document entity must have more than one byte */ | 1567 | /* a well-formed document entity must have more than one byte */ | |
1513 | if (state != XML_CONTENT_STATE) | 1568 | if (state != XML_CONTENT_STATE) | |
1514 | return XML_TOK_PARTIAL; | 1569 | return XML_TOK_PARTIAL; | |
1515 | #endif | 1570 | #endif | |
1516 | /* so we're parsing an external text entity... */ | 1571 | /* so we're parsing an external text entity... */ | |
1517 | /* if UTF-16 was externally specified, then we need at least 2 bytes */ | 1572 | /* if UTF-16 was externally specified, then we need at least 2 bytes */ | |
1518 | switch (INIT_ENC_INDEX(enc)) { | 1573 | switch (INIT_ENC_INDEX(enc)) { | |
1519 | case UTF_16_ENC: | 1574 | case UTF_16_ENC: |
--- src/external/mit/expat/dist/lib/xmltok.h 2012/02/11 18:18:16 1.1.1.1
+++ src/external/mit/expat/dist/lib/xmltok.h 2016/05/17 23:53:02 1.2
@@ -120,26 +120,32 @@ typedef struct { | @@ -120,26 +120,32 @@ typedef struct { | |||
120 | const char *valuePtr; | 120 | const char *valuePtr; | |
121 | const char *valueEnd; | 121 | const char *valueEnd; | |
122 | char normalized; | 122 | char normalized; | |
123 | } ATTRIBUTE; | 123 | } ATTRIBUTE; | |
124 | 124 | |||
125 | struct encoding; | 125 | struct encoding; | |
126 | typedef struct encoding ENCODING; | 126 | typedef struct encoding ENCODING; | |
127 | 127 | |||
128 | typedef int (PTRCALL *SCANNER)(const ENCODING *, | 128 | typedef int (PTRCALL *SCANNER)(const ENCODING *, | |
129 | const char *, | 129 | const char *, | |
130 | const char *, | 130 | const char *, | |
131 | const char **); | 131 | const char **); | |
132 | 132 | |||
133 | enum XML_Convert_Result { | |||
134 | XML_CONVERT_COMPLETED = 0, | |||
135 | XML_CONVERT_INPUT_INCOMPLETE = 1, | |||
136 | XML_CONVERT_OUTPUT_EXHAUSTED = 2 /* and therefore potentially input remaining as well */ | |||
137 | }; | |||
138 | ||||
133 | struct encoding { | 139 | struct encoding { | |
134 | SCANNER scanners[XML_N_STATES]; | 140 | SCANNER scanners[XML_N_STATES]; | |
135 | SCANNER literalScanners[XML_N_LITERAL_TYPES]; | 141 | SCANNER literalScanners[XML_N_LITERAL_TYPES]; | |
136 | int (PTRCALL *sameName)(const ENCODING *, | 142 | int (PTRCALL *sameName)(const ENCODING *, | |
137 | const char *, | 143 | const char *, | |
138 | const char *); | 144 | const char *); | |
139 | int (PTRCALL *nameMatchesAscii)(const ENCODING *, | 145 | int (PTRCALL *nameMatchesAscii)(const ENCODING *, | |
140 | const char *, | 146 | const char *, | |
141 | const char *, | 147 | const char *, | |
142 | const char *); | 148 | const char *); | |
143 | int (PTRFASTCALL *nameLength)(const ENCODING *, const char *); | 149 | int (PTRFASTCALL *nameLength)(const ENCODING *, const char *); | |
144 | const char *(PTRFASTCALL *skipS)(const ENCODING *, const char *); | 150 | const char *(PTRFASTCALL *skipS)(const ENCODING *, const char *); | |
145 | int (PTRCALL *getAtts)(const ENCODING *enc, | 151 | int (PTRCALL *getAtts)(const ENCODING *enc, | |
@@ -148,32 +154,32 @@ struct encoding { | @@ -148,32 +154,32 @@ struct encoding { | |||
148 | ATTRIBUTE *atts); | 154 | ATTRIBUTE *atts); | |
149 | int (PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr); | 155 | int (PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr); | |
150 | int (PTRCALL *predefinedEntityName)(const ENCODING *, | 156 | int (PTRCALL *predefinedEntityName)(const ENCODING *, | |
151 | const char *, | 157 | const char *, | |
152 | const char *); | 158 | const char *); | |
153 | void (PTRCALL *updatePosition)(const ENCODING *, | 159 | void (PTRCALL *updatePosition)(const ENCODING *, | |
154 | const char *ptr, | 160 | const char *ptr, | |
155 | const char *end, | 161 | const char *end, | |
156 | POSITION *); | 162 | POSITION *); | |
157 | int (PTRCALL *isPublicId)(const ENCODING *enc, | 163 | int (PTRCALL *isPublicId)(const ENCODING *enc, | |
158 | const char *ptr, | 164 | const char *ptr, | |
159 | const char *end, | 165 | const char *end, | |
160 | const char **badPtr); | 166 | const char **badPtr); | |
161 | void (PTRCALL *utf8Convert)(const ENCODING *enc, | 167 | enum XML_Convert_Result (PTRCALL *utf8Convert)(const ENCODING *enc, | |
162 | const char **fromP, | 168 | const char **fromP, | |
163 | const char *fromLim, | 169 | const char *fromLim, | |
164 | char **toP, | 170 | char **toP, | |
165 | const char *toLim); | 171 | const char *toLim); | |
166 | void (PTRCALL *utf16Convert)(const ENCODING *enc, | 172 | enum XML_Convert_Result (PTRCALL *utf16Convert)(const ENCODING *enc, | |
167 | const char **fromP, | 173 | const char **fromP, | |
168 | const char *fromLim, | 174 | const char *fromLim, | |
169 | unsigned short **toP, | 175 | unsigned short **toP, | |
170 | const unsigned short *toLim); | 176 | const unsigned short *toLim); | |
171 | int minBytesPerChar; | 177 | int minBytesPerChar; | |
172 | char isUtf8; | 178 | char isUtf8; | |
173 | char isUtf16; | 179 | char isUtf16; | |
174 | }; | 180 | }; | |
175 | 181 | |||
176 | /* Scan the string starting at ptr until the end of the next complete | 182 | /* Scan the string starting at ptr until the end of the next complete | |
177 | token, but do not scan past eptr. Return an integer giving the | 183 | token, but do not scan past eptr. Return an integer giving the | |
178 | type of token. | 184 | type of token. | |
179 | 185 |
--- src/external/mit/expat/dist/lib/xmltok_impl.c 2012/04/06 10:46:13 1.3
+++ src/external/mit/expat/dist/lib/xmltok_impl.c 2016/05/17 23:53:02 1.4
@@ -83,33 +83,33 @@ | @@ -83,33 +83,33 @@ | |||
83 | CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \ | 83 | CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \ | |
84 | CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr) | 84 | CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr) | |
85 | 85 | |||
86 | #ifndef PREFIX | 86 | #ifndef PREFIX | |
87 | #define PREFIX(ident) ident | 87 | #define PREFIX(ident) ident | |
88 | #endif | 88 | #endif | |
89 | 89 | |||
90 | /* ptr points to character following "<!-" */ | 90 | /* ptr points to character following "<!-" */ | |
91 | 91 | |||
92 | static int PTRCALL | 92 | static int PTRCALL | |
93 | PREFIX(scanComment)(const ENCODING *enc, const char *ptr, | 93 | PREFIX(scanComment)(const ENCODING *enc, const char *ptr, | |
94 | const char *end, const char **nextTokPtr) | 94 | const char *end, const char **nextTokPtr) | |
95 | { | 95 | { | |
96 | if (ptr != end) { | 96 | if (ptr < end) { | |
97 | if (!CHAR_MATCHES(enc, ptr, ASCII_MINUS)) { | 97 | if (!CHAR_MATCHES(enc, ptr, ASCII_MINUS)) { | |
98 | *nextTokPtr = ptr; | 98 | *nextTokPtr = ptr; | |
99 | return XML_TOK_INVALID; | 99 | return XML_TOK_INVALID; | |
100 | } | 100 | } | |
101 | ptr += MINBPC(enc); | 101 | ptr += MINBPC(enc); | |
102 | while (ptr != end) { | 102 | while (ptr < end) { | |
103 | switch (BYTE_TYPE(enc, ptr)) { | 103 | switch (BYTE_TYPE(enc, ptr)) { | |
104 | INVALID_CASES(ptr, nextTokPtr) | 104 | INVALID_CASES(ptr, nextTokPtr) | |
105 | case BT_MINUS: | 105 | case BT_MINUS: | |
106 | if ((ptr += MINBPC(enc)) == end) | 106 | if ((ptr += MINBPC(enc)) == end) | |
107 | return XML_TOK_PARTIAL; | 107 | return XML_TOK_PARTIAL; | |
108 | if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) { | 108 | if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) { | |
109 | if ((ptr += MINBPC(enc)) == end) | 109 | if ((ptr += MINBPC(enc)) == end) | |
110 | return XML_TOK_PARTIAL; | 110 | return XML_TOK_PARTIAL; | |
111 | if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { | 111 | if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { | |
112 | *nextTokPtr = ptr; | 112 | *nextTokPtr = ptr; | |
113 | return XML_TOK_INVALID; | 113 | return XML_TOK_INVALID; | |
114 | } | 114 | } | |
115 | *nextTokPtr = ptr + MINBPC(enc); | 115 | *nextTokPtr = ptr + MINBPC(enc); | |
@@ -137,27 +137,27 @@ PREFIX(scanDecl)(const ENCODING *enc, co | @@ -137,27 +137,27 @@ PREFIX(scanDecl)(const ENCODING *enc, co | |||
137 | case BT_MINUS: | 137 | case BT_MINUS: | |
138 | return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr); | 138 | return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr); | |
139 | case BT_LSQB: | 139 | case BT_LSQB: | |
140 | *nextTokPtr = ptr + MINBPC(enc); | 140 | *nextTokPtr = ptr + MINBPC(enc); | |
141 | return XML_TOK_COND_SECT_OPEN; | 141 | return XML_TOK_COND_SECT_OPEN; | |
142 | case BT_NMSTRT: | 142 | case BT_NMSTRT: | |
143 | case BT_HEX: | 143 | case BT_HEX: | |
144 | ptr += MINBPC(enc); | 144 | ptr += MINBPC(enc); | |
145 | break; | 145 | break; | |
146 | default: | 146 | default: | |
147 | *nextTokPtr = ptr; | 147 | *nextTokPtr = ptr; | |
148 | return XML_TOK_INVALID; | 148 | return XML_TOK_INVALID; | |
149 | } | 149 | } | |
150 | while (ptr != end) { | 150 | while (ptr < end) { | |
151 | switch (BYTE_TYPE(enc, ptr)) { | 151 | switch (BYTE_TYPE(enc, ptr)) { | |
152 | case BT_PERCNT: | 152 | case BT_PERCNT: | |
153 | if (ptr + MINBPC(enc) == end) | 153 | if (ptr + MINBPC(enc) == end) | |
154 | return XML_TOK_PARTIAL; | 154 | return XML_TOK_PARTIAL; | |
155 | /* don't allow <!ENTITY% foo "whatever"> */ | 155 | /* don't allow <!ENTITY% foo "whatever"> */ | |
156 | switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { | 156 | switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { | |
157 | case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: | 157 | case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: | |
158 | *nextTokPtr = ptr; | 158 | *nextTokPtr = ptr; | |
159 | return XML_TOK_INVALID; | 159 | return XML_TOK_INVALID; | |
160 | } | 160 | } | |
161 | /* fall through */ | 161 | /* fall through */ | |
162 | case BT_S: case BT_CR: case BT_LF: | 162 | case BT_S: case BT_CR: case BT_LF: | |
163 | *nextTokPtr = ptr; | 163 | *nextTokPtr = ptr; | |
@@ -223,36 +223,36 @@ static int PTRCALL | @@ -223,36 +223,36 @@ static int PTRCALL | |||
223 | PREFIX(scanPi)(const ENCODING *enc, const char *ptr, | 223 | PREFIX(scanPi)(const ENCODING *enc, const char *ptr, | |
224 | const char *end, const char **nextTokPtr) | 224 | const char *end, const char **nextTokPtr) | |
225 | { | 225 | { | |
226 | int tok; | 226 | int tok; | |
227 | const char *target = ptr; | 227 | const char *target = ptr; | |
228 | if (ptr == end) | 228 | if (ptr == end) | |
229 | return XML_TOK_PARTIAL; | 229 | return XML_TOK_PARTIAL; | |
230 | switch (BYTE_TYPE(enc, ptr)) { | 230 | switch (BYTE_TYPE(enc, ptr)) { | |
231 | CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) | 231 | CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) | |
232 | default: | 232 | default: | |
233 | *nextTokPtr = ptr; | 233 | *nextTokPtr = ptr; | |
234 | return XML_TOK_INVALID; | 234 | return XML_TOK_INVALID; | |
235 | } | 235 | } | |
236 | while (ptr != end) { | 236 | while (ptr < end) { | |
237 | switch (BYTE_TYPE(enc, ptr)) { | 237 | switch (BYTE_TYPE(enc, ptr)) { | |
238 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | 238 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | |
239 | case BT_S: case BT_CR: case BT_LF: | 239 | case BT_S: case BT_CR: case BT_LF: | |
240 | if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) { | 240 | if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) { | |
241 | *nextTokPtr = ptr; | 241 | *nextTokPtr = ptr; | |
242 | return XML_TOK_INVALID; | 242 | return XML_TOK_INVALID; | |
243 | } | 243 | } | |
244 | ptr += MINBPC(enc); | 244 | ptr += MINBPC(enc); | |
245 | while (ptr != end) { | 245 | while (ptr < end) { | |
246 | switch (BYTE_TYPE(enc, ptr)) { | 246 | switch (BYTE_TYPE(enc, ptr)) { | |
247 | INVALID_CASES(ptr, nextTokPtr) | 247 | INVALID_CASES(ptr, nextTokPtr) | |
248 | case BT_QUEST: | 248 | case BT_QUEST: | |
249 | ptr += MINBPC(enc); | 249 | ptr += MINBPC(enc); | |
250 | if (ptr == end) | 250 | if (ptr == end) | |
251 | return XML_TOK_PARTIAL; | 251 | return XML_TOK_PARTIAL; | |
252 | if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { | 252 | if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { | |
253 | *nextTokPtr = ptr + MINBPC(enc); | 253 | *nextTokPtr = ptr + MINBPC(enc); | |
254 | return tok; | 254 | return tok; | |
255 | } | 255 | } | |
256 | break; | 256 | break; | |
257 | default: | 257 | default: | |
258 | ptr += MINBPC(enc); | 258 | ptr += MINBPC(enc); | |
@@ -295,27 +295,27 @@ PREFIX(scanCdataSection)(const ENCODING | @@ -295,27 +295,27 @@ PREFIX(scanCdataSection)(const ENCODING | |||
295 | if (!CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) { | 295 | if (!CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) { | |
296 | *nextTokPtr = ptr; | 296 | *nextTokPtr = ptr; | |
297 | return XML_TOK_INVALID; | 297 | return XML_TOK_INVALID; | |
298 | } | 298 | } | |
299 | } | 299 | } | |
300 | *nextTokPtr = ptr; | 300 | *nextTokPtr = ptr; | |
301 | return XML_TOK_CDATA_SECT_OPEN; | 301 | return XML_TOK_CDATA_SECT_OPEN; | |
302 | } | 302 | } | |
303 | 303 | |||
304 | static int PTRCALL | 304 | static int PTRCALL | |
305 | PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, | 305 | PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, | |
306 | const char *end, const char **nextTokPtr) | 306 | const char *end, const char **nextTokPtr) | |
307 | { | 307 | { | |
308 | if (ptr == end) | 308 | if (ptr >= end) | |
309 | return XML_TOK_NONE; | 309 | return XML_TOK_NONE; | |
310 | if (MINBPC(enc) > 1) { | 310 | if (MINBPC(enc) > 1) { | |
311 | size_t n = end - ptr; | 311 | size_t n = end - ptr; | |
312 | if (n & (MINBPC(enc) - 1)) { | 312 | if (n & (MINBPC(enc) - 1)) { | |
313 | n &= ~(MINBPC(enc) - 1); | 313 | n &= ~(MINBPC(enc) - 1); | |
314 | if (n == 0) | 314 | if (n == 0) | |
315 | return XML_TOK_PARTIAL; | 315 | return XML_TOK_PARTIAL; | |
316 | end = ptr + n; | 316 | end = ptr + n; | |
317 | } | 317 | } | |
318 | } | 318 | } | |
319 | switch (BYTE_TYPE(enc, ptr)) { | 319 | switch (BYTE_TYPE(enc, ptr)) { | |
320 | case BT_RSQB: | 320 | case BT_RSQB: | |
321 | ptr += MINBPC(enc); | 321 | ptr += MINBPC(enc); | |
@@ -338,27 +338,27 @@ PREFIX(cdataSectionTok)(const ENCODING * | @@ -338,27 +338,27 @@ PREFIX(cdataSectionTok)(const ENCODING * | |||
338 | return XML_TOK_PARTIAL; | 338 | return XML_TOK_PARTIAL; | |
339 | if (BYTE_TYPE(enc, ptr) == BT_LF) | 339 | if (BYTE_TYPE(enc, ptr) == BT_LF) | |
340 | ptr += MINBPC(enc); | 340 | ptr += MINBPC(enc); | |
341 | *nextTokPtr = ptr; | 341 | *nextTokPtr = ptr; | |
342 | return XML_TOK_DATA_NEWLINE; | 342 | return XML_TOK_DATA_NEWLINE; | |
343 | case BT_LF: | 343 | case BT_LF: | |
344 | *nextTokPtr = ptr + MINBPC(enc); | 344 | *nextTokPtr = ptr + MINBPC(enc); | |
345 | return XML_TOK_DATA_NEWLINE; | 345 | return XML_TOK_DATA_NEWLINE; | |
346 | INVALID_CASES(ptr, nextTokPtr) | 346 | INVALID_CASES(ptr, nextTokPtr) | |
347 | default: | 347 | default: | |
348 | ptr += MINBPC(enc); | 348 | ptr += MINBPC(enc); | |
349 | break; | 349 | break; | |
350 | } | 350 | } | |
351 | while (ptr != end) { | 351 | while (ptr < end) { | |
352 | switch (BYTE_TYPE(enc, ptr)) { | 352 | switch (BYTE_TYPE(enc, ptr)) { | |
353 | #define LEAD_CASE(n) \ | 353 | #define LEAD_CASE(n) \ | |
354 | case BT_LEAD ## n: \ | 354 | case BT_LEAD ## n: \ | |
355 | if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ | 355 | if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ | |
356 | *nextTokPtr = ptr; \ | 356 | *nextTokPtr = ptr; \ | |
357 | return XML_TOK_DATA_CHARS; \ | 357 | return XML_TOK_DATA_CHARS; \ | |
358 | } \ | 358 | } \ | |
359 | ptr += n; \ | 359 | ptr += n; \ | |
360 | break; | 360 | break; | |
361 | LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) | 361 | LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) | |
362 | #undef LEAD_CASE | 362 | #undef LEAD_CASE | |
363 | case BT_NONXML: | 363 | case BT_NONXML: | |
364 | case BT_MALFORM: | 364 | case BT_MALFORM: | |
@@ -381,31 +381,31 @@ PREFIX(cdataSectionTok)(const ENCODING * | @@ -381,31 +381,31 @@ PREFIX(cdataSectionTok)(const ENCODING * | |||
381 | 381 | |||
382 | static int PTRCALL | 382 | static int PTRCALL | |
383 | PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, | 383 | PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, | |
384 | const char *end, const char **nextTokPtr) | 384 | const char *end, const char **nextTokPtr) | |
385 | { | 385 | { | |
386 | if (ptr == end) | 386 | if (ptr == end) | |
387 | return XML_TOK_PARTIAL; | 387 | return XML_TOK_PARTIAL; | |
388 | switch (BYTE_TYPE(enc, ptr)) { | 388 | switch (BYTE_TYPE(enc, ptr)) { | |
389 | CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) | 389 | CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) | |
390 | default: | 390 | default: | |
391 | *nextTokPtr = ptr; | 391 | *nextTokPtr = ptr; | |
392 | return XML_TOK_INVALID; | 392 | return XML_TOK_INVALID; | |
393 | } | 393 | } | |
394 | while (ptr != end) { | 394 | while (ptr < end) { | |
395 | switch (BYTE_TYPE(enc, ptr)) { | 395 | switch (BYTE_TYPE(enc, ptr)) { | |
396 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | 396 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | |
397 | case BT_S: case BT_CR: case BT_LF: | 397 | case BT_S: case BT_CR: case BT_LF: | |
398 | for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { | 398 | for (ptr += MINBPC(enc); ptr < end; ptr += MINBPC(enc)) { | |
399 | switch (BYTE_TYPE(enc, ptr)) { | 399 | switch (BYTE_TYPE(enc, ptr)) { | |
400 | case BT_S: case BT_CR: case BT_LF: | 400 | case BT_S: case BT_CR: case BT_LF: | |
401 | break; | 401 | break; | |
402 | case BT_GT: | 402 | case BT_GT: | |
403 | *nextTokPtr = ptr + MINBPC(enc); | 403 | *nextTokPtr = ptr + MINBPC(enc); | |
404 | return XML_TOK_END_TAG; | 404 | return XML_TOK_END_TAG; | |
405 | default: | 405 | default: | |
406 | *nextTokPtr = ptr; | 406 | *nextTokPtr = ptr; | |
407 | return XML_TOK_INVALID; | 407 | return XML_TOK_INVALID; | |
408 | } | 408 | } | |
409 | } | 409 | } | |
410 | return XML_TOK_PARTIAL; | 410 | return XML_TOK_PARTIAL; | |
411 | #ifdef XML_NS | 411 | #ifdef XML_NS | |
@@ -422,69 +422,69 @@ PREFIX(scanEndTag)(const ENCODING *enc, | @@ -422,69 +422,69 @@ PREFIX(scanEndTag)(const ENCODING *enc, | |||
422 | *nextTokPtr = ptr; | 422 | *nextTokPtr = ptr; | |
423 | return XML_TOK_INVALID; | 423 | return XML_TOK_INVALID; | |
424 | } | 424 | } | |
425 | } | 425 | } | |
426 | return XML_TOK_PARTIAL; | 426 | return XML_TOK_PARTIAL; | |
427 | } | 427 | } | |
428 | 428 | |||
429 | /* ptr points to character following "&#X" */ | 429 | /* ptr points to character following "&#X" */ | |
430 | 430 | |||
431 | static int PTRCALL | 431 | static int PTRCALL | |
432 | PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, | 432 | PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, | |
433 | const char *end, const char **nextTokPtr) | 433 | const char *end, const char **nextTokPtr) | |
434 | { | 434 | { | |
435 | if (ptr != end) { | 435 | if (ptr < end) { | |
436 | switch (BYTE_TYPE(enc, ptr)) { | 436 | switch (BYTE_TYPE(enc, ptr)) { | |
437 | case BT_DIGIT: | 437 | case BT_DIGIT: | |
438 | case BT_HEX: | 438 | case BT_HEX: | |
439 | break; | 439 | break; | |
440 | default: | 440 | default: | |
441 | *nextTokPtr = ptr; | 441 | *nextTokPtr = ptr; | |
442 | return XML_TOK_INVALID; | 442 | return XML_TOK_INVALID; | |
443 | } | 443 | } | |
444 | for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { | 444 | for (ptr += MINBPC(enc); ptr < end; ptr += MINBPC(enc)) { | |
445 | switch (BYTE_TYPE(enc, ptr)) { | 445 | switch (BYTE_TYPE(enc, ptr)) { | |
446 | case BT_DIGIT: | 446 | case BT_DIGIT: | |
447 | case BT_HEX: | 447 | case BT_HEX: | |
448 | break; | 448 | break; | |
449 | case BT_SEMI: | 449 | case BT_SEMI: | |
450 | *nextTokPtr = ptr + MINBPC(enc); | 450 | *nextTokPtr = ptr + MINBPC(enc); | |
451 | return XML_TOK_CHAR_REF; | 451 | return XML_TOK_CHAR_REF; | |
452 | default: | 452 | default: | |
453 | *nextTokPtr = ptr; | 453 | *nextTokPtr = ptr; | |
454 | return XML_TOK_INVALID; | 454 | return XML_TOK_INVALID; | |
455 | } | 455 | } | |
456 | } | 456 | } | |
457 | } | 457 | } | |
458 | return XML_TOK_PARTIAL; | 458 | return XML_TOK_PARTIAL; | |
459 | } | 459 | } | |
460 | 460 | |||
461 | /* ptr points to character following "&#" */ | 461 | /* ptr points to character following "&#" */ | |
462 | 462 | |||
463 | static int PTRCALL | 463 | static int PTRCALL | |
464 | PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, | 464 | PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, | |
465 | const char *end, const char **nextTokPtr) | 465 | const char *end, const char **nextTokPtr) | |
466 | { | 466 | { | |
467 | if (ptr != end) { | 467 | if (ptr < end) { | |
468 | if (CHAR_MATCHES(enc, ptr, ASCII_x)) | 468 | if (CHAR_MATCHES(enc, ptr, ASCII_x)) | |
469 | return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); | 469 | return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); | |
470 | switch (BYTE_TYPE(enc, ptr)) { | 470 | switch (BYTE_TYPE(enc, ptr)) { | |
471 | case BT_DIGIT: | 471 | case BT_DIGIT: | |
472 | break; | 472 | break; | |
473 | default: | 473 | default: | |
474 | *nextTokPtr = ptr; | 474 | *nextTokPtr = ptr; | |
475 | return XML_TOK_INVALID; | 475 | return XML_TOK_INVALID; | |
476 | } | 476 | } | |
477 | for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { | 477 | for (ptr += MINBPC(enc); ptr < end; ptr += MINBPC(enc)) { | |
478 | switch (BYTE_TYPE(enc, ptr)) { | 478 | switch (BYTE_TYPE(enc, ptr)) { | |
479 | case BT_DIGIT: | 479 | case BT_DIGIT: | |
480 | break; | 480 | break; | |
481 | case BT_SEMI: | 481 | case BT_SEMI: | |
482 | *nextTokPtr = ptr + MINBPC(enc); | 482 | *nextTokPtr = ptr + MINBPC(enc); | |
483 | return XML_TOK_CHAR_REF; | 483 | return XML_TOK_CHAR_REF; | |
484 | default: | 484 | default: | |
485 | *nextTokPtr = ptr; | 485 | *nextTokPtr = ptr; | |
486 | return XML_TOK_INVALID; | 486 | return XML_TOK_INVALID; | |
487 | } | 487 | } | |
488 | } | 488 | } | |
489 | } | 489 | } | |
490 | return XML_TOK_PARTIAL; | 490 | return XML_TOK_PARTIAL; | |
@@ -496,50 +496,50 @@ static int PTRCALL | @@ -496,50 +496,50 @@ static int PTRCALL | |||
496 | PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end, | 496 | PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end, | |
497 | const char **nextTokPtr) | 497 | const char **nextTokPtr) | |
498 | { | 498 | { | |
499 | if (ptr == end) | 499 | if (ptr == end) | |
500 | return XML_TOK_PARTIAL; | 500 | return XML_TOK_PARTIAL; | |
501 | switch (BYTE_TYPE(enc, ptr)) { | 501 | switch (BYTE_TYPE(enc, ptr)) { | |
502 | CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) | 502 | CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) | |
503 | case BT_NUM: | 503 | case BT_NUM: | |
504 | return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); | 504 | return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); | |
505 | default: | 505 | default: | |
506 | *nextTokPtr = ptr; | 506 | *nextTokPtr = ptr; | |
507 | return XML_TOK_INVALID; | 507 | return XML_TOK_INVALID; | |
508 | } | 508 | } | |
509 | while (ptr != end) { | 509 | while (ptr < end) { | |
510 | switch (BYTE_TYPE(enc, ptr)) { | 510 | switch (BYTE_TYPE(enc, ptr)) { | |
511 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | 511 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | |
512 | case BT_SEMI: | 512 | case BT_SEMI: | |
513 | *nextTokPtr = ptr + MINBPC(enc); | 513 | *nextTokPtr = ptr + MINBPC(enc); | |
514 | return XML_TOK_ENTITY_REF; | 514 | return XML_TOK_ENTITY_REF; | |
515 | default: | 515 | default: | |
516 | *nextTokPtr = ptr; | 516 | *nextTokPtr = ptr; | |
517 | return XML_TOK_INVALID; | 517 | return XML_TOK_INVALID; | |
518 | } | 518 | } | |
519 | } | 519 | } | |
520 | return XML_TOK_PARTIAL; | 520 | return XML_TOK_PARTIAL; | |
521 | } | 521 | } | |
522 | 522 | |||
523 | /* ptr points to character following first character of attribute name */ | 523 | /* ptr points to character following first character of attribute name */ | |
524 | 524 | |||
525 | static int PTRCALL | 525 | static int PTRCALL | |
526 | PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end, | 526 | PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end, | |
527 | const char **nextTokPtr) | 527 | const char **nextTokPtr) | |
528 | { | 528 | { | |
529 | #ifdef XML_NS | 529 | #ifdef XML_NS | |
530 | int hadColon = 0; | 530 | int hadColon = 0; | |
531 | #endif | 531 | #endif | |
532 | while (ptr != end) { | 532 | while (ptr < end) { | |
533 | switch (BYTE_TYPE(enc, ptr)) { | 533 | switch (BYTE_TYPE(enc, ptr)) { | |
534 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | 534 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | |
535 | #ifdef XML_NS | 535 | #ifdef XML_NS | |
536 | case BT_COLON: | 536 | case BT_COLON: | |
537 | if (hadColon) { | 537 | if (hadColon) { | |
538 | *nextTokPtr = ptr; | 538 | *nextTokPtr = ptr; | |
539 | return XML_TOK_INVALID; | 539 | return XML_TOK_INVALID; | |
540 | } | 540 | } | |
541 | hadColon = 1; | 541 | hadColon = 1; | |
542 | ptr += MINBPC(enc); | 542 | ptr += MINBPC(enc); | |
543 | if (ptr == end) | 543 | if (ptr == end) | |
544 | return XML_TOK_PARTIAL; | 544 | return XML_TOK_PARTIAL; | |
545 | switch (BYTE_TYPE(enc, ptr)) { | 545 | switch (BYTE_TYPE(enc, ptr)) { | |
@@ -706,51 +706,51 @@ PREFIX(scanLt)(const ENCODING *enc, cons | @@ -706,51 +706,51 @@ PREFIX(scanLt)(const ENCODING *enc, cons | |||
706 | return XML_TOK_INVALID; | 706 | return XML_TOK_INVALID; | |
707 | case BT_QUEST: | 707 | case BT_QUEST: | |
708 | return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); | 708 | return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); | |
709 | case BT_SOL: | 709 | case BT_SOL: | |
710 | return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr); | 710 | return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr); | |
711 | default: | 711 | default: | |
712 | *nextTokPtr = ptr; | 712 | *nextTokPtr = ptr; | |
713 | return XML_TOK_INVALID; | 713 | return XML_TOK_INVALID; | |
714 | } | 714 | } | |
715 | #ifdef XML_NS | 715 | #ifdef XML_NS | |
716 | hadColon = 0; | 716 | hadColon = 0; | |
717 | #endif | 717 | #endif | |
718 | /* we have a start-tag */ | 718 | /* we have a start-tag */ | |
719 | while (ptr != end) { | 719 | while (ptr < end) { | |
720 | switch (BYTE_TYPE(enc, ptr)) { | 720 | switch (BYTE_TYPE(enc, ptr)) { | |
721 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | 721 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | |
722 | #ifdef XML_NS | 722 | #ifdef XML_NS | |
723 | case BT_COLON: | 723 | case BT_COLON: | |
724 | if (hadColon) { | 724 | if (hadColon) { | |
725 | *nextTokPtr = ptr; | 725 | *nextTokPtr = ptr; | |
726 | return XML_TOK_INVALID; | 726 | return XML_TOK_INVALID; | |
727 | } | 727 | } | |
728 | hadColon = 1; | 728 | hadColon = 1; | |
729 | ptr += MINBPC(enc); | 729 | ptr += MINBPC(enc); | |
730 | if (ptr == end) | 730 | if (ptr == end) | |
731 | return XML_TOK_PARTIAL; | 731 | return XML_TOK_PARTIAL; | |
732 | switch (BYTE_TYPE(enc, ptr)) { | 732 | switch (BYTE_TYPE(enc, ptr)) { | |
733 | CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) | 733 | CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) | |
734 | default: | 734 | default: | |
735 | *nextTokPtr = ptr; | 735 | *nextTokPtr = ptr; | |
736 | return XML_TOK_INVALID; | 736 | return XML_TOK_INVALID; | |
737 | } | 737 | } | |
738 | break; | 738 | break; | |
739 | #endif | 739 | #endif | |
740 | case BT_S: case BT_CR: case BT_LF: | 740 | case BT_S: case BT_CR: case BT_LF: | |
741 | { | 741 | { | |
742 | ptr += MINBPC(enc); | 742 | ptr += MINBPC(enc); | |
743 | while (ptr != end) { | 743 | while (ptr < end) { | |
744 | switch (BYTE_TYPE(enc, ptr)) { | 744 | switch (BYTE_TYPE(enc, ptr)) { | |
745 | CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) | 745 | CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) | |
746 | case BT_GT: | 746 | case BT_GT: | |
747 | goto gt; | 747 | goto gt; | |
748 | case BT_SOL: | 748 | case BT_SOL: | |
749 | goto sol; | 749 | goto sol; | |
750 | case BT_S: case BT_CR: case BT_LF: | 750 | case BT_S: case BT_CR: case BT_LF: | |
751 | ptr += MINBPC(enc); | 751 | ptr += MINBPC(enc); | |
752 | continue; | 752 | continue; | |
753 | default: | 753 | default: | |
754 | *nextTokPtr = ptr; | 754 | *nextTokPtr = ptr; | |
755 | return XML_TOK_INVALID; | 755 | return XML_TOK_INVALID; | |
756 | } | 756 | } | |
@@ -775,27 +775,27 @@ PREFIX(scanLt)(const ENCODING *enc, cons | @@ -775,27 +775,27 @@ PREFIX(scanLt)(const ENCODING *enc, cons | |||
775 | return XML_TOK_EMPTY_ELEMENT_NO_ATTS; | 775 | return XML_TOK_EMPTY_ELEMENT_NO_ATTS; | |
776 | default: | 776 | default: | |
777 | *nextTokPtr = ptr; | 777 | *nextTokPtr = ptr; | |
778 | return XML_TOK_INVALID; | 778 | return XML_TOK_INVALID; | |
779 | } | 779 | } | |
780 | } | 780 | } | |
781 | return XML_TOK_PARTIAL; | 781 | return XML_TOK_PARTIAL; | |
782 | } | 782 | } | |
783 | 783 | |||
784 | static int PTRCALL | 784 | static int PTRCALL | |
785 | PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, | 785 | PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, | |
786 | const char **nextTokPtr) | 786 | const char **nextTokPtr) | |
787 | { | 787 | { | |
788 | if (ptr == end) | 788 | if (ptr >= end) | |
789 | return XML_TOK_NONE; | 789 | return XML_TOK_NONE; | |
790 | if (MINBPC(enc) > 1) { | 790 | if (MINBPC(enc) > 1) { | |
791 | size_t n = end - ptr; | 791 | size_t n = end - ptr; | |
792 | if (n & (MINBPC(enc) - 1)) { | 792 | if (n & (MINBPC(enc) - 1)) { | |
793 | n &= ~(MINBPC(enc) - 1); | 793 | n &= ~(MINBPC(enc) - 1); | |
794 | if (n == 0) | 794 | if (n == 0) | |
795 | return XML_TOK_PARTIAL; | 795 | return XML_TOK_PARTIAL; | |
796 | end = ptr + n; | 796 | end = ptr + n; | |
797 | } | 797 | } | |
798 | } | 798 | } | |
799 | switch (BYTE_TYPE(enc, ptr)) { | 799 | switch (BYTE_TYPE(enc, ptr)) { | |
800 | case BT_LT: | 800 | case BT_LT: | |
801 | return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr); | 801 | return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr); | |
@@ -822,27 +822,27 @@ PREFIX(contentTok)(const ENCODING *enc, | @@ -822,27 +822,27 @@ PREFIX(contentTok)(const ENCODING *enc, | |||
822 | if (ptr == end) | 822 | if (ptr == end) | |
823 | return XML_TOK_TRAILING_RSQB; | 823 | return XML_TOK_TRAILING_RSQB; | |
824 | if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { | 824 | if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { | |
825 | ptr -= MINBPC(enc); | 825 | ptr -= MINBPC(enc); | |
826 | break; | 826 | break; | |
827 | } | 827 | } | |
828 | *nextTokPtr = ptr; | 828 | *nextTokPtr = ptr; | |
829 | return XML_TOK_INVALID; | 829 | return XML_TOK_INVALID; | |
830 | INVALID_CASES(ptr, nextTokPtr) | 830 | INVALID_CASES(ptr, nextTokPtr) | |
831 | default: | 831 | default: | |
832 | ptr += MINBPC(enc); | 832 | ptr += MINBPC(enc); | |
833 | break; | 833 | break; | |
834 | } | 834 | } | |
835 | while (ptr != end) { | 835 | while (ptr < end) { | |
836 | switch (BYTE_TYPE(enc, ptr)) { | 836 | switch (BYTE_TYPE(enc, ptr)) { | |
837 | #define LEAD_CASE(n) \ | 837 | #define LEAD_CASE(n) \ | |
838 | case BT_LEAD ## n: \ | 838 | case BT_LEAD ## n: \ | |
839 | if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ | 839 | if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ | |
840 | *nextTokPtr = ptr; \ | 840 | *nextTokPtr = ptr; \ | |
841 | return XML_TOK_DATA_CHARS; \ | 841 | return XML_TOK_DATA_CHARS; \ | |
842 | } \ | 842 | } \ | |
843 | ptr += n; \ | 843 | ptr += n; \ | |
844 | break; | 844 | break; | |
845 | LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) | 845 | LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) | |
846 | #undef LEAD_CASE | 846 | #undef LEAD_CASE | |
847 | case BT_RSQB: | 847 | case BT_RSQB: | |
848 | if (ptr + MINBPC(enc) != end) { | 848 | if (ptr + MINBPC(enc) != end) { | |
@@ -885,73 +885,73 @@ PREFIX(scanPercent)(const ENCODING *enc, | @@ -885,73 +885,73 @@ PREFIX(scanPercent)(const ENCODING *enc, | |||
885 | const char **nextTokPtr) | 885 | const char **nextTokPtr) | |
886 | { | 886 | { | |
887 | if (ptr == end) | 887 | if (ptr == end) | |
888 | return XML_TOK_PARTIAL; | 888 | return XML_TOK_PARTIAL; | |
889 | switch (BYTE_TYPE(enc, ptr)) { | 889 | switch (BYTE_TYPE(enc, ptr)) { | |
890 | CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) | 890 | CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) | |
891 | case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: | 891 | case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: | |
892 | *nextTokPtr = ptr; | 892 | *nextTokPtr = ptr; | |
893 | return XML_TOK_PERCENT; | 893 | return XML_TOK_PERCENT; | |
894 | default: | 894 | default: | |
895 | *nextTokPtr = ptr; | 895 | *nextTokPtr = ptr; | |
896 | return XML_TOK_INVALID; | 896 | return XML_TOK_INVALID; | |
897 | } | 897 | } | |
898 | while (ptr != end) { | 898 | while (ptr < end) { | |
899 | switch (BYTE_TYPE(enc, ptr)) { | 899 | switch (BYTE_TYPE(enc, ptr)) { | |
900 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | 900 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | |
901 | case BT_SEMI: | 901 | case BT_SEMI: | |
902 | *nextTokPtr = ptr + MINBPC(enc); | 902 | *nextTokPtr = ptr + MINBPC(enc); | |
903 | return XML_TOK_PARAM_ENTITY_REF; | 903 | return XML_TOK_PARAM_ENTITY_REF; | |
904 | default: | 904 | default: | |
905 | *nextTokPtr = ptr; | 905 | *nextTokPtr = ptr; | |
906 | return XML_TOK_INVALID; | 906 | return XML_TOK_INVALID; | |
907 | } | 907 | } | |
908 | } | 908 | } | |
909 | return XML_TOK_PARTIAL; | 909 | return XML_TOK_PARTIAL; | |
910 | } | 910 | } | |
911 | 911 | |||
912 | static int PTRCALL | 912 | static int PTRCALL | |
913 | PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, | 913 | PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, | |
914 | const char **nextTokPtr) | 914 | const char **nextTokPtr) | |
915 | { | 915 | { | |
916 | if (ptr == end) | 916 | if (ptr == end) | |
917 | return XML_TOK_PARTIAL; | 917 | return XML_TOK_PARTIAL; | |
918 | switch (BYTE_TYPE(enc, ptr)) { | 918 | switch (BYTE_TYPE(enc, ptr)) { | |
919 | CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) | 919 | CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) | |
920 | default: | 920 | default: | |
921 | *nextTokPtr = ptr; | 921 | *nextTokPtr = ptr; | |
922 | return XML_TOK_INVALID; | 922 | return XML_TOK_INVALID; | |
923 | } | 923 | } | |
924 | while (ptr != end) { | 924 | while (ptr < end) { | |
925 | switch (BYTE_TYPE(enc, ptr)) { | 925 | switch (BYTE_TYPE(enc, ptr)) { | |
926 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | 926 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | |
927 | case BT_CR: case BT_LF: case BT_S: | 927 | case BT_CR: case BT_LF: case BT_S: | |
928 | case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: | 928 | case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: | |
929 | *nextTokPtr = ptr; | 929 | *nextTokPtr = ptr; | |
930 | return XML_TOK_POUND_NAME; | 930 | return XML_TOK_POUND_NAME; | |
931 | default: | 931 | default: | |
932 | *nextTokPtr = ptr; | 932 | *nextTokPtr = ptr; | |
933 | return XML_TOK_INVALID; | 933 | return XML_TOK_INVALID; | |
934 | } | 934 | } | |
935 | } | 935 | } | |
936 | return -XML_TOK_POUND_NAME; | 936 | return -XML_TOK_POUND_NAME; | |
937 | } | 937 | } | |
938 | 938 | |||
939 | static int PTRCALL | 939 | static int PTRCALL | |
940 | PREFIX(scanLit)(int open, const ENCODING *enc, | 940 | PREFIX(scanLit)(int open, const ENCODING *enc, | |
941 | const char *ptr, const char *end, | 941 | const char *ptr, const char *end, | |
942 | const char **nextTokPtr) | 942 | const char **nextTokPtr) | |
943 | { | 943 | { | |
944 | while (ptr != end) { | 944 | while (ptr < end) { | |
945 | int t = BYTE_TYPE(enc, ptr); | 945 | int t = BYTE_TYPE(enc, ptr); | |
946 | switch (t) { | 946 | switch (t) { | |
947 | INVALID_CASES(ptr, nextTokPtr) | 947 | INVALID_CASES(ptr, nextTokPtr) | |
948 | case BT_QUOT: | 948 | case BT_QUOT: | |
949 | case BT_APOS: | 949 | case BT_APOS: | |
950 | ptr += MINBPC(enc); | 950 | ptr += MINBPC(enc); | |
951 | if (t != open) | 951 | if (t != open) | |
952 | break; | 952 | break; | |
953 | if (ptr == end) | 953 | if (ptr == end) | |
954 | return -XML_TOK_LITERAL; | 954 | return -XML_TOK_LITERAL; | |
955 | *nextTokPtr = ptr; | 955 | *nextTokPtr = ptr; | |
956 | switch (BYTE_TYPE(enc, ptr)) { | 956 | switch (BYTE_TYPE(enc, ptr)) { | |
957 | case BT_S: case BT_CR: case BT_LF: | 957 | case BT_S: case BT_CR: case BT_LF: | |
@@ -963,27 +963,27 @@ PREFIX(scanLit)(int open, const ENCODING | @@ -963,27 +963,27 @@ PREFIX(scanLit)(int open, const ENCODING | |||
963 | default: | 963 | default: | |
964 | ptr += MINBPC(enc); | 964 | ptr += MINBPC(enc); | |
965 | break; | 965 | break; | |
966 | } | 966 | } | |
967 | } | 967 | } | |
968 | return XML_TOK_PARTIAL; | 968 | return XML_TOK_PARTIAL; | |
969 | } | 969 | } | |
970 | 970 | |||
971 | static int PTRCALL | 971 | static int PTRCALL | |
972 | PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, | 972 | PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, | |
973 | const char **nextTokPtr) | 973 | const char **nextTokPtr) | |
974 | { | 974 | { | |
975 | int tok; | 975 | int tok; | |
976 | if (ptr == end) | 976 | if (ptr >= end) | |
977 | return XML_TOK_NONE; | 977 | return XML_TOK_NONE; | |
978 | if (MINBPC(enc) > 1) { | 978 | if (MINBPC(enc) > 1) { | |
979 | size_t n = end - ptr; | 979 | size_t n = end - ptr; | |
980 | if (n & (MINBPC(enc) - 1)) { | 980 | if (n & (MINBPC(enc) - 1)) { | |
981 | n &= ~(MINBPC(enc) - 1); | 981 | n &= ~(MINBPC(enc) - 1); | |
982 | if (n == 0) | 982 | if (n == 0) | |
983 | return XML_TOK_PARTIAL; | 983 | return XML_TOK_PARTIAL; | |
984 | end = ptr + n; | 984 | end = ptr + n; | |
985 | } | 985 | } | |
986 | } | 986 | } | |
987 | switch (BYTE_TYPE(enc, ptr)) { | 987 | switch (BYTE_TYPE(enc, ptr)) { | |
988 | case BT_QUOT: | 988 | case BT_QUOT: | |
989 | return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); | 989 | return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); | |
@@ -1131,27 +1131,27 @@ PREFIX(prologTok)(const ENCODING *enc, c | @@ -1131,27 +1131,27 @@ PREFIX(prologTok)(const ENCODING *enc, c | |||
1131 | tok = XML_TOK_NAME; | 1131 | tok = XML_TOK_NAME; | |
1132 | break; | 1132 | break; | |
1133 | } | 1133 | } | |
1134 | if (IS_NAME_CHAR_MINBPC(enc, ptr)) { | 1134 | if (IS_NAME_CHAR_MINBPC(enc, ptr)) { | |
1135 | ptr += MINBPC(enc); | 1135 | ptr += MINBPC(enc); | |
1136 | tok = XML_TOK_NMTOKEN; | 1136 | tok = XML_TOK_NMTOKEN; | |
1137 | break; | 1137 | break; | |
1138 | } | 1138 | } | |
1139 | /* fall through */ | 1139 | /* fall through */ | |
1140 | default: | 1140 | default: | |
1141 | *nextTokPtr = ptr; | 1141 | *nextTokPtr = ptr; | |
1142 | return XML_TOK_INVALID; | 1142 | return XML_TOK_INVALID; | |
1143 | } | 1143 | } | |
1144 | while (ptr != end) { | 1144 | while (ptr < end) { | |
1145 | switch (BYTE_TYPE(enc, ptr)) { | 1145 | switch (BYTE_TYPE(enc, ptr)) { | |
1146 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | 1146 | CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) | |
1147 | case BT_GT: case BT_RPAR: case BT_COMMA: | 1147 | case BT_GT: case BT_RPAR: case BT_COMMA: | |
1148 | case BT_VERBAR: case BT_LSQB: case BT_PERCNT: | 1148 | case BT_VERBAR: case BT_LSQB: case BT_PERCNT: | |
1149 | case BT_S: case BT_CR: case BT_LF: | 1149 | case BT_S: case BT_CR: case BT_LF: | |
1150 | *nextTokPtr = ptr; | 1150 | *nextTokPtr = ptr; | |
1151 | return tok; | 1151 | return tok; | |
1152 | #ifdef XML_NS | 1152 | #ifdef XML_NS | |
1153 | case BT_COLON: | 1153 | case BT_COLON: | |
1154 | ptr += MINBPC(enc); | 1154 | ptr += MINBPC(enc); | |
1155 | switch (tok) { | 1155 | switch (tok) { | |
1156 | case XML_TOK_NAME: | 1156 | case XML_TOK_NAME: | |
1157 | if (ptr == end) | 1157 | if (ptr == end) | |
@@ -1194,30 +1194,30 @@ PREFIX(prologTok)(const ENCODING *enc, c | @@ -1194,30 +1194,30 @@ PREFIX(prologTok)(const ENCODING *enc, c | |||
1194 | default: | 1194 | default: | |
1195 | *nextTokPtr = ptr; | 1195 | *nextTokPtr = ptr; | |
1196 | return XML_TOK_INVALID; | 1196 | return XML_TOK_INVALID; | |
1197 | } | 1197 | } | |
1198 | } | 1198 | } | |
1199 | return -tok; | 1199 | return -tok; | |
1200 | } | 1200 | } | |
1201 | 1201 | |||
1202 | static int PTRCALL | 1202 | static int PTRCALL | |
1203 | PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, | 1203 | PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, | |
1204 | const char *end, const char **nextTokPtr) | 1204 | const char *end, const char **nextTokPtr) | |
1205 | { | 1205 | { | |
1206 | const char *start; | 1206 | const char *start; | |
1207 | if (ptr == end) | 1207 | if (ptr >= end) | |
1208 | return XML_TOK_NONE; | 1208 | return XML_TOK_NONE; | |
1209 | start = ptr; | 1209 | start = ptr; | |
1210 | while (ptr != end) { | 1210 | while (ptr < end) { | |
1211 | switch (BYTE_TYPE(enc, ptr)) { | 1211 | switch (BYTE_TYPE(enc, ptr)) { | |
1212 | #define LEAD_CASE(n) \ | 1212 | #define LEAD_CASE(n) \ | |
1213 | case BT_LEAD ## n: ptr += n; break; | 1213 | case BT_LEAD ## n: ptr += n; break; | |
1214 | LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) | 1214 | LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) | |
1215 | #undef LEAD_CASE | 1215 | #undef LEAD_CASE | |
1216 | case BT_AMP: | 1216 | case BT_AMP: | |
1217 | if (ptr == start) | 1217 | if (ptr == start) | |
1218 | return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); | 1218 | return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); | |
1219 | *nextTokPtr = ptr; | 1219 | *nextTokPtr = ptr; | |
1220 | return XML_TOK_DATA_CHARS; | 1220 | return XML_TOK_DATA_CHARS; | |
1221 | case BT_LT: | 1221 | case BT_LT: | |
1222 | /* this is for inside entity references */ | 1222 | /* this is for inside entity references */ | |
1223 | *nextTokPtr = ptr; | 1223 | *nextTokPtr = ptr; | |
@@ -1252,30 +1252,30 @@ PREFIX(attributeValueTok)(const ENCODING | @@ -1252,30 +1252,30 @@ PREFIX(attributeValueTok)(const ENCODING | |||
1252 | ptr += MINBPC(enc); | 1252 | ptr += MINBPC(enc); | |
1253 | break; | 1253 | break; | |
1254 | } | 1254 | } | |
1255 | } | 1255 | } | |
1256 | *nextTokPtr = ptr; | 1256 | *nextTokPtr = ptr; | |
1257 | return XML_TOK_DATA_CHARS; | 1257 | return XML_TOK_DATA_CHARS; | |
1258 | } | 1258 | } | |
1259 | 1259 | |||
1260 | static int PTRCALL | 1260 | static int PTRCALL | |
1261 | PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, | 1261 | PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, | |
1262 | const char *end, const char **nextTokPtr) | 1262 | const char *end, const char **nextTokPtr) | |
1263 | { | 1263 | { | |
1264 | const char *start; | 1264 | const char *start; | |
1265 | if (ptr == end) | 1265 | if (ptr >= end) | |
1266 | return XML_TOK_NONE; | 1266 | return XML_TOK_NONE; | |
1267 | start = ptr; | 1267 | start = ptr; | |
1268 | while (ptr != end) { | 1268 | while (ptr < end) { | |
1269 | switch (BYTE_TYPE(enc, ptr)) { | 1269 | switch (BYTE_TYPE(enc, ptr)) { | |
1270 | #define LEAD_CASE(n) \ | 1270 | #define LEAD_CASE(n) \ | |
1271 | case BT_LEAD ## n: ptr += n; break; | 1271 | case BT_LEAD ## n: ptr += n; break; | |
1272 | LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) | 1272 | LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) | |
1273 | #undef LEAD_CASE | 1273 | #undef LEAD_CASE | |
1274 | case BT_AMP: | 1274 | case BT_AMP: | |
1275 | if (ptr == start) | 1275 | if (ptr == start) | |
1276 | return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); | 1276 | return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); | |
1277 | *nextTokPtr = ptr; | 1277 | *nextTokPtr = ptr; | |
1278 | return XML_TOK_DATA_CHARS; | 1278 | return XML_TOK_DATA_CHARS; | |
1279 | case BT_PERCNT: | 1279 | case BT_PERCNT: | |
1280 | if (ptr == start) { | 1280 | if (ptr == start) { | |
1281 | int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), | 1281 | int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), | |
@@ -1316,27 +1316,27 @@ PREFIX(entityValueTok)(const ENCODING *e | @@ -1316,27 +1316,27 @@ PREFIX(entityValueTok)(const ENCODING *e | |||
1316 | 1316 | |||
1317 | static int PTRCALL | 1317 | static int PTRCALL | |
1318 | PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, | 1318 | PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, | |
1319 | const char *end, const char **nextTokPtr) | 1319 | const char *end, const char **nextTokPtr) | |
1320 | { | 1320 | { | |
1321 | int level = 0; | 1321 | int level = 0; | |
1322 | if (MINBPC(enc) > 1) { | 1322 | if (MINBPC(enc) > 1) { | |
1323 | size_t n = end - ptr; | 1323 | size_t n = end - ptr; | |
1324 | if (n & (MINBPC(enc) - 1)) { | 1324 | if (n & (MINBPC(enc) - 1)) { | |
1325 | n &= ~(MINBPC(enc) - 1); | 1325 | n &= ~(MINBPC(enc) - 1); | |
1326 | end = ptr + n; | 1326 | end = ptr + n; | |
1327 | } | 1327 | } | |
1328 | } | 1328 | } | |
1329 | while (ptr != end) { | 1329 | while (ptr < end) { | |
1330 | switch (BYTE_TYPE(enc, ptr)) { | 1330 | switch (BYTE_TYPE(enc, ptr)) { | |
1331 | INVALID_CASES(ptr, nextTokPtr) | 1331 | INVALID_CASES(ptr, nextTokPtr) | |
1332 | case BT_LT: | 1332 | case BT_LT: | |
1333 | if ((ptr += MINBPC(enc)) == end) | 1333 | if ((ptr += MINBPC(enc)) == end) | |
1334 | return XML_TOK_PARTIAL; | 1334 | return XML_TOK_PARTIAL; | |
1335 | if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) { | 1335 | if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) { | |
1336 | if ((ptr += MINBPC(enc)) == end) | 1336 | if ((ptr += MINBPC(enc)) == end) | |
1337 | return XML_TOK_PARTIAL; | 1337 | return XML_TOK_PARTIAL; | |
1338 | if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) { | 1338 | if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) { | |
1339 | ++level; | 1339 | ++level; | |
1340 | ptr += MINBPC(enc); | 1340 | ptr += MINBPC(enc); | |
1341 | } | 1341 | } | |
1342 | } | 1342 | } | |
@@ -1363,27 +1363,27 @@ PREFIX(ignoreSectionTok)(const ENCODING | @@ -1363,27 +1363,27 @@ PREFIX(ignoreSectionTok)(const ENCODING | |||
1363 | } | 1363 | } | |
1364 | } | 1364 | } | |
1365 | return XML_TOK_PARTIAL; | 1365 | return XML_TOK_PARTIAL; | |
1366 | } | 1366 | } | |
1367 | 1367 | |||
1368 | #endif /* XML_DTD */ | 1368 | #endif /* XML_DTD */ | |
1369 | 1369 | |||
1370 | static int PTRCALL | 1370 | static int PTRCALL | |
1371 | PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, | 1371 | PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, | |
1372 | const char **badPtr) | 1372 | const char **badPtr) | |
1373 | { | 1373 | { | |
1374 | ptr += MINBPC(enc); | 1374 | ptr += MINBPC(enc); | |
1375 | end -= MINBPC(enc); | 1375 | end -= MINBPC(enc); | |
1376 | for (; ptr != end; ptr += MINBPC(enc)) { | 1376 | for (; ptr < end; ptr += MINBPC(enc)) { | |
1377 | switch (BYTE_TYPE(enc, ptr)) { | 1377 | switch (BYTE_TYPE(enc, ptr)) { | |
1378 | case BT_DIGIT: | 1378 | case BT_DIGIT: | |
1379 | case BT_HEX: | 1379 | case BT_HEX: | |
1380 | case BT_MINUS: | 1380 | case BT_MINUS: | |
1381 | case BT_APOS: | 1381 | case BT_APOS: | |
1382 | case BT_LPAR: | 1382 | case BT_LPAR: | |
1383 | case BT_RPAR: | 1383 | case BT_RPAR: | |
1384 | case BT_PLUS: | 1384 | case BT_PLUS: | |
1385 | case BT_COMMA: | 1385 | case BT_COMMA: | |
1386 | case BT_SOL: | 1386 | case BT_SOL: | |
1387 | case BT_EQUALS: | 1387 | case BT_EQUALS: | |
1388 | case BT_QUEST: | 1388 | case BT_QUEST: | |
1389 | case BT_CR: | 1389 | case BT_CR: | |
@@ -1750,27 +1750,27 @@ PREFIX(updatePosition)(const ENCODING *e | @@ -1750,27 +1750,27 @@ PREFIX(updatePosition)(const ENCODING *e | |||
1750 | case BT_LEAD ## n: \ | 1750 | case BT_LEAD ## n: \ | |
1751 | ptr += n; \ | 1751 | ptr += n; \ | |
1752 | break; | 1752 | break; | |
1753 | LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) | 1753 | LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) | |
1754 | #undef LEAD_CASE | 1754 | #undef LEAD_CASE | |
1755 | case BT_LF: | 1755 | case BT_LF: | |
1756 | pos->columnNumber = (XML_Size)-1; | 1756 | pos->columnNumber = (XML_Size)-1; | |
1757 | pos->lineNumber++; | 1757 | pos->lineNumber++; | |
1758 | ptr += MINBPC(enc); | 1758 | ptr += MINBPC(enc); | |
1759 | break; | 1759 | break; | |
1760 | case BT_CR: | 1760 | case BT_CR: | |
1761 | pos->lineNumber++; | 1761 | pos->lineNumber++; | |
1762 | ptr += MINBPC(enc); | 1762 | ptr += MINBPC(enc); | |
1763 | if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF) | 1763 | if (ptr < end && BYTE_TYPE(enc, ptr) == BT_LF) | |
1764 | ptr += MINBPC(enc); | 1764 | ptr += MINBPC(enc); | |
1765 | pos->columnNumber = (XML_Size)-1; | 1765 | pos->columnNumber = (XML_Size)-1; | |
1766 | break; | 1766 | break; | |
1767 | default: | 1767 | default: | |
1768 | ptr += MINBPC(enc); | 1768 | ptr += MINBPC(enc); | |
1769 | break; | 1769 | break; | |
1770 | } | 1770 | } | |
1771 | pos->columnNumber++; | 1771 | pos->columnNumber++; | |
1772 | } | 1772 | } | |
1773 | } | 1773 | } | |
1774 | 1774 | |||
1775 | #undef DO_LEAD_CASE | 1775 | #undef DO_LEAD_CASE | |
1776 | #undef MULTIBYTE_CASES | 1776 | #undef MULTIBYTE_CASES |
--- src/external/mit/expat/lib/libexpat/shlib_version 2016/05/14 14:39:39 1.3
+++ src/external/mit/expat/lib/libexpat/shlib_version 2016/05/17 23:53:02 1.4
@@ -1,5 +1,5 @@ | @@ -1,5 +1,5 @@ | |||
1 | # $NetBSD: shlib_version,v 1.3 2016/05/14 14:39:39 spz Exp $ | 1 | # $NetBSD: shlib_version,v 1.4 2016/05/17 23:53:02 spz Exp $ | |
2 | # | 2 | # | |
3 | # XXX netbsd xsrc had major=4 | 3 | # XXX netbsd xsrc had major=4 | |
4 | major=2 | 4 | major=2 | |
5 | minor=2 | 5 | minor=3 |