| Index: third_party/expat/files/lib/xmlparse.c
|
| diff --git a/third_party/expat/files/lib/xmlparse.c b/third_party/expat/files/lib/xmlparse.c
|
| index 94e31de9da3f3ce3d52755923e98602844b1330d..f35aa36ba8a7fce3bae90f31b20354435b15d2f2 100644
|
| --- a/third_party/expat/files/lib/xmlparse.c
|
| +++ b/third_party/expat/files/lib/xmlparse.c
|
| @@ -5,6 +5,8 @@
|
| #include <stddef.h>
|
| #include <string.h> /* memset(), memcpy() */
|
| #include <assert.h>
|
| +#include <limits.h> /* UINT_MAX */
|
| +#include <time.h> /* time() */
|
|
|
| #define XML_BUILDING_EXPAT 1
|
|
|
| @@ -12,7 +14,7 @@
|
| #include "winconfig.h"
|
| #elif defined(MACOS_CLASSIC)
|
| #include "macconfig.h"
|
| -#elif defined(__amigaos4__)
|
| +#elif defined(__amigaos__)
|
| #include "amigaconfig.h"
|
| #elif defined(__WATCOMC__)
|
| #include "watcomconfig.h"
|
| @@ -327,15 +329,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,
|
| @@ -353,7 +355,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,
|
| @@ -391,12 +393,13 @@ static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms);
|
| static void
|
| dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms);
|
| static int
|
| -dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms);
|
| +dtdCopy(XML_Parser oldParser,
|
| + DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms);
|
| static int
|
| -copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *);
|
| -
|
| +copyEntityTable(XML_Parser oldParser,
|
| + HASH_TABLE *, STRING_POOL *, const HASH_TABLE *);
|
| static NAMED *
|
| -lookup(HASH_TABLE *table, KEY name, size_t createSize);
|
| +lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize);
|
| static void FASTCALL
|
| hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms);
|
| static void FASTCALL hashTableClear(HASH_TABLE *);
|
| @@ -429,11 +432,15 @@ static ELEMENT_TYPE *
|
| getElementType(XML_Parser parser, const ENCODING *enc,
|
| const char *ptr, const char *end);
|
|
|
| +static unsigned long generate_hash_secret_salt(void);
|
| +static XML_Bool startParsing(XML_Parser parser);
|
| +
|
| static XML_Parser
|
| parserCreate(const XML_Char *encodingName,
|
| const XML_Memory_Handling_Suite *memsuite,
|
| const XML_Char *nameSep,
|
| DTD *dtd);
|
| +
|
| static void
|
| parserInit(XML_Parser parser, const XML_Char *encodingName);
|
|
|
| @@ -533,6 +540,9 @@ struct XML_ParserStruct {
|
| NS_ATT *m_nsAtts;
|
| unsigned long m_nsAttsVersion;
|
| unsigned char m_nsAttsPower;
|
| +#ifdef XML_ATTR_INFO
|
| + XML_AttrInfo *m_attInfo;
|
| +#endif
|
| POSITION m_position;
|
| STRING_POOL m_tempPool;
|
| STRING_POOL m_temp2Pool;
|
| @@ -546,6 +556,7 @@ struct XML_ParserStruct {
|
| XML_Bool m_useForeignDTD;
|
| enum XML_ParamEntityParsing m_paramEntityParsing;
|
| #endif
|
| + unsigned long m_hash_secret_salt;
|
| };
|
|
|
| #define MALLOC(s) (parser->m_mem.malloc_fcn((s)))
|
| @@ -640,6 +651,7 @@ struct XML_ParserStruct {
|
| #define nsAtts (parser->m_nsAtts)
|
| #define nsAttsVersion (parser->m_nsAttsVersion)
|
| #define nsAttsPower (parser->m_nsAttsPower)
|
| +#define attInfo (parser->m_attInfo)
|
| #define tempPool (parser->m_tempPool)
|
| #define temp2Pool (parser->m_temp2Pool)
|
| #define groupConnector (parser->m_groupConnector)
|
| @@ -653,6 +665,7 @@ struct XML_ParserStruct {
|
| #define useForeignDTD (parser->m_useForeignDTD)
|
| #define paramEntityParsing (parser->m_paramEntityParsing)
|
| #endif /* XML_DTD */
|
| +#define hash_secret_salt (parser->m_hash_secret_salt)
|
|
|
| XML_Parser XMLCALL
|
| XML_ParserCreate(const XML_Char *encodingName)
|
| @@ -670,29 +683,42 @@ XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep)
|
|
|
| static const XML_Char implicitContext[] = {
|
| 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_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 unsigned long
|
| +generate_hash_secret_salt(void)
|
| +{
|
| + unsigned int seed = time(NULL) % UINT_MAX;
|
| + srand(seed);
|
| + return rand();
|
| +}
|
| +
|
| +static XML_Bool /* only valid for root parser */
|
| +startParsing(XML_Parser parser)
|
| +{
|
| + /* hash functions must be initialized before setContext() is called */
|
| + if (hash_secret_salt == 0)
|
| + hash_secret_salt = generate_hash_secret_salt();
|
| + if (ns) {
|
| + /* implicit context only set for root parser, since child
|
| + parsers (i.e. external entity parsers) will inherit it
|
| + */
|
| + return setContext(parser, implicitContext);
|
| + }
|
| + return XML_TRUE;
|
| +}
|
| +
|
| XML_Parser XMLCALL
|
| XML_ParserCreate_MM(const XML_Char *encodingName,
|
| const XML_Memory_Handling_Suite *memsuite,
|
| const XML_Char *nameSep)
|
| {
|
| - XML_Parser parser = parserCreate(encodingName, memsuite, nameSep, NULL);
|
| - if (parser != NULL && ns) {
|
| - /* implicit context only set for root parser, since child
|
| - parsers (i.e. external entity parsers) will inherit it
|
| - */
|
| - if (!setContext(parser, implicitContext)) {
|
| - XML_ParserFree(parser);
|
| - return NULL;
|
| - }
|
| - }
|
| - return parser;
|
| + return parserCreate(encodingName, memsuite, nameSep, NULL);
|
| }
|
|
|
| static XML_Parser
|
| @@ -737,9 +763,20 @@ parserCreate(const XML_Char *encodingName,
|
| FREE(parser);
|
| return NULL;
|
| }
|
| +#ifdef XML_ATTR_INFO
|
| + attInfo = (XML_AttrInfo*)MALLOC(attsSize * sizeof(XML_AttrInfo));
|
| + if (attInfo == NULL) {
|
| + FREE(atts);
|
| + FREE(parser);
|
| + return NULL;
|
| + }
|
| +#endif
|
| dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char));
|
| if (dataBuf == NULL) {
|
| FREE(atts);
|
| +#ifdef XML_ATTR_INFO
|
| + FREE(attInfo);
|
| +#endif
|
| FREE(parser);
|
| return NULL;
|
| }
|
| @@ -752,6 +789,9 @@ parserCreate(const XML_Char *encodingName,
|
| if (_dtd == NULL) {
|
| FREE(dataBuf);
|
| FREE(atts);
|
| +#ifdef XML_ATTR_INFO
|
| + FREE(attInfo);
|
| +#endif
|
| FREE(parser);
|
| return NULL;
|
| }
|
| @@ -866,6 +906,7 @@ parserInit(XML_Parser parser, const XML_Char *encodingName)
|
| useForeignDTD = XML_FALSE;
|
| paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
|
| #endif
|
| + hash_secret_salt = 0;
|
| }
|
|
|
| /* moves list of bindings to freeBindingList */
|
| @@ -913,7 +954,7 @@ XML_ParserReset(XML_Parser parser, const XML_Char *encodingName)
|
| poolClear(&temp2Pool);
|
| parserInit(parser, encodingName);
|
| dtdReset(_dtd, &parser->m_mem);
|
| - return setContext(parser, implicitContext);
|
| + return XML_TRUE;
|
| }
|
|
|
| enum XML_Status XMLCALL
|
| @@ -982,6 +1023,12 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser,
|
| int oldInEntityValue = prologState.inEntityValue;
|
| #endif
|
| XML_Bool oldns_triplets = ns_triplets;
|
| + /* Note that the new parser shares the same hash secret as the old
|
| + parser, so that dtdCopy and copyEntityTable can lookup values
|
| + from hash tables associated with either parser without us having
|
| + to worry which hash secrets each table has.
|
| + */
|
| + unsigned long oldhash_secret_salt = hash_secret_salt;
|
|
|
| #ifdef XML_DTD
|
| if (!context)
|
| @@ -1035,13 +1082,14 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser,
|
| externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg;
|
| defaultExpandInternalEntities = oldDefaultExpandInternalEntities;
|
| ns_triplets = oldns_triplets;
|
| + hash_secret_salt = oldhash_secret_salt;
|
| parentParser = oldParser;
|
| #ifdef XML_DTD
|
| paramEntityParsing = oldParamEntityParsing;
|
| prologState.inEntityValue = oldInEntityValue;
|
| if (context) {
|
| #endif /* XML_DTD */
|
| - if (!dtdCopy(_dtd, oldDtd, &parser->m_mem)
|
| + if (!dtdCopy(oldParser, _dtd, oldDtd, &parser->m_mem)
|
| || !setContext(parser, context)) {
|
| XML_ParserFree(parser);
|
| return NULL;
|
| @@ -1130,6 +1178,9 @@ XML_ParserFree(XML_Parser parser)
|
| #endif /* XML_DTD */
|
| dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem);
|
| FREE((void *)atts);
|
| +#ifdef XML_ATTR_INFO
|
| + FREE((void *)attInfo);
|
| +#endif
|
| FREE(groupConnector);
|
| FREE(buffer);
|
| FREE(dataBuf);
|
| @@ -1210,6 +1261,14 @@ XML_GetIdAttributeIndex(XML_Parser parser)
|
| return idAttIndex;
|
| }
|
|
|
| +#ifdef XML_ATTR_INFO
|
| +const XML_AttrInfo * XMLCALL
|
| +XML_GetAttributeInfo(XML_Parser parser)
|
| +{
|
| + return attInfo;
|
| +}
|
| +#endif
|
| +
|
| void XMLCALL
|
| XML_SetElementHandler(XML_Parser parser,
|
| XML_StartElementHandler start,
|
| @@ -1426,6 +1485,17 @@ XML_SetParamEntityParsing(XML_Parser parser,
|
| #endif
|
| }
|
|
|
| +int XMLCALL
|
| +XML_SetHashSalt(XML_Parser parser,
|
| + unsigned long hash_salt)
|
| +{
|
| + /* block after XML_Parse()/XML_ParseBuffer() has been called */
|
| + if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
|
| + return 0;
|
| + hash_secret_salt = hash_salt;
|
| + return 1;
|
| +}
|
| +
|
| enum XML_Status XMLCALL
|
| XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
|
| {
|
| @@ -1436,6 +1506,11 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
|
| case XML_FINISHED:
|
| errorCode = XML_ERROR_FINISHED;
|
| return XML_STATUS_ERROR;
|
| + case XML_INITIALIZED:
|
| + if (parentParser == NULL && !startParsing(parser)) {
|
| + errorCode = XML_ERROR_NO_MEMORY;
|
| + return XML_STATUS_ERROR;
|
| + }
|
| default:
|
| ps_parsing = XML_PARSING;
|
| }
|
| @@ -1459,7 +1534,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 */
|
| @@ -1494,11 +1569,13 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
|
| break;
|
| case XML_INITIALIZED:
|
| case XML_PARSING:
|
| - result = XML_STATUS_OK;
|
| if (isFinal) {
|
| ps_parsing = XML_FINISHED;
|
| - return result;
|
| + return XML_STATUS_OK;
|
| }
|
| + /* fall through */
|
| + default:
|
| + result = XML_STATUS_OK;
|
| }
|
| }
|
|
|
| @@ -1513,15 +1590,11 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
|
| : (char *)REALLOC(buffer, len * 2));
|
| if (temp == NULL) {
|
| errorCode = XML_ERROR_NO_MEMORY;
|
| - return XML_STATUS_ERROR;
|
| - }
|
| - buffer = temp;
|
| - if (!buffer) {
|
| - errorCode = XML_ERROR_NO_MEMORY;
|
| eventPtr = eventEndPtr = NULL;
|
| processor = errorProcessor;
|
| return XML_STATUS_ERROR;
|
| }
|
| + buffer = temp;
|
| bufferLim = buffer + len * 2;
|
| }
|
| memcpy(buffer, end, nLeftOver);
|
| @@ -1559,6 +1632,11 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal)
|
| case XML_FINISHED:
|
| errorCode = XML_ERROR_FINISHED;
|
| return XML_STATUS_ERROR;
|
| + case XML_INITIALIZED:
|
| + if (parentParser == NULL && !startParsing(parser)) {
|
| + errorCode = XML_ERROR_NO_MEMORY;
|
| + return XML_STATUS_ERROR;
|
| + }
|
| default:
|
| ps_parsing = XML_PARSING;
|
| }
|
| @@ -1582,7 +1660,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;
|
| @@ -1672,6 +1750,8 @@ XML_GetBuffer(XML_Parser parser, int len)
|
| bufferPtr = buffer = newBuf;
|
| #endif /* not defined XML_CONTEXT_BYTES */
|
| }
|
| + eventPtr = eventEndPtr = NULL;
|
| + positionPtr = NULL;
|
| }
|
| return bufferEnd;
|
| }
|
| @@ -1729,7 +1809,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;
|
| @@ -1956,7 +2036,10 @@ XML_GetFeatureList(void)
|
| #endif
|
| #ifdef XML_LARGE_SIZE
|
| {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0},
|
| -#endif
|
| +#endif
|
| +#ifdef XML_ATTR_INFO
|
| + {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0},
|
| +#endif
|
| {XML_FEATURE_END, NULL, 0}
|
| };
|
|
|
| @@ -2019,7 +2102,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))
|
| @@ -2101,7 +2184,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:
|
| @@ -2135,7 +2218,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))
|
| @@ -2154,7 +2237,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;
|
| @@ -2185,8 +2268,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;
|
| @@ -2240,7 +2323,7 @@ doContent(XML_Parser parser,
|
| next - enc->minBytesPerChar);
|
| if (!name)
|
| return XML_ERROR_NO_MEMORY;
|
| - entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0);
|
| + entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0);
|
| poolDiscard(&dtd->pool);
|
| /* First, determine if a check for an existing declaration is needed;
|
| if yes, check that the entity exists, and that it is internal,
|
| @@ -2537,8 +2620,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;
|
| @@ -2550,7 +2633,7 @@ doContent(XML_Parser parser,
|
| }
|
| *nextPtr = end;
|
| return XML_ERROR_NONE;
|
| - case XML_TOK_DATA_CHARS:
|
| + case XML_TOK_DATA_CHARS:
|
| {
|
| XML_CharacterDataHandler charDataHandler = characterDataHandler;
|
| if (charDataHandler) {
|
| @@ -2590,7 +2673,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:
|
| @@ -2630,12 +2713,12 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
|
| const XML_Char *localPart;
|
|
|
| /* lookup the element type name */
|
| - elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, tagNamePtr->str,0);
|
| + elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str,0);
|
| if (!elementType) {
|
| const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str);
|
| if (!name)
|
| return XML_ERROR_NO_MEMORY;
|
| - elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, name,
|
| + elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name,
|
| sizeof(ELEMENT_TYPE));
|
| if (!elementType)
|
| return XML_ERROR_NO_MEMORY;
|
| @@ -2649,23 +2732,44 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
|
| if (n + nDefaultAtts > attsSize) {
|
| int oldAttsSize = attsSize;
|
| ATTRIBUTE *temp;
|
| +#ifdef XML_ATTR_INFO
|
| + XML_AttrInfo *temp2;
|
| +#endif
|
| attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;
|
| temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE));
|
| if (temp == NULL)
|
| return XML_ERROR_NO_MEMORY;
|
| atts = temp;
|
| +#ifdef XML_ATTR_INFO
|
| + temp2 = (XML_AttrInfo *)REALLOC((void *)attInfo, attsSize * sizeof(XML_AttrInfo));
|
| + if (temp2 == NULL)
|
| + return XML_ERROR_NO_MEMORY;
|
| + attInfo = temp2;
|
| +#endif
|
| if (n > oldAttsSize)
|
| XmlGetAttributes(enc, attStr, n, atts);
|
| }
|
|
|
| appAtts = (const XML_Char **)atts;
|
| for (i = 0; i < n; i++) {
|
| + ATTRIBUTE *currAtt = &atts[i];
|
| +#ifdef XML_ATTR_INFO
|
| + XML_AttrInfo *currAttInfo = &attInfo[i];
|
| +#endif
|
| /* add the name and value to the attribute list */
|
| - ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name,
|
| - atts[i].name
|
| - + XmlNameLength(enc, atts[i].name));
|
| + ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name,
|
| + currAtt->name
|
| + + XmlNameLength(enc, currAtt->name));
|
| if (!attId)
|
| return XML_ERROR_NO_MEMORY;
|
| +#ifdef XML_ATTR_INFO
|
| + currAttInfo->nameStart = parseEndByteIndex - (parseEndPtr - currAtt->name);
|
| + currAttInfo->nameEnd = currAttInfo->nameStart +
|
| + XmlNameLength(enc, currAtt->name);
|
| + currAttInfo->valueStart = parseEndByteIndex -
|
| + (parseEndPtr - currAtt->valuePtr);
|
| + currAttInfo->valueEnd = parseEndByteIndex - (parseEndPtr - currAtt->valueEnd);
|
| +#endif
|
| /* Detect duplicate attributes by their QNames. This does not work when
|
| namespace processing is turned on and different prefixes for the same
|
| namespace are used. For this case we have a check further down.
|
| @@ -2804,9 +2908,9 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
|
| if (s[-1] == 2) { /* prefixed */
|
| ATTRIBUTE_ID *id;
|
| const BINDING *b;
|
| - unsigned long uriHash = 0;
|
| + unsigned long uriHash = hash_secret_salt;
|
| ((XML_Char *)s)[-1] = 0; /* clear flag */
|
| - id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, s, 0);
|
| + id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0);
|
| b = id->prefix->binding;
|
| if (!b)
|
| return XML_ERROR_UNBOUND_PREFIX;
|
| @@ -2828,7 +2932,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
|
| } while (*s++);
|
|
|
| { /* Check hash table for duplicate of expanded name (uriName).
|
| - Derived from code in lookup(HASH_TABLE *table, ...).
|
| + Derived from code in lookup(parser, HASH_TABLE *table, ...).
|
| */
|
| unsigned char step = 0;
|
| unsigned long mask = nsAttsSize - 1;
|
| @@ -2949,27 +3053,27 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
|
| static const XML_Char xmlNamespace[] = {
|
| 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_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[] = {
|
| 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_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;
|
|
|
| @@ -2996,7 +3100,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;
|
| }
|
| @@ -3207,7 +3311,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;
|
| @@ -3489,7 +3593,7 @@ entityValueInitProcessor(XML_Parser parser,
|
| const char *next = start;
|
| eventPtr = start;
|
|
|
| - for (;;) {
|
| + for (;;) {
|
| tok = XmlPrologTok(encoding, start, end, &next);
|
| eventEndPtr = next;
|
| if (tok <= 0) {
|
| @@ -3517,7 +3621,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:
|
| @@ -3582,7 +3686,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);
|
| }
|
|
|
| @@ -3632,7 +3736,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);
|
| }
|
|
|
| @@ -3649,7 +3753,7 @@ doProlog(XML_Parser parser,
|
| #ifdef XML_DTD
|
| static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' };
|
| #endif /* XML_DTD */
|
| - static const XML_Char atypeCDATA[] =
|
| + 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[] =
|
| @@ -3670,7 +3774,7 @@ doProlog(XML_Parser parser,
|
| 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;
|
| @@ -3703,6 +3807,9 @@ doProlog(XML_Parser parser,
|
| return XML_ERROR_UNCLOSED_TOKEN;
|
| case XML_TOK_PARTIAL_CHAR:
|
| return XML_ERROR_PARTIAL_CHAR;
|
| + case -XML_TOK_PROLOG_S:
|
| + tok = -tok;
|
| + break;
|
| case XML_TOK_NONE:
|
| #ifdef XML_DTD
|
| /* for internal PE NOT referenced between declarations */
|
| @@ -3774,7 +3881,8 @@ doProlog(XML_Parser parser,
|
| case XML_ROLE_DOCTYPE_PUBLIC_ID:
|
| #ifdef XML_DTD
|
| useForeignDTD = XML_FALSE;
|
| - declEntity = (ENTITY *)lookup(&dtd->paramEntities,
|
| + declEntity = (ENTITY *)lookup(parser,
|
| + &dtd->paramEntities,
|
| externalSubsetName,
|
| sizeof(ENTITY));
|
| if (!declEntity)
|
| @@ -3782,15 +3890,17 @@ doProlog(XML_Parser parser,
|
| #endif /* XML_DTD */
|
| dtd->hasParamEntityRefs = XML_TRUE;
|
| if (startDoctypeDeclHandler) {
|
| + XML_Char *pubId;
|
| if (!XmlIsPublicId(enc, s, next, eventPP))
|
| return XML_ERROR_PUBLICID;
|
| - doctypePubid = poolStoreString(&tempPool, enc,
|
| - s + enc->minBytesPerChar,
|
| - next - enc->minBytesPerChar);
|
| - if (!doctypePubid)
|
| + pubId = poolStoreString(&tempPool, enc,
|
| + s + enc->minBytesPerChar,
|
| + next - enc->minBytesPerChar);
|
| + if (!pubId)
|
| return XML_ERROR_NO_MEMORY;
|
| - normalizePublicId((XML_Char *)doctypePubid);
|
| + normalizePublicId(pubId);
|
| poolFinish(&tempPool);
|
| + doctypePubid = pubId;
|
| handleDefault = XML_FALSE;
|
| goto alreadyChecked;
|
| }
|
| @@ -3829,7 +3939,8 @@ doProlog(XML_Parser parser,
|
| XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs;
|
| dtd->hasParamEntityRefs = XML_TRUE;
|
| if (paramEntityParsing && externalEntityRefHandler) {
|
| - ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities,
|
| + ENTITY *entity = (ENTITY *)lookup(parser,
|
| + &dtd->paramEntities,
|
| externalSubsetName,
|
| sizeof(ENTITY));
|
| if (!entity)
|
| @@ -3844,8 +3955,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;
|
| }
|
| @@ -3873,7 +3984,7 @@ doProlog(XML_Parser parser,
|
| XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs;
|
| dtd->hasParamEntityRefs = XML_TRUE;
|
| if (paramEntityParsing && externalEntityRefHandler) {
|
| - ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities,
|
| + ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities,
|
| externalSubsetName,
|
| sizeof(ENTITY));
|
| if (!entity)
|
| @@ -4087,7 +4198,8 @@ doProlog(XML_Parser parser,
|
| break;
|
| #else /* XML_DTD */
|
| if (!declEntity) {
|
| - declEntity = (ENTITY *)lookup(&dtd->paramEntities,
|
| + declEntity = (ENTITY *)lookup(parser,
|
| + &dtd->paramEntities,
|
| externalSubsetName,
|
| sizeof(ENTITY));
|
| if (!declEntity)
|
| @@ -4162,7 +4274,7 @@ doProlog(XML_Parser parser,
|
| const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);
|
| if (!name)
|
| return XML_ERROR_NO_MEMORY;
|
| - declEntity = (ENTITY *)lookup(&dtd->generalEntities, name,
|
| + declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name,
|
| sizeof(ENTITY));
|
| if (!declEntity)
|
| return XML_ERROR_NO_MEMORY;
|
| @@ -4194,7 +4306,7 @@ doProlog(XML_Parser parser,
|
| const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);
|
| if (!name)
|
| return XML_ERROR_NO_MEMORY;
|
| - declEntity = (ENTITY *)lookup(&dtd->paramEntities,
|
| + declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities,
|
| name, sizeof(ENTITY));
|
| if (!declEntity)
|
| return XML_ERROR_NO_MEMORY;
|
| @@ -4283,7 +4395,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;
|
| @@ -4376,7 +4488,7 @@ doProlog(XML_Parser parser,
|
| next - enc->minBytesPerChar);
|
| if (!name)
|
| return XML_ERROR_NO_MEMORY;
|
| - entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0);
|
| + entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0);
|
| poolDiscard(&dtd->pool);
|
| /* first, determine if a check for an existing declaration is needed;
|
| if yes, check that the entity exists, and that it is internal,
|
| @@ -4404,7 +4516,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)
|
| @@ -4599,7 +4711,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:
|
| @@ -4669,7 +4781,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:
|
| @@ -4712,12 +4824,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) {
|
| @@ -4757,13 +4869,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;
|
| @@ -4784,7 +4896,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
|
| @@ -4793,8 +4905,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
|
| @@ -4900,7 +5012,7 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
|
| next - enc->minBytesPerChar);
|
| if (!name)
|
| return XML_ERROR_NO_MEMORY;
|
| - entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0);
|
| + entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0);
|
| poolDiscard(&temp2Pool);
|
| /* First, determine if a check for an existing declaration is needed;
|
| if yes, check that the entity exists, and that it is internal.
|
| @@ -4947,7 +5059,7 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
|
| if (!entity->textPtr) {
|
| if (enc == encoding)
|
| eventPtr = ptr;
|
| - return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF;
|
| + return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF;
|
| }
|
| else {
|
| enum XML_Error result;
|
| @@ -5009,7 +5121,7 @@ storeEntityValue(XML_Parser parser,
|
| result = XML_ERROR_NO_MEMORY;
|
| goto endEntityValue;
|
| }
|
| - entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0);
|
| + entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0);
|
| poolDiscard(&tempPool);
|
| if (!entity) {
|
| /* not a well-formedness error - see XML 1.0: WFC Entity Declared */
|
| @@ -5299,7 +5411,7 @@ setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType)
|
| }
|
| if (!poolAppendChar(&dtd->pool, XML_T('\0')))
|
| return 0;
|
| - prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool),
|
| + prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool),
|
| sizeof(PREFIX));
|
| if (!prefix)
|
| return 0;
|
| @@ -5328,7 +5440,7 @@ getAttributeId(XML_Parser parser, const ENCODING *enc,
|
| return NULL;
|
| /* skip quotation mark - its storage will be re-used (like in name[-1]) */
|
| ++name;
|
| - id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, name, sizeof(ATTRIBUTE_ID));
|
| + id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, sizeof(ATTRIBUTE_ID));
|
| if (!id)
|
| return NULL;
|
| if (id->name != name)
|
| @@ -5346,7 +5458,7 @@ getAttributeId(XML_Parser parser, const ENCODING *enc,
|
| if (name[5] == XML_T('\0'))
|
| id->prefix = &dtd->defaultPrefix;
|
| else
|
| - id->prefix = (PREFIX *)lookup(&dtd->prefixes, name + 6, sizeof(PREFIX));
|
| + id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, sizeof(PREFIX));
|
| id->xmlns = XML_TRUE;
|
| }
|
| else {
|
| @@ -5361,7 +5473,7 @@ getAttributeId(XML_Parser parser, const ENCODING *enc,
|
| }
|
| if (!poolAppendChar(&dtd->pool, XML_T('\0')))
|
| return NULL;
|
| - id->prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool),
|
| + id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool),
|
| sizeof(PREFIX));
|
| if (id->prefix->name == poolStart(&dtd->pool))
|
| poolFinish(&dtd->pool);
|
| @@ -5457,7 +5569,7 @@ setContext(XML_Parser parser, const XML_Char *context)
|
| ENTITY *e;
|
| if (!poolAppendChar(&tempPool, XML_T('\0')))
|
| return XML_FALSE;
|
| - e = (ENTITY *)lookup(&dtd->generalEntities, poolStart(&tempPool), 0);
|
| + e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&tempPool), 0);
|
| if (e)
|
| e->open = XML_TRUE;
|
| if (*s != XML_T('\0'))
|
| @@ -5472,7 +5584,7 @@ setContext(XML_Parser parser, const XML_Char *context)
|
| else {
|
| if (!poolAppendChar(&tempPool, XML_T('\0')))
|
| return XML_FALSE;
|
| - prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&tempPool),
|
| + prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&tempPool),
|
| sizeof(PREFIX));
|
| if (!prefix)
|
| return XML_FALSE;
|
| @@ -5636,7 +5748,7 @@ dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms)
|
| The new DTD has already been initialized.
|
| */
|
| static int
|
| -dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
|
| +dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
|
| {
|
| HASH_TABLE_ITER iter;
|
|
|
| @@ -5651,7 +5763,7 @@ dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
|
| name = poolCopyString(&(newDtd->pool), oldP->name);
|
| if (!name)
|
| return 0;
|
| - if (!lookup(&(newDtd->prefixes), name, sizeof(PREFIX)))
|
| + if (!lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX)))
|
| return 0;
|
| }
|
|
|
| @@ -5673,7 +5785,7 @@ dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
|
| if (!name)
|
| return 0;
|
| ++name;
|
| - newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name,
|
| + newA = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), name,
|
| sizeof(ATTRIBUTE_ID));
|
| if (!newA)
|
| return 0;
|
| @@ -5683,7 +5795,7 @@ dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
|
| if (oldA->prefix == &oldDtd->defaultPrefix)
|
| newA->prefix = &newDtd->defaultPrefix;
|
| else
|
| - newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes),
|
| + newA->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes),
|
| oldA->prefix->name, 0);
|
| }
|
| }
|
| @@ -5702,7 +5814,7 @@ dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
|
| name = poolCopyString(&(newDtd->pool), oldE->name);
|
| if (!name)
|
| return 0;
|
| - newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name,
|
| + newE = (ELEMENT_TYPE *)lookup(oldParser, &(newDtd->elementTypes), name,
|
| sizeof(ELEMENT_TYPE));
|
| if (!newE)
|
| return 0;
|
| @@ -5716,14 +5828,14 @@ dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
|
| }
|
| if (oldE->idAtt)
|
| newE->idAtt = (ATTRIBUTE_ID *)
|
| - lookup(&(newDtd->attributeIds), oldE->idAtt->name, 0);
|
| + lookup(oldParser, &(newDtd->attributeIds), oldE->idAtt->name, 0);
|
| newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts;
|
| if (oldE->prefix)
|
| - newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes),
|
| + newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes),
|
| oldE->prefix->name, 0);
|
| for (i = 0; i < newE->nDefaultAtts; i++) {
|
| newE->defaultAtts[i].id = (ATTRIBUTE_ID *)
|
| - lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0);
|
| + lookup(oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0);
|
| newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata;
|
| if (oldE->defaultAtts[i].value) {
|
| newE->defaultAtts[i].value
|
| @@ -5737,13 +5849,15 @@ dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
|
| }
|
|
|
| /* Copy the entity tables. */
|
| - if (!copyEntityTable(&(newDtd->generalEntities),
|
| + if (!copyEntityTable(oldParser,
|
| + &(newDtd->generalEntities),
|
| &(newDtd->pool),
|
| &(oldDtd->generalEntities)))
|
| return 0;
|
|
|
| #ifdef XML_DTD
|
| - if (!copyEntityTable(&(newDtd->paramEntities),
|
| + if (!copyEntityTable(oldParser,
|
| + &(newDtd->paramEntities),
|
| &(newDtd->pool),
|
| &(oldDtd->paramEntities)))
|
| return 0;
|
| @@ -5766,7 +5880,8 @@ dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
|
| } /* End dtdCopy */
|
|
|
| static int
|
| -copyEntityTable(HASH_TABLE *newTable,
|
| +copyEntityTable(XML_Parser oldParser,
|
| + HASH_TABLE *newTable,
|
| STRING_POOL *newPool,
|
| const HASH_TABLE *oldTable)
|
| {
|
| @@ -5785,7 +5900,7 @@ copyEntityTable(HASH_TABLE *newTable,
|
| name = poolCopyString(newPool, oldE->name);
|
| if (!name)
|
| return 0;
|
| - newE = (ENTITY *)lookup(newTable, name, sizeof(ENTITY));
|
| + newE = (ENTITY *)lookup(oldParser, newTable, name, sizeof(ENTITY));
|
| if (!newE)
|
| return 0;
|
| if (oldE->systemId) {
|
| @@ -5843,16 +5958,16 @@ keyeq(KEY s1, KEY s2)
|
| }
|
|
|
| static unsigned long FASTCALL
|
| -hash(KEY s)
|
| +hash(XML_Parser parser, KEY s)
|
| {
|
| - unsigned long h = 0;
|
| + unsigned long h = hash_secret_salt;
|
| while (*s)
|
| h = CHAR_HASH(h, *s++);
|
| return h;
|
| }
|
|
|
| static NAMED *
|
| -lookup(HASH_TABLE *table, KEY name, size_t createSize)
|
| +lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize)
|
| {
|
| size_t i;
|
| if (table->size == 0) {
|
| @@ -5869,10 +5984,10 @@ lookup(HASH_TABLE *table, KEY name, size_t createSize)
|
| return NULL;
|
| }
|
| memset(table->v, 0, tsize);
|
| - i = hash(name) & ((unsigned long)table->size - 1);
|
| + i = hash(parser, name) & ((unsigned long)table->size - 1);
|
| }
|
| else {
|
| - unsigned long h = hash(name);
|
| + unsigned long h = hash(parser, name);
|
| unsigned long mask = (unsigned long)table->size - 1;
|
| unsigned char step = 0;
|
| i = h & mask;
|
| @@ -5898,7 +6013,7 @@ lookup(HASH_TABLE *table, KEY name, size_t createSize)
|
| memset(newV, 0, tsize);
|
| for (i = 0; i < table->size; i++)
|
| if (table->v[i]) {
|
| - unsigned long newHash = hash(table->v[i]->name);
|
| + unsigned long newHash = hash(parser, table->v[i]->name);
|
| size_t j = newHash & newMask;
|
| step = 0;
|
| while (newV[j]) {
|
| @@ -6119,12 +6234,13 @@ poolGrow(STRING_POOL *pool)
|
| }
|
| if (pool->blocks && pool->start == pool->blocks->s) {
|
| int blockSize = (int)(pool->end - pool->start)*2;
|
| - pool->blocks = (BLOCK *)
|
| + BLOCK *temp = (BLOCK *)
|
| pool->mem->realloc_fcn(pool->blocks,
|
| (offsetof(BLOCK, s)
|
| + blockSize * sizeof(XML_Char)));
|
| - if (pool->blocks == NULL)
|
| + if (temp == NULL)
|
| return XML_FALSE;
|
| + pool->blocks = temp;
|
| pool->blocks->size = blockSize;
|
| pool->ptr = pool->blocks->s + (pool->ptr - pool->start);
|
| pool->start = pool->blocks->s;
|
| @@ -6273,7 +6389,7 @@ getElementType(XML_Parser parser,
|
|
|
| if (!name)
|
| return NULL;
|
| - ret = (ELEMENT_TYPE *) lookup(&dtd->elementTypes, name, sizeof(ELEMENT_TYPE));
|
| + ret = (ELEMENT_TYPE *) lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE));
|
| if (!ret)
|
| return NULL;
|
| if (ret->name != name)
|
|
|