|
|
|
@ -10,6 +10,7 @@
|
|
|
|
|
|
|
|
|
|
#include "intconfig.h"
|
|
|
|
|
|
|
|
|
|
#include "ascii.h"
|
|
|
|
|
#include "expat.h"
|
|
|
|
|
|
|
|
|
|
#ifdef XML_UNICODE
|
|
|
|
@ -18,7 +19,8 @@
|
|
|
|
|
#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding
|
|
|
|
|
#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS
|
|
|
|
|
#define XmlEncode XmlUtf16Encode
|
|
|
|
|
#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1))
|
|
|
|
|
/* Using pointer subtraction to convert to integer type. */
|
|
|
|
|
#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1))
|
|
|
|
|
typedef unsigned short ICHAR;
|
|
|
|
|
#else
|
|
|
|
|
#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX
|
|
|
|
@ -315,15 +317,15 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity,
|
|
|
|
|
static enum XML_Error
|
|
|
|
|
initializeEncoding(XML_Parser parser);
|
|
|
|
|
static enum XML_Error
|
|
|
|
|
doProlog(XML_Parser parser, const ENCODING *enc, const char *s,
|
|
|
|
|
const char *end, int tok, const char *next, const char **nextPtr,
|
|
|
|
|
doProlog(XML_Parser parser, const ENCODING *enc, const char *s,
|
|
|
|
|
const char *end, int tok, const char *next, const char **nextPtr,
|
|
|
|
|
XML_Bool haveMore);
|
|
|
|
|
static enum XML_Error
|
|
|
|
|
processInternalEntity(XML_Parser parser, ENTITY *entity,
|
|
|
|
|
processInternalEntity(XML_Parser parser, ENTITY *entity,
|
|
|
|
|
XML_Bool betweenDecl);
|
|
|
|
|
static enum XML_Error
|
|
|
|
|
doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
|
|
|
|
|
const char *start, const char *end, const char **endPtr,
|
|
|
|
|
const char *start, const char *end, const char **endPtr,
|
|
|
|
|
XML_Bool haveMore);
|
|
|
|
|
static enum XML_Error
|
|
|
|
|
doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr,
|
|
|
|
@ -341,7 +343,7 @@ static enum XML_Error
|
|
|
|
|
addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
|
|
|
|
|
const XML_Char *uri, BINDING **bindingsPtr);
|
|
|
|
|
static int
|
|
|
|
|
defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata,
|
|
|
|
|
defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata,
|
|
|
|
|
XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser);
|
|
|
|
|
static enum XML_Error
|
|
|
|
|
storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata,
|
|
|
|
@ -657,10 +659,12 @@ XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const XML_Char implicitContext[] = {
|
|
|
|
|
'x', 'm', 'l', '=', 'h', 't', 't', 'p', ':', '/', '/',
|
|
|
|
|
'w', 'w', 'w', '.', 'w', '3', '.', 'o', 'r', 'g', '/',
|
|
|
|
|
'X', 'M', 'L', '/', '1', '9', '9', '8', '/',
|
|
|
|
|
'n', 'a', 'm', 'e', 's', 'p', 'a', 'c', 'e', '\0'
|
|
|
|
|
ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p,
|
|
|
|
|
ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w,
|
|
|
|
|
ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g,
|
|
|
|
|
ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9,
|
|
|
|
|
ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e,
|
|
|
|
|
ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0'
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
XML_Parser XMLCALL
|
|
|
|
@ -753,7 +757,7 @@ parserCreate(const XML_Char *encodingName,
|
|
|
|
|
unknownEncodingHandler = NULL;
|
|
|
|
|
unknownEncodingHandlerData = NULL;
|
|
|
|
|
|
|
|
|
|
namespaceSeparator = '!';
|
|
|
|
|
namespaceSeparator = ASCII_EXCL;
|
|
|
|
|
ns = XML_FALSE;
|
|
|
|
|
ns_triplets = XML_FALSE;
|
|
|
|
|
|
|
|
|
@ -1445,7 +1449,7 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
|
|
|
|
|
XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
|
|
|
|
|
positionPtr = bufferPtr;
|
|
|
|
|
return XML_STATUS_SUSPENDED;
|
|
|
|
|
case XML_INITIALIZED:
|
|
|
|
|
case XML_INITIALIZED:
|
|
|
|
|
case XML_PARSING:
|
|
|
|
|
ps_parsing = XML_FINISHED;
|
|
|
|
|
/* fall through */
|
|
|
|
@ -1568,7 +1572,7 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal)
|
|
|
|
|
case XML_SUSPENDED:
|
|
|
|
|
result = XML_STATUS_SUSPENDED;
|
|
|
|
|
break;
|
|
|
|
|
case XML_INITIALIZED:
|
|
|
|
|
case XML_INITIALIZED:
|
|
|
|
|
case XML_PARSING:
|
|
|
|
|
if (isFinal) {
|
|
|
|
|
ps_parsing = XML_FINISHED;
|
|
|
|
@ -1715,7 +1719,7 @@ XML_ResumeParser(XML_Parser parser)
|
|
|
|
|
case XML_SUSPENDED:
|
|
|
|
|
result = XML_STATUS_SUSPENDED;
|
|
|
|
|
break;
|
|
|
|
|
case XML_INITIALIZED:
|
|
|
|
|
case XML_INITIALIZED:
|
|
|
|
|
case XML_PARSING:
|
|
|
|
|
if (ps_finalBuffer) {
|
|
|
|
|
ps_parsing = XML_FINISHED;
|
|
|
|
@ -1940,6 +1944,9 @@ XML_GetFeatureList(void)
|
|
|
|
|
#ifdef XML_NS
|
|
|
|
|
{XML_FEATURE_NS, XML_L("XML_NS"), 0},
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef XML_LARGE_SIZE
|
|
|
|
|
{XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0},
|
|
|
|
|
#endif
|
|
|
|
|
{XML_FEATURE_END, NULL, 0}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -2002,7 +2009,7 @@ contentProcessor(XML_Parser parser,
|
|
|
|
|
const char *end,
|
|
|
|
|
const char **endPtr)
|
|
|
|
|
{
|
|
|
|
|
enum XML_Error result = doContent(parser, 0, encoding, start, end,
|
|
|
|
|
enum XML_Error result = doContent(parser, 0, encoding, start, end,
|
|
|
|
|
endPtr, (XML_Bool)!ps_finalBuffer);
|
|
|
|
|
if (result == XML_ERROR_NONE) {
|
|
|
|
|
if (!storeRawNames(parser))
|
|
|
|
@ -2084,7 +2091,7 @@ externalEntityInitProcessor3(XML_Parser parser,
|
|
|
|
|
if (result != XML_ERROR_NONE)
|
|
|
|
|
return result;
|
|
|
|
|
switch (ps_parsing) {
|
|
|
|
|
case XML_SUSPENDED:
|
|
|
|
|
case XML_SUSPENDED:
|
|
|
|
|
*endPtr = next;
|
|
|
|
|
return XML_ERROR_NONE;
|
|
|
|
|
case XML_FINISHED:
|
|
|
|
@ -2118,7 +2125,7 @@ externalEntityContentProcessor(XML_Parser parser,
|
|
|
|
|
const char *end,
|
|
|
|
|
const char **endPtr)
|
|
|
|
|
{
|
|
|
|
|
enum XML_Error result = doContent(parser, 1, encoding, start, end,
|
|
|
|
|
enum XML_Error result = doContent(parser, 1, encoding, start, end,
|
|
|
|
|
endPtr, (XML_Bool)!ps_finalBuffer);
|
|
|
|
|
if (result == XML_ERROR_NONE) {
|
|
|
|
|
if (!storeRawNames(parser))
|
|
|
|
@ -2137,7 +2144,7 @@ doContent(XML_Parser parser,
|
|
|
|
|
XML_Bool haveMore)
|
|
|
|
|
{
|
|
|
|
|
/* save one level of indirection */
|
|
|
|
|
DTD * const dtd = _dtd;
|
|
|
|
|
DTD * const dtd = _dtd;
|
|
|
|
|
|
|
|
|
|
const char **eventPP;
|
|
|
|
|
const char **eventEndPP;
|
|
|
|
@ -2168,8 +2175,8 @@ doContent(XML_Parser parser,
|
|
|
|
|
}
|
|
|
|
|
else if (defaultHandler)
|
|
|
|
|
reportDefault(parser, enc, s, end);
|
|
|
|
|
/* We are at the end of the final buffer, should we check for
|
|
|
|
|
XML_SUSPENDED, XML_FINISHED?
|
|
|
|
|
/* We are at the end of the final buffer, should we check for
|
|
|
|
|
XML_SUSPENDED, XML_FINISHED?
|
|
|
|
|
*/
|
|
|
|
|
if (startTagLevel == 0)
|
|
|
|
|
return XML_ERROR_NO_ELEMENTS;
|
|
|
|
@ -2520,8 +2527,8 @@ doContent(XML_Parser parser,
|
|
|
|
|
}
|
|
|
|
|
else if (defaultHandler)
|
|
|
|
|
reportDefault(parser, enc, s, end);
|
|
|
|
|
/* We are at the end of the final buffer, should we check for
|
|
|
|
|
XML_SUSPENDED, XML_FINISHED?
|
|
|
|
|
/* We are at the end of the final buffer, should we check for
|
|
|
|
|
XML_SUSPENDED, XML_FINISHED?
|
|
|
|
|
*/
|
|
|
|
|
if (startTagLevel == 0) {
|
|
|
|
|
*eventPP = end;
|
|
|
|
@ -2533,27 +2540,30 @@ doContent(XML_Parser parser,
|
|
|
|
|
}
|
|
|
|
|
*nextPtr = end;
|
|
|
|
|
return XML_ERROR_NONE;
|
|
|
|
|
case XML_TOK_DATA_CHARS:
|
|
|
|
|
if (characterDataHandler) {
|
|
|
|
|
if (MUST_CONVERT(enc, s)) {
|
|
|
|
|
for (;;) {
|
|
|
|
|
ICHAR *dataPtr = (ICHAR *)dataBuf;
|
|
|
|
|
XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
|
|
|
|
|
*eventEndPP = s;
|
|
|
|
|
characterDataHandler(handlerArg, dataBuf,
|
|
|
|
|
(int)(dataPtr - (ICHAR *)dataBuf));
|
|
|
|
|
if (s == next)
|
|
|
|
|
break;
|
|
|
|
|
*eventPP = s;
|
|
|
|
|
case XML_TOK_DATA_CHARS:
|
|
|
|
|
{
|
|
|
|
|
XML_CharacterDataHandler charDataHandler = characterDataHandler;
|
|
|
|
|
if (charDataHandler) {
|
|
|
|
|
if (MUST_CONVERT(enc, s)) {
|
|
|
|
|
for (;;) {
|
|
|
|
|
ICHAR *dataPtr = (ICHAR *)dataBuf;
|
|
|
|
|
XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
|
|
|
|
|
*eventEndPP = s;
|
|
|
|
|
charDataHandler(handlerArg, dataBuf,
|
|
|
|
|
(int)(dataPtr - (ICHAR *)dataBuf));
|
|
|
|
|
if (s == next)
|
|
|
|
|
break;
|
|
|
|
|
*eventPP = s;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
charDataHandler(handlerArg,
|
|
|
|
|
(XML_Char *)s,
|
|
|
|
|
(int)((XML_Char *)next - (XML_Char *)s));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
characterDataHandler(handlerArg,
|
|
|
|
|
(XML_Char *)s,
|
|
|
|
|
(int)((XML_Char *)next - (XML_Char *)s));
|
|
|
|
|
else if (defaultHandler)
|
|
|
|
|
reportDefault(parser, enc, s, next);
|
|
|
|
|
}
|
|
|
|
|
else if (defaultHandler)
|
|
|
|
|
reportDefault(parser, enc, s, next);
|
|
|
|
|
break;
|
|
|
|
|
case XML_TOK_PI:
|
|
|
|
|
if (!reportProcessingInstruction(parser, enc, s, next))
|
|
|
|
@ -2570,7 +2580,7 @@ doContent(XML_Parser parser,
|
|
|
|
|
}
|
|
|
|
|
*eventPP = s = next;
|
|
|
|
|
switch (ps_parsing) {
|
|
|
|
|
case XML_SUSPENDED:
|
|
|
|
|
case XML_SUSPENDED:
|
|
|
|
|
*nextPtr = next;
|
|
|
|
|
return XML_ERROR_NONE;
|
|
|
|
|
case XML_FINISHED:
|
|
|
|
@ -2798,7 +2808,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
|
|
|
|
|
return XML_ERROR_NO_MEMORY;
|
|
|
|
|
uriHash = CHAR_HASH(uriHash, c);
|
|
|
|
|
}
|
|
|
|
|
while (*s++ != XML_T(':'))
|
|
|
|
|
while (*s++ != XML_T(ASCII_COLON))
|
|
|
|
|
;
|
|
|
|
|
do { /* copies null terminator */
|
|
|
|
|
const XML_Char c = *s;
|
|
|
|
@ -2872,7 +2882,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
|
|
|
|
|
if (!binding)
|
|
|
|
|
return XML_ERROR_UNBOUND_PREFIX;
|
|
|
|
|
localPart = tagNamePtr->str;
|
|
|
|
|
while (*localPart++ != XML_T(':'))
|
|
|
|
|
while (*localPart++ != XML_T(ASCII_COLON))
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
else if (dtd->defaultPrefix.binding) {
|
|
|
|
@ -2927,25 +2937,29 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
|
|
|
|
|
const XML_Char *uri, BINDING **bindingsPtr)
|
|
|
|
|
{
|
|
|
|
|
static const XML_Char xmlNamespace[] = {
|
|
|
|
|
'h', 't', 't', 'p', ':', '/', '/',
|
|
|
|
|
'w', 'w', 'w', '.', 'w', '3', '.', 'o', 'r', 'g', '/',
|
|
|
|
|
'X', 'M', 'L', '/', '1', '9', '9', '8', '/',
|
|
|
|
|
'n', 'a', 'm', 'e', 's', 'p', 'a', 'c', 'e', '\0'
|
|
|
|
|
ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH,
|
|
|
|
|
ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD,
|
|
|
|
|
ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L,
|
|
|
|
|
ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH,
|
|
|
|
|
ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c,
|
|
|
|
|
ASCII_e, '\0'
|
|
|
|
|
};
|
|
|
|
|
static const int xmlLen =
|
|
|
|
|
static const int xmlLen =
|
|
|
|
|
(int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1;
|
|
|
|
|
static const XML_Char xmlnsNamespace[] = {
|
|
|
|
|
'h', 't', 't', 'p', ':', '/', '/',
|
|
|
|
|
'w', 'w', 'w', '.', 'w', '3', '.', 'o', 'r', 'g', '/',
|
|
|
|
|
'2', '0', '0', '0', '/', 'x', 'm', 'l', 'n', 's', '/', '\0'
|
|
|
|
|
ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH,
|
|
|
|
|
ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD,
|
|
|
|
|
ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0,
|
|
|
|
|
ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s,
|
|
|
|
|
ASCII_SLASH, '\0'
|
|
|
|
|
};
|
|
|
|
|
static const int xmlnsLen =
|
|
|
|
|
static const int xmlnsLen =
|
|
|
|
|
(int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1;
|
|
|
|
|
|
|
|
|
|
XML_Bool mustBeXML = XML_FALSE;
|
|
|
|
|
XML_Bool isXML = XML_TRUE;
|
|
|
|
|
XML_Bool isXMLNS = XML_TRUE;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BINDING *b;
|
|
|
|
|
int len;
|
|
|
|
|
|
|
|
|
@ -2954,13 +2968,13 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
|
|
|
|
|
return XML_ERROR_UNDECLARING_PREFIX;
|
|
|
|
|
|
|
|
|
|
if (prefix->name
|
|
|
|
|
&& prefix->name[0] == XML_T('x')
|
|
|
|
|
&& prefix->name[1] == XML_T('m')
|
|
|
|
|
&& prefix->name[2] == XML_T('l')) {
|
|
|
|
|
&& prefix->name[0] == XML_T(ASCII_x)
|
|
|
|
|
&& prefix->name[1] == XML_T(ASCII_m)
|
|
|
|
|
&& prefix->name[2] == XML_T(ASCII_l)) {
|
|
|
|
|
|
|
|
|
|
/* Not allowed to bind xmlns */
|
|
|
|
|
if (prefix->name[3] == XML_T('n')
|
|
|
|
|
&& prefix->name[4] == XML_T('s')
|
|
|
|
|
if (prefix->name[3] == XML_T(ASCII_n)
|
|
|
|
|
&& prefix->name[4] == XML_T(ASCII_s)
|
|
|
|
|
&& prefix->name[5] == XML_T('\0'))
|
|
|
|
|
return XML_ERROR_RESERVED_PREFIX_XMLNS;
|
|
|
|
|
|
|
|
|
@ -2972,7 +2986,7 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
|
|
|
|
|
if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len]))
|
|
|
|
|
isXML = XML_FALSE;
|
|
|
|
|
|
|
|
|
|
if (!mustBeXML && isXMLNS
|
|
|
|
|
if (!mustBeXML && isXMLNS
|
|
|
|
|
&& (len > xmlnsLen || uri[len] != xmlnsNamespace[len]))
|
|
|
|
|
isXMLNS = XML_FALSE;
|
|
|
|
|
}
|
|
|
|
@ -3114,26 +3128,29 @@ doCdataSection(XML_Parser parser,
|
|
|
|
|
reportDefault(parser, enc, s, next);
|
|
|
|
|
break;
|
|
|
|
|
case XML_TOK_DATA_CHARS:
|
|
|
|
|
if (characterDataHandler) {
|
|
|
|
|
if (MUST_CONVERT(enc, s)) {
|
|
|
|
|
for (;;) {
|
|
|
|
|
ICHAR *dataPtr = (ICHAR *)dataBuf;
|
|
|
|
|
XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
|
|
|
|
|
*eventEndPP = next;
|
|
|
|
|
characterDataHandler(handlerArg, dataBuf,
|
|
|
|
|
(int)(dataPtr - (ICHAR *)dataBuf));
|
|
|
|
|
if (s == next)
|
|
|
|
|
break;
|
|
|
|
|
*eventPP = s;
|
|
|
|
|
{
|
|
|
|
|
XML_CharacterDataHandler charDataHandler = characterDataHandler;
|
|
|
|
|
if (charDataHandler) {
|
|
|
|
|
if (MUST_CONVERT(enc, s)) {
|
|
|
|
|
for (;;) {
|
|
|
|
|
ICHAR *dataPtr = (ICHAR *)dataBuf;
|
|
|
|
|
XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
|
|
|
|
|
*eventEndPP = next;
|
|
|
|
|
charDataHandler(handlerArg, dataBuf,
|
|
|
|
|
(int)(dataPtr - (ICHAR *)dataBuf));
|
|
|
|
|
if (s == next)
|
|
|
|
|
break;
|
|
|
|
|
*eventPP = s;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
charDataHandler(handlerArg,
|
|
|
|
|
(XML_Char *)s,
|
|
|
|
|
(int)((XML_Char *)next - (XML_Char *)s));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
characterDataHandler(handlerArg,
|
|
|
|
|
(XML_Char *)s,
|
|
|
|
|
(int)((XML_Char *)next - (XML_Char *)s));
|
|
|
|
|
else if (defaultHandler)
|
|
|
|
|
reportDefault(parser, enc, s, next);
|
|
|
|
|
}
|
|
|
|
|
else if (defaultHandler)
|
|
|
|
|
reportDefault(parser, enc, s, next);
|
|
|
|
|
break;
|
|
|
|
|
case XML_TOK_INVALID:
|
|
|
|
|
*eventPP = next;
|
|
|
|
@ -3180,7 +3197,7 @@ ignoreSectionProcessor(XML_Parser parser,
|
|
|
|
|
const char *end,
|
|
|
|
|
const char **endPtr)
|
|
|
|
|
{
|
|
|
|
|
enum XML_Error result = doIgnoreSection(parser, encoding, &start, end,
|
|
|
|
|
enum XML_Error result = doIgnoreSection(parser, encoding, &start, end,
|
|
|
|
|
endPtr, (XML_Bool)!ps_finalBuffer);
|
|
|
|
|
if (result != XML_ERROR_NONE)
|
|
|
|
|
return result;
|
|
|
|
@ -3462,7 +3479,7 @@ entityValueInitProcessor(XML_Parser parser,
|
|
|
|
|
const char *next = start;
|
|
|
|
|
eventPtr = start;
|
|
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
|
for (;;) {
|
|
|
|
|
tok = XmlPrologTok(encoding, start, end, &next);
|
|
|
|
|
eventEndPtr = next;
|
|
|
|
|
if (tok <= 0) {
|
|
|
|
@ -3490,7 +3507,7 @@ entityValueInitProcessor(XML_Parser parser,
|
|
|
|
|
if (result != XML_ERROR_NONE)
|
|
|
|
|
return result;
|
|
|
|
|
switch (ps_parsing) {
|
|
|
|
|
case XML_SUSPENDED:
|
|
|
|
|
case XML_SUSPENDED:
|
|
|
|
|
*nextPtr = next;
|
|
|
|
|
return XML_ERROR_NONE;
|
|
|
|
|
case XML_FINISHED:
|
|
|
|
@ -3555,7 +3572,7 @@ externalParEntProcessor(XML_Parser parser,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
processor = prologProcessor;
|
|
|
|
|
return doProlog(parser, encoding, s, end, tok, next,
|
|
|
|
|
return doProlog(parser, encoding, s, end, tok, next,
|
|
|
|
|
nextPtr, (XML_Bool)!ps_finalBuffer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -3605,7 +3622,7 @@ prologProcessor(XML_Parser parser,
|
|
|
|
|
{
|
|
|
|
|
const char *next = s;
|
|
|
|
|
int tok = XmlPrologTok(encoding, s, end, &next);
|
|
|
|
|
return doProlog(parser, encoding, s, end, tok, next,
|
|
|
|
|
return doProlog(parser, encoding, s, end, tok, next,
|
|
|
|
|
nextPtr, (XML_Bool)!ps_finalBuffer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -3620,26 +3637,30 @@ doProlog(XML_Parser parser,
|
|
|
|
|
XML_Bool haveMore)
|
|
|
|
|
{
|
|
|
|
|
#ifdef XML_DTD
|
|
|
|
|
static const XML_Char externalSubsetName[] = { '#' , '\0' };
|
|
|
|
|
static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' };
|
|
|
|
|
#endif /* XML_DTD */
|
|
|
|
|
static const XML_Char atypeCDATA[] = { 'C', 'D', 'A', 'T', 'A', '\0' };
|
|
|
|
|
static const XML_Char atypeID[] = { 'I', 'D', '\0' };
|
|
|
|
|
static const XML_Char atypeIDREF[] = { 'I', 'D', 'R', 'E', 'F', '\0' };
|
|
|
|
|
static const XML_Char atypeIDREFS[] = { 'I', 'D', 'R', 'E', 'F', 'S', '\0' };
|
|
|
|
|
static const XML_Char atypeENTITY[] = { 'E', 'N', 'T', 'I', 'T', 'Y', '\0' };
|
|
|
|
|
static const XML_Char atypeENTITIES[] =
|
|
|
|
|
{ 'E', 'N', 'T', 'I', 'T', 'I', 'E', 'S', '\0' };
|
|
|
|
|
static const XML_Char atypeCDATA[] =
|
|
|
|
|
{ ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
|
|
|
|
|
static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' };
|
|
|
|
|
static const XML_Char atypeIDREF[] =
|
|
|
|
|
{ ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };
|
|
|
|
|
static const XML_Char atypeIDREFS[] =
|
|
|
|
|
{ ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };
|
|
|
|
|
static const XML_Char atypeENTITY[] =
|
|
|
|
|
{ ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };
|
|
|
|
|
static const XML_Char atypeENTITIES[] = { ASCII_E, ASCII_N,
|
|
|
|
|
ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' };
|
|
|
|
|
static const XML_Char atypeNMTOKEN[] = {
|
|
|
|
|
'N', 'M', 'T', 'O', 'K', 'E', 'N', '\0' };
|
|
|
|
|
static const XML_Char atypeNMTOKENS[] = {
|
|
|
|
|
'N', 'M', 'T', 'O', 'K', 'E', 'N', 'S', '\0' };
|
|
|
|
|
static const XML_Char notationPrefix[] = {
|
|
|
|
|
'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N', '(', '\0' };
|
|
|
|
|
static const XML_Char enumValueSep[] = { '|', '\0' };
|
|
|
|
|
static const XML_Char enumValueStart[] = { '(', '\0' };
|
|
|
|
|
ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };
|
|
|
|
|
static const XML_Char atypeNMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T,
|
|
|
|
|
ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' };
|
|
|
|
|
static const XML_Char notationPrefix[] = { ASCII_N, ASCII_O, ASCII_T,
|
|
|
|
|
ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0' };
|
|
|
|
|
static const XML_Char enumValueSep[] = { ASCII_PIPE, '\0' };
|
|
|
|
|
static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' };
|
|
|
|
|
|
|
|
|
|
/* save one level of indirection */
|
|
|
|
|
DTD * const dtd = _dtd;
|
|
|
|
|
DTD * const dtd = _dtd;
|
|
|
|
|
|
|
|
|
|
const char **eventPP;
|
|
|
|
|
const char **eventEndPP;
|
|
|
|
@ -3751,16 +3772,14 @@ doProlog(XML_Parser parser,
|
|
|
|
|
#endif /* XML_DTD */
|
|
|
|
|
dtd->hasParamEntityRefs = XML_TRUE;
|
|
|
|
|
if (startDoctypeDeclHandler) {
|
|
|
|
|
XML_Char *tem;
|
|
|
|
|
if (!XmlIsPublicId(enc, s, next, eventPP))
|
|
|
|
|
return XML_ERROR_PUBLICID;
|
|
|
|
|
tem = poolStoreString(&tempPool, enc,
|
|
|
|
|
doctypePubid = poolStoreString(&tempPool, enc,
|
|
|
|
|
s + enc->minBytesPerChar,
|
|
|
|
|
next - enc->minBytesPerChar);
|
|
|
|
|
if (!tem)
|
|
|
|
|
if (!doctypePubid)
|
|
|
|
|
return XML_ERROR_NO_MEMORY;
|
|
|
|
|
normalizePublicId(tem);
|
|
|
|
|
doctypePubid = tem;
|
|
|
|
|
normalizePublicId((XML_Char *)doctypePubid);
|
|
|
|
|
poolFinish(&tempPool);
|
|
|
|
|
handleDefault = XML_FALSE;
|
|
|
|
|
goto alreadyChecked;
|
|
|
|
@ -3815,8 +3834,8 @@ doProlog(XML_Parser parser,
|
|
|
|
|
entity->publicId))
|
|
|
|
|
return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
|
|
|
|
|
if (dtd->paramEntityRead) {
|
|
|
|
|
if (!dtd->standalone &&
|
|
|
|
|
notStandaloneHandler &&
|
|
|
|
|
if (!dtd->standalone &&
|
|
|
|
|
notStandaloneHandler &&
|
|
|
|
|
!notStandaloneHandler(handlerArg))
|
|
|
|
|
return XML_ERROR_NOT_STANDALONE;
|
|
|
|
|
}
|
|
|
|
@ -3944,11 +3963,11 @@ doProlog(XML_Parser parser,
|
|
|
|
|
0, parser))
|
|
|
|
|
return XML_ERROR_NO_MEMORY;
|
|
|
|
|
if (attlistDeclHandler && declAttributeType) {
|
|
|
|
|
if (*declAttributeType == XML_T('(')
|
|
|
|
|
|| (*declAttributeType == XML_T('N')
|
|
|
|
|
&& declAttributeType[1] == XML_T('O'))) {
|
|
|
|
|
if (*declAttributeType == XML_T(ASCII_LPAREN)
|
|
|
|
|
|| (*declAttributeType == XML_T(ASCII_N)
|
|
|
|
|
&& declAttributeType[1] == XML_T(ASCII_O))) {
|
|
|
|
|
/* Enumerated or Notation type */
|
|
|
|
|
if (!poolAppendChar(&tempPool, XML_T(')'))
|
|
|
|
|
if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN))
|
|
|
|
|
|| !poolAppendChar(&tempPool, XML_T('\0')))
|
|
|
|
|
return XML_ERROR_NO_MEMORY;
|
|
|
|
|
declAttributeType = tempPool.start;
|
|
|
|
@ -3981,11 +4000,11 @@ doProlog(XML_Parser parser,
|
|
|
|
|
declAttributeIsCdata, XML_FALSE, attVal, parser))
|
|
|
|
|
return XML_ERROR_NO_MEMORY;
|
|
|
|
|
if (attlistDeclHandler && declAttributeType) {
|
|
|
|
|
if (*declAttributeType == XML_T('(')
|
|
|
|
|
|| (*declAttributeType == XML_T('N')
|
|
|
|
|
&& declAttributeType[1] == XML_T('O'))) {
|
|
|
|
|
if (*declAttributeType == XML_T(ASCII_LPAREN)
|
|
|
|
|
|| (*declAttributeType == XML_T(ASCII_N)
|
|
|
|
|
&& declAttributeType[1] == XML_T(ASCII_O))) {
|
|
|
|
|
/* Enumerated or Notation type */
|
|
|
|
|
if (!poolAppendChar(&tempPool, XML_T(')'))
|
|
|
|
|
if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN))
|
|
|
|
|
|| !poolAppendChar(&tempPool, XML_T('\0')))
|
|
|
|
|
return XML_ERROR_NO_MEMORY;
|
|
|
|
|
declAttributeType = tempPool.start;
|
|
|
|
@ -4254,7 +4273,7 @@ doProlog(XML_Parser parser,
|
|
|
|
|
switch (tok) {
|
|
|
|
|
case XML_TOK_PARAM_ENTITY_REF:
|
|
|
|
|
/* PE references in internal subset are
|
|
|
|
|
not allowed within declarations. */
|
|
|
|
|
not allowed within declarations. */
|
|
|
|
|
return XML_ERROR_PARAM_ENTITY_REF;
|
|
|
|
|
case XML_TOK_XML_DECL:
|
|
|
|
|
return XML_ERROR_MISPLACED_XML_PI;
|
|
|
|
@ -4312,14 +4331,14 @@ doProlog(XML_Parser parser,
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case XML_ROLE_GROUP_SEQUENCE:
|
|
|
|
|
if (groupConnector[prologState.level] == '|')
|
|
|
|
|
if (groupConnector[prologState.level] == ASCII_PIPE)
|
|
|
|
|
return XML_ERROR_SYNTAX;
|
|
|
|
|
groupConnector[prologState.level] = ',';
|
|
|
|
|
groupConnector[prologState.level] = ASCII_COMMA;
|
|
|
|
|
if (dtd->in_eldecl && elementDeclHandler)
|
|
|
|
|
handleDefault = XML_FALSE;
|
|
|
|
|
break;
|
|
|
|
|
case XML_ROLE_GROUP_CHOICE:
|
|
|
|
|
if (groupConnector[prologState.level] == ',')
|
|
|
|
|
if (groupConnector[prologState.level] == ASCII_COMMA)
|
|
|
|
|
return XML_ERROR_SYNTAX;
|
|
|
|
|
if (dtd->in_eldecl
|
|
|
|
|
&& !groupConnector[prologState.level]
|
|
|
|
@ -4331,7 +4350,7 @@ doProlog(XML_Parser parser,
|
|
|
|
|
if (elementDeclHandler)
|
|
|
|
|
handleDefault = XML_FALSE;
|
|
|
|
|
}
|
|
|
|
|
groupConnector[prologState.level] = '|';
|
|
|
|
|
groupConnector[prologState.level] = ASCII_PIPE;
|
|
|
|
|
break;
|
|
|
|
|
case XML_ROLE_PARAM_ENTITY_REF:
|
|
|
|
|
#ifdef XML_DTD
|
|
|
|
@ -4375,7 +4394,7 @@ doProlog(XML_Parser parser,
|
|
|
|
|
return XML_ERROR_RECURSIVE_ENTITY_REF;
|
|
|
|
|
if (entity->textPtr) {
|
|
|
|
|
enum XML_Error result;
|
|
|
|
|
XML_Bool betweenDecl =
|
|
|
|
|
XML_Bool betweenDecl =
|
|
|
|
|
(role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE);
|
|
|
|
|
result = processInternalEntity(parser, entity, betweenDecl);
|
|
|
|
|
if (result != XML_ERROR_NONE)
|
|
|
|
@ -4570,7 +4589,7 @@ doProlog(XML_Parser parser,
|
|
|
|
|
reportDefault(parser, enc, s, next);
|
|
|
|
|
|
|
|
|
|
switch (ps_parsing) {
|
|
|
|
|
case XML_SUSPENDED:
|
|
|
|
|
case XML_SUSPENDED:
|
|
|
|
|
*nextPtr = next;
|
|
|
|
|
return XML_ERROR_NONE;
|
|
|
|
|
case XML_FINISHED:
|
|
|
|
@ -4640,7 +4659,7 @@ epilogProcessor(XML_Parser parser,
|
|
|
|
|
}
|
|
|
|
|
eventPtr = s = next;
|
|
|
|
|
switch (ps_parsing) {
|
|
|
|
|
case XML_SUSPENDED:
|
|
|
|
|
case XML_SUSPENDED:
|
|
|
|
|
*nextPtr = next;
|
|
|
|
|
return XML_ERROR_NONE;
|
|
|
|
|
case XML_FINISHED:
|
|
|
|
@ -4683,12 +4702,12 @@ processInternalEntity(XML_Parser parser, ENTITY *entity,
|
|
|
|
|
#ifdef XML_DTD
|
|
|
|
|
if (entity->is_param) {
|
|
|
|
|
int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next);
|
|
|
|
|
result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
|
|
|
|
|
result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
|
|
|
|
|
next, &next, XML_FALSE);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
else
|
|
|
|
|
#endif /* XML_DTD */
|
|
|
|
|
result = doContent(parser, tagLevel, internalEncoding, textStart,
|
|
|
|
|
result = doContent(parser, tagLevel, internalEncoding, textStart,
|
|
|
|
|
textEnd, &next, XML_FALSE);
|
|
|
|
|
|
|
|
|
|
if (result == XML_ERROR_NONE) {
|
|
|
|
@ -4728,13 +4747,13 @@ internalEntityProcessor(XML_Parser parser,
|
|
|
|
|
#ifdef XML_DTD
|
|
|
|
|
if (entity->is_param) {
|
|
|
|
|
int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next);
|
|
|
|
|
result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
|
|
|
|
|
result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
|
|
|
|
|
next, &next, XML_FALSE);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
#endif /* XML_DTD */
|
|
|
|
|
result = doContent(parser, openEntity->startTagLevel, internalEncoding,
|
|
|
|
|
textStart, textEnd, &next, XML_FALSE);
|
|
|
|
|
result = doContent(parser, openEntity->startTagLevel, internalEncoding,
|
|
|
|
|
textStart, textEnd, &next, XML_FALSE);
|
|
|
|
|
|
|
|
|
|
if (result != XML_ERROR_NONE)
|
|
|
|
|
return result;
|
|
|
|
@ -4755,7 +4774,7 @@ internalEntityProcessor(XML_Parser parser,
|
|
|
|
|
int tok;
|
|
|
|
|
processor = prologProcessor;
|
|
|
|
|
tok = XmlPrologTok(encoding, s, end, &next);
|
|
|
|
|
return doProlog(parser, encoding, s, end, tok, next, nextPtr,
|
|
|
|
|
return doProlog(parser, encoding, s, end, tok, next, nextPtr,
|
|
|
|
|
(XML_Bool)!ps_finalBuffer);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@ -4764,8 +4783,8 @@ internalEntityProcessor(XML_Parser parser,
|
|
|
|
|
processor = contentProcessor;
|
|
|
|
|
/* see externalEntityContentProcessor vs contentProcessor */
|
|
|
|
|
return doContent(parser, parentParser ? 1 : 0, encoding, s, end,
|
|
|
|
|
nextPtr, (XML_Bool)!ps_finalBuffer);
|
|
|
|
|
}
|
|
|
|
|
nextPtr, (XML_Bool)!ps_finalBuffer);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum XML_Error PTRCALL
|
|
|
|
@ -5261,7 +5280,7 @@ setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType)
|
|
|
|
|
DTD * const dtd = _dtd; /* save one level of indirection */
|
|
|
|
|
const XML_Char *name;
|
|
|
|
|
for (name = elementType->name; *name; name++) {
|
|
|
|
|
if (*name == XML_T(':')) {
|
|
|
|
|
if (*name == XML_T(ASCII_COLON)) {
|
|
|
|
|
PREFIX *prefix;
|
|
|
|
|
const XML_Char *s;
|
|
|
|
|
for (s = elementType->name; s != name; s++) {
|
|
|
|
@ -5308,12 +5327,12 @@ getAttributeId(XML_Parser parser, const ENCODING *enc,
|
|
|
|
|
poolFinish(&dtd->pool);
|
|
|
|
|
if (!ns)
|
|
|
|
|
;
|
|
|
|
|
else if (name[0] == XML_T('x')
|
|
|
|
|
&& name[1] == XML_T('m')
|
|
|
|
|
&& name[2] == XML_T('l')
|
|
|
|
|
&& name[3] == XML_T('n')
|
|
|
|
|
&& name[4] == XML_T('s')
|
|
|
|
|
&& (name[5] == XML_T('\0') || name[5] == XML_T(':'))) {
|
|
|
|
|
else if (name[0] == XML_T(ASCII_x)
|
|
|
|
|
&& name[1] == XML_T(ASCII_m)
|
|
|
|
|
&& name[2] == XML_T(ASCII_l)
|
|
|
|
|
&& name[3] == XML_T(ASCII_n)
|
|
|
|
|
&& name[4] == XML_T(ASCII_s)
|
|
|
|
|
&& (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) {
|
|
|
|
|
if (name[5] == XML_T('\0'))
|
|
|
|
|
id->prefix = &dtd->defaultPrefix;
|
|
|
|
|
else
|
|
|
|
@ -5324,7 +5343,7 @@ getAttributeId(XML_Parser parser, const ENCODING *enc,
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; name[i]; i++) {
|
|
|
|
|
/* attributes without prefix are *not* in the default namespace */
|
|
|
|
|
if (name[i] == XML_T(':')) {
|
|
|
|
|
if (name[i] == XML_T(ASCII_COLON)) {
|
|
|
|
|
int j;
|
|
|
|
|
for (j = 0; j < i; j++) {
|
|
|
|
|
if (!poolAppendChar(&dtd->pool, name[j]))
|
|
|
|
@ -5346,7 +5365,7 @@ getAttributeId(XML_Parser parser, const ENCODING *enc,
|
|
|
|
|
return id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define CONTEXT_SEP XML_T('\f')
|
|
|
|
|
#define CONTEXT_SEP XML_T(ASCII_FF)
|
|
|
|
|
|
|
|
|
|
static const XML_Char *
|
|
|
|
|
getContext(XML_Parser parser)
|
|
|
|
@ -5358,7 +5377,7 @@ getContext(XML_Parser parser)
|
|
|
|
|
if (dtd->defaultPrefix.binding) {
|
|
|
|
|
int i;
|
|
|
|
|
int len;
|
|
|
|
|
if (!poolAppendChar(&tempPool, XML_T('=')))
|
|
|
|
|
if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS)))
|
|
|
|
|
return NULL;
|
|
|
|
|
len = dtd->defaultPrefix.binding->uriLen;
|
|
|
|
|
if (namespaceSeparator)
|
|
|
|
@ -5384,7 +5403,7 @@ getContext(XML_Parser parser)
|
|
|
|
|
for (s = prefix->name; *s; s++)
|
|
|
|
|
if (!poolAppendChar(&tempPool, *s))
|
|
|
|
|
return NULL;
|
|
|
|
|
if (!poolAppendChar(&tempPool, XML_T('=')))
|
|
|
|
|
if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS)))
|
|
|
|
|
return NULL;
|
|
|
|
|
len = prefix->binding->uriLen;
|
|
|
|
|
if (namespaceSeparator)
|
|
|
|
@ -5436,7 +5455,7 @@ setContext(XML_Parser parser, const XML_Char *context)
|
|
|
|
|
context = s;
|
|
|
|
|
poolDiscard(&tempPool);
|
|
|
|
|
}
|
|
|
|
|
else if (*s == XML_T('=')) {
|
|
|
|
|
else if (*s == XML_T(ASCII_EQUALS)) {
|
|
|
|
|
PREFIX *prefix;
|
|
|
|
|
if (poolLength(&tempPool) == 0)
|
|
|
|
|
prefix = &dtd->defaultPrefix;
|
|
|
|
|