Tue May 17 23:53:02 2016 UTC ()
Fixes for CVE-2016-0718 from upstream.


(spz)
diff -r1.771 -r1.772 src/distrib/sets/lists/base/shl.mi
diff -r1.133 -r1.134 src/distrib/sets/lists/debug/shl.mi
diff -r1.4 -r1.5 src/external/mit/expat/dist/lib/xmlparse.c
diff -r1.1.1.2 -r1.2 src/external/mit/expat/dist/lib/xmltok.c
diff -r1.1.1.1 -r1.2 src/external/mit/expat/dist/lib/xmltok.h
diff -r1.3 -r1.4 src/external/mit/expat/dist/lib/xmltok_impl.c
diff -r1.3 -r1.4 src/external/mit/expat/lib/libexpat/shlib_version

cvs diff -r1.771 -r1.772 src/distrib/sets/lists/base/shl.mi (expand / switch to unified diff)

--- 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

cvs diff -r1.133 -r1.134 src/distrib/sets/lists/debug/shl.mi (expand / switch to unified diff)

--- 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

cvs diff -r1.4 -r1.5 src/external/mit/expat/dist/lib/xmlparse.c (expand / switch to unified diff)

--- 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
5340static void 5342static void
5341reportDefault(XML_Parser parser, const ENCODING *enc, 5343reportDefault(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
5368static int 5371static int
5369defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, 5372defineAttribute(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
6159static XML_Char * 6162static XML_Char *
6160poolAppend(STRING_POOL *pool, const ENCODING *enc, 6163poolAppend(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
6175static const XML_Char * FASTCALL 6178static const XML_Char * FASTCALL
6176poolCopyString(STRING_POOL *pool, const XML_Char *s) 6179poolCopyString(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,

cvs diff -r1.1.1.2 -r1.2 src/external/mit/expat/dist/lib/xmltok.c (expand / switch to unified diff)

--- 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
314enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ 314enum { /* 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
321static void PTRCALL 321static enum XML_Convert_Result PTRCALL
322utf8_toUtf8(const ENCODING *enc, 322utf8_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
340static void PTRCALL 347static enum XML_Convert_Result PTRCALL
341utf8_toUtf16(const ENCODING *enc, 348utf8_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 }
377after: 399after:
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
383static const struct normal_encoding utf8_encoding_ns = { 406static 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
417static const struct normal_encoding internal_utf8_encoding = { 440static 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
428static void PTRCALL 451static enum XML_Convert_Result PTRCALL
429latin1_toUtf8(const ENCODING *enc, 452latin1_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
453static void PTRCALL 476static enum XML_Convert_Result PTRCALL
454latin1_toUtf16(const ENCODING *enc, 477latin1_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
464static const struct normal_encoding latin1_encoding_ns = { 492static 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
475static const struct normal_encoding latin1_encoding = { 503static 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
486static void PTRCALL 514static enum XML_Convert_Result PTRCALL
487ascii_toUtf8(const ENCODING *enc, 515ascii_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
497static const struct normal_encoding ascii_encoding_ns = { 530static 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) \
539static void PTRCALL \ 572static enum XML_Convert_Result PTRCALL \
540E ## toUtf8(const ENCODING *enc, \ 573E ## 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) \
602static void PTRCALL \ 644static enum XML_Convert_Result PTRCALL \
603E ## toUtf16(const ENCODING *enc, \ 645E ## 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
620DEFINE_UTF16_TO_UTF8(little2_) 670DEFINE_UTF16_TO_UTF8(little2_)
621DEFINE_UTF16_TO_UTF16(little2_) 671DEFINE_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
1283static int PTRFASTCALL 1333static int PTRFASTCALL
1284unknown_isInvalid(const ENCODING *enc, const char *p) 1334unknown_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
1291static void PTRCALL 1341static enum XML_Convert_Result PTRCALL
1292unknown_toUtf8(const ENCODING *enc, 1342unknown_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
1325static void PTRCALL 1375static enum XML_Convert_Result PTRCALL
1326unknown_toUtf16(const ENCODING *enc, 1376unknown_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
1345ENCODING * 1400ENCODING *
1346XmlInitUnknownEncoding(void *mem, 1401XmlInitUnknownEncoding(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
1496static int 1551static int
1497initScan(const ENCODING * const *encodingTable, 1552initScan(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:

cvs diff -r1.1.1.1 -r1.2 src/external/mit/expat/dist/lib/xmltok.h (expand / switch to unified diff)

--- 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
125struct encoding; 125struct encoding;
126typedef struct encoding ENCODING; 126typedef struct encoding ENCODING;
127 127
128typedef int (PTRCALL *SCANNER)(const ENCODING *, 128typedef 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
 133enum 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
133struct encoding { 139struct 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

cvs diff -r1.3 -r1.4 src/external/mit/expat/dist/lib/xmltok_impl.c (expand / switch to unified diff)

--- 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
92static int PTRCALL 92static int PTRCALL
93PREFIX(scanComment)(const ENCODING *enc, const char *ptr, 93PREFIX(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
223PREFIX(scanPi)(const ENCODING *enc, const char *ptr, 223PREFIX(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
304static int PTRCALL 304static int PTRCALL
305PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, 305PREFIX(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
382static int PTRCALL 382static int PTRCALL
383PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, 383PREFIX(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
431static int PTRCALL 431static int PTRCALL
432PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, 432PREFIX(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
463static int PTRCALL 463static int PTRCALL
464PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, 464PREFIX(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
496PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end, 496PREFIX(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
525static int PTRCALL 525static int PTRCALL
526PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end, 526PREFIX(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
784static int PTRCALL 784static int PTRCALL
785PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, 785PREFIX(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
912static int PTRCALL 912static int PTRCALL
913PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, 913PREFIX(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
939static int PTRCALL 939static int PTRCALL
940PREFIX(scanLit)(int open, const ENCODING *enc, 940PREFIX(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
971static int PTRCALL 971static int PTRCALL
972PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, 972PREFIX(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
1202static int PTRCALL 1202static int PTRCALL
1203PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, 1203PREFIX(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
1260static int PTRCALL 1260static int PTRCALL
1261PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, 1261PREFIX(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
1317static int PTRCALL 1317static int PTRCALL
1318PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, 1318PREFIX(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
1370static int PTRCALL 1370static int PTRCALL
1371PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, 1371PREFIX(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

cvs diff -r1.3 -r1.4 src/external/mit/expat/lib/libexpat/shlib_version (expand / switch to unified diff)

--- 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
4major=2 4major=2
5minor=2 5minor=3