Previous 15994 Revisions Next

r15670 Wednesday 25th July, 2012 at 19:12:26 UTC by Firewave
updated expat to 2.1.0
[src/lib/expat]expat.h internal.h xmlparse.c xmltok_impl.c

src/lib/expat/xmltok_impl.c
r15669r15670
885885                    const char **nextTokPtr)
886886{
887887  if (ptr == end)
888    return -XML_TOK_PERCENT;
888    return XML_TOK_PARTIAL;
889889  switch (BYTE_TYPE(enc, ptr)) {
890890  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
891891  case BT_S: case BT_LF: case BT_CR: case BT_PERCNT:
r15669r15670
17441744                       const char *end,
17451745                       POSITION *pos)
17461746{
1747  while (ptr != end) {
1747  while (ptr < end) {
17481748    switch (BYTE_TYPE(enc, ptr)) {
17491749#define LEAD_CASE(n) \
17501750    case BT_LEAD ## n: \
src/lib/expat/internal.h
r15669r15670
1616   inline      - Used for selected internal functions for which inlining
1717                 may improve performance on some platforms.
1818
19   Note: Use of these macros is based on judgment, not hard rules,
19   Note: Use of these macros is based on judgement, not hard rules,
2020         and therefore subject to change.
2121*/
2222
src/lib/expat/expat.h
r15669r15670
342342                         XML_EntityDeclHandler handler);
343343
344344/* OBSOLETE -- OBSOLETE -- OBSOLETE
345   This handler has been superseded by the EntityDeclHandler above.
345   This handler has been superceded by the EntityDeclHandler above.
346346   It is provided here for backward compatibility.
347347
348348   This is called for a declaration of an unparsed (NDATA) entity.
r15669r15670
742742XMLPARSEAPI(int)
743743XML_GetIdAttributeIndex(XML_Parser parser);
744744
745#ifdef XML_ATTR_INFO
746/* Source file byte offsets for the start and end of attribute names and values.
747   The value indices are exclusive of surrounding quotes; thus in a UTF-8 source
748   file an attribute value of "blah" will yield:
749   info->valueEnd - info->valueStart = 4 bytes.
750*/
751typedef struct {
752  XML_Index  nameStart;  /* Offset to beginning of the attribute name. */
753  XML_Index  nameEnd;    /* Offset after the attribute name's last byte. */
754  XML_Index  valueStart; /* Offset to beginning of the attribute value. */
755  XML_Index  valueEnd;   /* Offset after the attribute value's last byte. */
756} XML_AttrInfo;
757
758/* Returns an array of XML_AttrInfo structures for the attribute/value pairs
759   passed in last call to the XML_StartElementHandler that were specified
760   in the start-tag rather than defaulted. Each attribute/value pair counts
761   as 1; thus the number of entries in the array is
762   XML_GetSpecifiedAttributeCount(parser) / 2.
763*/
764XMLPARSEAPI(const XML_AttrInfo *)
765XML_GetAttributeInfo(XML_Parser parser);
766#endif
767
745768/* Parses some input. Returns XML_STATUS_ERROR if a fatal error is
746769   detected.  The last call to XML_Parse must have isFinal true; len
747770   may be zero for this call (or any other).
r15669r15670
883906XML_SetParamEntityParsing(XML_Parser parser,
884907                          enum XML_ParamEntityParsing parsing);
885908
909/* Sets the hash salt to use for internal hash calculations.
910   Helps in preventing DoS attacks based on predicting hash
911   function behavior. This must be called before parsing is started.
912   Returns 1 if successful, 0 when called after parsing has started.
913*/
914XMLPARSEAPI(int)
915XML_SetHashSalt(XML_Parser parser,
916                unsigned long hash_salt);
917
886918/* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then
887919   XML_GetErrorCode returns information about the error.
888920*/
r15669r15670
9841016  XML_FEATURE_SIZEOF_XML_CHAR,
9851017  XML_FEATURE_SIZEOF_XML_LCHAR,
9861018  XML_FEATURE_NS,
987  XML_FEATURE_LARGE_SIZE
1019  XML_FEATURE_LARGE_SIZE,
1020  XML_FEATURE_ATTR_INFO
9881021  /* Additional features must be added to the end of this enum. */
9891022};
9901023
r15669r15670
10041037   change to major or minor version.
10051038*/
10061039#define XML_MAJOR_VERSION 2
1007#define XML_MINOR_VERSION 0
1008#define XML_MICRO_VERSION 1
1040#define XML_MINOR_VERSION 1
1041#define XML_MICRO_VERSION 0
10091042
10101043#ifdef __cplusplus
10111044}
src/lib/expat/xmlparse.c
r15669r15670
55#include <stddef.h>
66#include <string.h>                     /* memset(), memcpy() */
77#include <assert.h>
8#include <limits.h>                     /* UINT_MAX */
9#include <time.h>                       /* time() */
810
911#define XML_BUILDING_EXPAT 1
1012
r15669r15670
381383static void
382384dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms);
383385static int
384dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms);
386dtdCopy(XML_Parser oldParser,
387        DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms);
385388static int
386copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *);
387
389copyEntityTable(XML_Parser oldParser,
390                HASH_TABLE *, STRING_POOL *, const HASH_TABLE *);
388391static NAMED *
389lookup(HASH_TABLE *table, KEY name, size_t createSize);
392lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize);
390393static void FASTCALL
391394hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms);
392395static void FASTCALL hashTableClear(HASH_TABLE *);
r15669r15670
419422getElementType(XML_Parser parser, const ENCODING *enc,
420423               const char *ptr, const char *end);
421424
425static unsigned long generate_hash_secret_salt(void);
426static XML_Bool startParsing(XML_Parser parser);
427
422428static XML_Parser
423429parserCreate(const XML_Char *encodingName,
424430             const XML_Memory_Handling_Suite *memsuite,
425431             const XML_Char *nameSep,
426432             DTD *dtd);
433
427434static void
428435parserInit(XML_Parser parser, const XML_Char *encodingName);
429436
r15669r15670
523530  NS_ATT *m_nsAtts;
524531  unsigned long m_nsAttsVersion;
525532  unsigned char m_nsAttsPower;
533#ifdef XML_ATTR_INFO
534  XML_AttrInfo *m_attInfo;
535#endif
526536  POSITION m_position;
527537  STRING_POOL m_tempPool;
528538  STRING_POOL m_temp2Pool;
r15669r15670
536546  XML_Bool m_useForeignDTD;
537547  enum XML_ParamEntityParsing m_paramEntityParsing;
538548#endif
549  unsigned long m_hash_secret_salt;
539550};
540551
541552#define MALLOC(s) (parser->m_mem.malloc_fcn((s)))
r15669r15670
630641#define nsAtts (parser->m_nsAtts)
631642#define nsAttsVersion (parser->m_nsAttsVersion)
632643#define nsAttsPower (parser->m_nsAttsPower)
644#define attInfo (parser->m_attInfo)
633645#define tempPool (parser->m_tempPool)
634646#define temp2Pool (parser->m_temp2Pool)
635647#define groupConnector (parser->m_groupConnector)
r15669r15670
643655#define useForeignDTD (parser->m_useForeignDTD)
644656#define paramEntityParsing (parser->m_paramEntityParsing)
645657#endif /* XML_DTD */
658#define hash_secret_salt (parser->m_hash_secret_salt)
646659
647660XML_Parser XMLCALL
648661XML_ParserCreate(const XML_Char *encodingName)
r15669r15670
667680  ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0'
668681};
669682
670XML_Parser XMLCALL
671XML_ParserCreate_MM(const XML_Char *encodingName,
672                    const XML_Memory_Handling_Suite *memsuite,
673                    const XML_Char *nameSep)
683static unsigned long
684generate_hash_secret_salt(void)
674685{
675  XML_Parser parser = parserCreate(encodingName, memsuite, nameSep, NULL);
676  if (parser != NULL && ns) {
686  unsigned int seed = time(NULL) % UINT_MAX;
687  srand(seed);
688  return rand();
689}
690
691static XML_Bool  /* only valid for root parser */
692startParsing(XML_Parser parser)
693{
694    /* hash functions must be initialized before setContext() is called */
695    if (hash_secret_salt == 0)
696      hash_secret_salt = generate_hash_secret_salt();
697    if (ns) {
677698    /* implicit context only set for root parser, since child
678699       parsers (i.e. external entity parsers) will inherit it
679700    */
680    if (!setContext(parser, implicitContext)) {
681      XML_ParserFree(parser);
682      return NULL;
701      return setContext(parser, implicitContext);
683702    }
703    return XML_TRUE;
684704  }
685  return parser;
705
706XML_Parser XMLCALL
707XML_ParserCreate_MM(const XML_Char *encodingName,
708                    const XML_Memory_Handling_Suite *memsuite,
709                    const XML_Char *nameSep)
710{
711  return parserCreate(encodingName, memsuite, nameSep, NULL);
686712}
687713
688714static XML_Parser
r15669r15670
727753    FREE(parser);
728754    return NULL;
729755  }
756#ifdef XML_ATTR_INFO
757  attInfo = (XML_AttrInfo*)MALLOC(attsSize * sizeof(XML_AttrInfo));
758  if (attInfo == NULL) {
759    FREE(atts);
760    FREE(parser);
761    return NULL;
762  }
763#endif
730764  dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char));
731765  if (dataBuf == NULL) {
732766    FREE(atts);
767#ifdef XML_ATTR_INFO
768    FREE(attInfo);
769#endif
733770    FREE(parser);
734771    return NULL;
735772  }
r15669r15670
742779    if (_dtd == NULL) {
743780      FREE(dataBuf);
744781      FREE(atts);
782#ifdef XML_ATTR_INFO
783      FREE(attInfo);
784#endif
745785      FREE(parser);
746786      return NULL;
747787    }
r15669r15670
856896  useForeignDTD = XML_FALSE;
857897  paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
858898#endif
899  hash_secret_salt = 0;
859900}
860901
861902/* moves list of bindings to freeBindingList */
r15669r15670
903944  poolClear(&temp2Pool);
904945  parserInit(parser, encodingName);
905946  dtdReset(_dtd, &parser->m_mem);
906  return setContext(parser, implicitContext);
947  return XML_TRUE;
907948}
908949
909950enum XML_Status XMLCALL
r15669r15670
9721013  int oldInEntityValue = prologState.inEntityValue;
9731014#endif
9741015  XML_Bool oldns_triplets = ns_triplets;
1016  /* Note that the new parser shares the same hash secret as the old
1017     parser, so that dtdCopy and copyEntityTable can lookup values
1018     from hash tables associated with either parser without us having
1019     to worry which hash secrets each table has.
1020  */
1021  unsigned long oldhash_secret_salt = hash_secret_salt;
9751022
9761023#ifdef XML_DTD
9771024  if (!context)
r15669r15670
10251072    externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg;
10261073  defaultExpandInternalEntities = oldDefaultExpandInternalEntities;
10271074  ns_triplets = oldns_triplets;
1075  hash_secret_salt = oldhash_secret_salt;
10281076  parentParser = oldParser;
10291077#ifdef XML_DTD
10301078  paramEntityParsing = oldParamEntityParsing;
10311079  prologState.inEntityValue = oldInEntityValue;
10321080  if (context) {
10331081#endif /* XML_DTD */
1034    if (!dtdCopy(_dtd, oldDtd, &parser->m_mem)
1082    if (!dtdCopy(oldParser, _dtd, oldDtd, &parser->m_mem)
10351083      || !setContext(parser, context)) {
10361084      XML_ParserFree(parser);
10371085      return NULL;
r15669r15670
11201168#endif /* XML_DTD */
11211169    dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem);
11221170  FREE((void *)atts);
1171#ifdef XML_ATTR_INFO
1172  FREE((void *)attInfo);
1173#endif
11231174  FREE(groupConnector);
11241175  FREE(buffer);
11251176  FREE(dataBuf);
r15669r15670
12001251  return idAttIndex;
12011252}
12021253
1254#ifdef XML_ATTR_INFO
1255const XML_AttrInfo * XMLCALL
1256XML_GetAttributeInfo(XML_Parser parser)
1257{
1258  return attInfo;
1259}
1260#endif
1261
12031262void XMLCALL
12041263XML_SetElementHandler(XML_Parser parser,
12051264                      XML_StartElementHandler start,
r15669r15670
14161475#endif
14171476}
14181477
1478int XMLCALL
1479XML_SetHashSalt(XML_Parser parser,
1480                unsigned long hash_salt)
1481{
1482  /* block after XML_Parse()/XML_ParseBuffer() has been called */
1483  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
1484    return 0;
1485  hash_secret_salt = hash_salt;
1486  return 1;
1487}
1488
14191489enum XML_Status XMLCALL
14201490XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
14211491{
r15669r15670
14261496  case XML_FINISHED:
14271497    errorCode = XML_ERROR_FINISHED;
14281498    return XML_STATUS_ERROR;
1499  case XML_INITIALIZED:
1500    if (parentParser == NULL && !startParsing(parser)) {
1501      errorCode = XML_ERROR_NO_MEMORY;
1502      return XML_STATUS_ERROR;
1503    }
14291504  default:
14301505    ps_parsing = XML_PARSING;
14311506  }
r15669r15670
14841559        break;
14851560      case XML_INITIALIZED:
14861561      case XML_PARSING:
1487        result = XML_STATUS_OK;
14881562        if (isFinal) {
14891563          ps_parsing = XML_FINISHED;
1490          return result;
1564          return XML_STATUS_OK;
14911565        }
1566      /* fall through */
1567      default:
1568        result = XML_STATUS_OK;
14921569      }
14931570    }
14941571
r15669r15670
15031580                : (char *)REALLOC(buffer, len * 2));
15041581        if (temp == NULL) {
15051582          errorCode = XML_ERROR_NO_MEMORY;
1506          return XML_STATUS_ERROR;
1507        }
1508        buffer = temp;
1509        if (!buffer) {
1510          errorCode = XML_ERROR_NO_MEMORY;
15111583          eventPtr = eventEndPtr = NULL;
15121584          processor = errorProcessor;
15131585          return XML_STATUS_ERROR;
15141586        }
1587        buffer = temp;
15151588        bufferLim = buffer + len * 2;
15161589      }
15171590      memcpy(buffer, end, nLeftOver);
r15669r15670
15491622  case XML_FINISHED:
15501623    errorCode = XML_ERROR_FINISHED;
15511624    return XML_STATUS_ERROR;
1625  case XML_INITIALIZED:
1626    if (parentParser == NULL && !startParsing(parser)) {
1627      errorCode = XML_ERROR_NO_MEMORY;
1628      return XML_STATUS_ERROR;
1629    }
15521630  default:
15531631    ps_parsing = XML_PARSING;
15541632  }
r15669r15670
16621740      bufferPtr = buffer = newBuf;
16631741#endif  /* not defined XML_CONTEXT_BYTES */
16641742    }
1743    eventPtr = eventEndPtr = NULL;
1744    positionPtr = NULL;
16651745  }
16661746  return bufferEnd;
16671747}
r15669r15670
19472027#ifdef XML_LARGE_SIZE
19482028    {XML_FEATURE_LARGE_SIZE,       XML_L("XML_LARGE_SIZE"), 0},
19492029#endif
2030#ifdef XML_ATTR_INFO
2031    {XML_FEATURE_ATTR_INFO,        XML_L("XML_ATTR_INFO"), 0},
2032#endif
19502033    {XML_FEATURE_END,              NULL, 0}
19512034  };
19522035
r15669r15670
22302313                                next - enc->minBytesPerChar);
22312314        if (!name)
22322315          return XML_ERROR_NO_MEMORY;
2233        entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0);
2316        entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0);
22342317        poolDiscard(&dtd->pool);
22352318        /* First, determine if a check for an existing declaration is needed;
22362319           if yes, check that the entity exists, and that it is internal,
r15669r15670
26202703  const XML_Char *localPart;
26212704
26222705  /* lookup the element type name */
2623  elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, tagNamePtr->str,0);
2706  elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str,0);
26242707  if (!elementType) {
26252708    const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str);
26262709    if (!name)
26272710      return XML_ERROR_NO_MEMORY;
2628    elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, name,
2711    elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name,
26292712                                         sizeof(ELEMENT_TYPE));
26302713    if (!elementType)
26312714      return XML_ERROR_NO_MEMORY;
r15669r15670
26392722  if (n + nDefaultAtts > attsSize) {
26402723    int oldAttsSize = attsSize;
26412724    ATTRIBUTE *temp;
2725#ifdef XML_ATTR_INFO
2726    XML_AttrInfo *temp2;
2727#endif
26422728    attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;
26432729    temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE));
26442730    if (temp == NULL)
26452731      return XML_ERROR_NO_MEMORY;
26462732    atts = temp;
2733#ifdef XML_ATTR_INFO
2734    temp2 = (XML_AttrInfo *)REALLOC((void *)attInfo, attsSize * sizeof(XML_AttrInfo));
2735    if (temp2 == NULL)
2736      return XML_ERROR_NO_MEMORY;
2737    attInfo = temp2;
2738#endif
26472739    if (n > oldAttsSize)
26482740      XmlGetAttributes(enc, attStr, n, atts);
26492741  }
26502742
26512743  appAtts = (const XML_Char **)atts;
26522744  for (i = 0; i < n; i++) {
2745    ATTRIBUTE *currAtt = &atts[i];
2746#ifdef XML_ATTR_INFO
2747    XML_AttrInfo *currAttInfo = &attInfo[i];
2748#endif
26532749    /* add the name and value to the attribute list */
2654    ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name,
2655                                         atts[i].name
2656                                         + XmlNameLength(enc, atts[i].name));
2750    ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name,
2751                                         currAtt->name
2752                                         + XmlNameLength(enc, currAtt->name));
26572753    if (!attId)
26582754      return XML_ERROR_NO_MEMORY;
2755#ifdef XML_ATTR_INFO
2756    currAttInfo->nameStart = parseEndByteIndex - (parseEndPtr - currAtt->name);
2757    currAttInfo->nameEnd = currAttInfo->nameStart +
2758                           XmlNameLength(enc, currAtt->name);
2759    currAttInfo->valueStart = parseEndByteIndex -
2760                            (parseEndPtr - currAtt->valuePtr);
2761    currAttInfo->valueEnd = parseEndByteIndex - (parseEndPtr - currAtt->valueEnd);
2762#endif
26592763    /* Detect duplicate attributes by their QNames. This does not work when
26602764       namespace processing is turned on and different prefixes for the same
26612765       namespace are used. For this case we have a check further down.
r15669r15670
27942898      if (s[-1] == 2) {  /* prefixed */
27952899        ATTRIBUTE_ID *id;
27962900        const BINDING *b;
2797        unsigned long uriHash = 0;
2901        unsigned long uriHash = hash_secret_salt;
27982902        ((XML_Char *)s)[-1] = 0;  /* clear flag */
2799        id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, s, 0);
2903        id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0);
28002904        b = id->prefix->binding;
28012905        if (!b)
28022906          return XML_ERROR_UNBOUND_PREFIX;
r15669r15670
28182922        } while (*s++);
28192923
28202924        { /* Check hash table for duplicate of expanded name (uriName).
2821             Derived from code in lookup(HASH_TABLE *table, ...).
2925             Derived from code in lookup(parser, HASH_TABLE *table, ...).
28222926          */
28232927          unsigned char step = 0;
28242928          unsigned long mask = nsAttsSize - 1;
r15669r15670
36933797        return XML_ERROR_UNCLOSED_TOKEN;
36943798      case XML_TOK_PARTIAL_CHAR:
36953799        return XML_ERROR_PARTIAL_CHAR;
3800      case -XML_TOK_PROLOG_S:
3801        tok = -tok;
3802        break;
36963803      case XML_TOK_NONE:
36973804#ifdef XML_DTD
36983805        /* for internal PE NOT referenced between declarations */
r15669r15670
37643871    case XML_ROLE_DOCTYPE_PUBLIC_ID:
37653872#ifdef XML_DTD
37663873      useForeignDTD = XML_FALSE;
3767      declEntity = (ENTITY *)lookup(&dtd->paramEntities,
3874      declEntity = (ENTITY *)lookup(parser,
3875                                    &dtd->paramEntities,
37683876                                    externalSubsetName,
37693877                                    sizeof(ENTITY));
37703878      if (!declEntity)
r15669r15670
37723880#endif /* XML_DTD */
37733881      dtd->hasParamEntityRefs = XML_TRUE;
37743882      if (startDoctypeDeclHandler) {
3883        XML_Char *pubId;
37753884        if (!XmlIsPublicId(enc, s, next, eventPP))
37763885          return XML_ERROR_PUBLICID;
3777        doctypePubid = poolStoreString(&tempPool, enc,
3886        pubId = poolStoreString(&tempPool, enc,
37783887                                       s + enc->minBytesPerChar,
37793888                                       next - enc->minBytesPerChar);
3780        if (!doctypePubid)
3889        if (!pubId)
37813890          return XML_ERROR_NO_MEMORY;
3782        normalizePublicId((XML_Char *)doctypePubid);
3891        normalizePublicId(pubId);
37833892        poolFinish(&tempPool);
3893        doctypePubid = pubId;
37843894        handleDefault = XML_FALSE;
37853895        goto alreadyChecked;
37863896      }
r15669r15670
38193929        XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs;
38203930        dtd->hasParamEntityRefs = XML_TRUE;
38213931        if (paramEntityParsing && externalEntityRefHandler) {
3822          ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities,
3932          ENTITY *entity = (ENTITY *)lookup(parser,
3933                                            &dtd->paramEntities,
38233934                                            externalSubsetName,
38243935                                            sizeof(ENTITY));
38253936          if (!entity)
r15669r15670
38633974        XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs;
38643975        dtd->hasParamEntityRefs = XML_TRUE;
38653976        if (paramEntityParsing && externalEntityRefHandler) {
3866          ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities,
3977          ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities,
38673978                                            externalSubsetName,
38683979                                            sizeof(ENTITY));
38693980          if (!entity)
r15669r15670
40774188      break;
40784189#else /* XML_DTD */
40794190      if (!declEntity) {
4080        declEntity = (ENTITY *)lookup(&dtd->paramEntities,
4191        declEntity = (ENTITY *)lookup(parser,
4192                                      &dtd->paramEntities,
40814193                                      externalSubsetName,
40824194                                      sizeof(ENTITY));
40834195        if (!declEntity)
r15669r15670
41524264          const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);
41534265          if (!name)
41544266            return XML_ERROR_NO_MEMORY;
4155          declEntity = (ENTITY *)lookup(&dtd->generalEntities, name,
4267          declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name,
41564268                                        sizeof(ENTITY));
41574269          if (!declEntity)
41584270            return XML_ERROR_NO_MEMORY;
r15669r15670
41844296        const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);
41854297        if (!name)
41864298          return XML_ERROR_NO_MEMORY;
4187        declEntity = (ENTITY *)lookup(&dtd->paramEntities,
4299        declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities,
41884300                                           name, sizeof(ENTITY));
41894301        if (!declEntity)
41904302          return XML_ERROR_NO_MEMORY;
r15669r15670
43664478                                next - enc->minBytesPerChar);
43674479        if (!name)
43684480          return XML_ERROR_NO_MEMORY;
4369        entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0);
4481        entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0);
43704482        poolDiscard(&dtd->pool);
43714483        /* first, determine if a check for an existing declaration is needed;
43724484           if yes, check that the entity exists, and that it is internal,
r15669r15670
48905002                               next - enc->minBytesPerChar);
48915003        if (!name)
48925004          return XML_ERROR_NO_MEMORY;
4893        entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0);
5005        entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0);
48945006        poolDiscard(&temp2Pool);
48955007        /* First, determine if a check for an existing declaration is needed;
48965008           if yes, check that the entity exists, and that it is internal.
r15669r15670
49995111          result = XML_ERROR_NO_MEMORY;
50005112          goto endEntityValue;
50015113        }
5002        entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0);
5114        entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0);
50035115        poolDiscard(&tempPool);
50045116        if (!entity) {
50055117          /* not a well-formedness error - see XML 1.0: WFC Entity Declared */
r15669r15670
52895401      }
52905402      if (!poolAppendChar(&dtd->pool, XML_T('\0')))
52915403        return 0;
5292      prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool),
5404      prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool),
52935405                                sizeof(PREFIX));
52945406      if (!prefix)
52955407        return 0;
r15669r15670
53185430    return NULL;
53195431  /* skip quotation mark - its storage will be re-used (like in name[-1]) */
53205432  ++name;
5321  id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, name, sizeof(ATTRIBUTE_ID));
5433  id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, sizeof(ATTRIBUTE_ID));
53225434  if (!id)
53235435    return NULL;
53245436  if (id->name != name)
r15669r15670
53365448      if (name[5] == XML_T('\0'))
53375449        id->prefix = &dtd->defaultPrefix;
53385450      else
5339        id->prefix = (PREFIX *)lookup(&dtd->prefixes, name + 6, sizeof(PREFIX));
5451        id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, sizeof(PREFIX));
53405452      id->xmlns = XML_TRUE;
53415453    }
53425454    else {
r15669r15670
53515463          }
53525464          if (!poolAppendChar(&dtd->pool, XML_T('\0')))
53535465            return NULL;
5354          id->prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool),
5466          id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool),
53555467                                        sizeof(PREFIX));
53565468          if (id->prefix->name == poolStart(&dtd->pool))
53575469            poolFinish(&dtd->pool);
r15669r15670
54475559      ENTITY *e;
54485560      if (!poolAppendChar(&tempPool, XML_T('\0')))
54495561        return XML_FALSE;
5450      e = (ENTITY *)lookup(&dtd->generalEntities, poolStart(&tempPool), 0);
5562      e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&tempPool), 0);
54515563      if (e)
54525564        e->open = XML_TRUE;
54535565      if (*s != XML_T('\0'))
r15669r15670
54625574      else {
54635575        if (!poolAppendChar(&tempPool, XML_T('\0')))
54645576          return XML_FALSE;
5465        prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&tempPool),
5577        prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&tempPool),
54665578                                  sizeof(PREFIX));
54675579        if (!prefix)
54685580          return XML_FALSE;
r15669r15670
56265738   The new DTD has already been initialized.
56275739*/
56285740static int
5629dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
5741dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
56305742{
56315743  HASH_TABLE_ITER iter;
56325744
r15669r15670
56415753    name = poolCopyString(&(newDtd->pool), oldP->name);
56425754    if (!name)
56435755      return 0;
5644    if (!lookup(&(newDtd->prefixes), name, sizeof(PREFIX)))
5756    if (!lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX)))
56455757      return 0;
56465758  }
56475759
r15669r15670
56635775    if (!name)
56645776      return 0;
56655777    ++name;
5666    newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name,
5778    newA = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), name,
56675779                                  sizeof(ATTRIBUTE_ID));
56685780    if (!newA)
56695781      return 0;
r15669r15670
56735785      if (oldA->prefix == &oldDtd->defaultPrefix)
56745786        newA->prefix = &newDtd->defaultPrefix;
56755787      else
5676        newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes),
5788        newA->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes),
56775789                                        oldA->prefix->name, 0);
56785790    }
56795791  }
r15669r15670
56925804    name = poolCopyString(&(newDtd->pool), oldE->name);
56935805    if (!name)
56945806      return 0;
5695    newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name,
5807    newE = (ELEMENT_TYPE *)lookup(oldParser, &(newDtd->elementTypes), name,
56965808                                  sizeof(ELEMENT_TYPE));
56975809    if (!newE)
56985810      return 0;
r15669r15670
57065818    }
57075819    if (oldE->idAtt)
57085820      newE->idAtt = (ATTRIBUTE_ID *)
5709          lookup(&(newDtd->attributeIds), oldE->idAtt->name, 0);
5821          lookup(oldParser, &(newDtd->attributeIds), oldE->idAtt->name, 0);
57105822    newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts;
57115823    if (oldE->prefix)
5712      newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes),
5824      newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes),
57135825                                      oldE->prefix->name, 0);
57145826    for (i = 0; i < newE->nDefaultAtts; i++) {
57155827      newE->defaultAtts[i].id = (ATTRIBUTE_ID *)
5716          lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0);
5828          lookup(oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0);
57175829      newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata;
57185830      if (oldE->defaultAtts[i].value) {
57195831        newE->defaultAtts[i].value
r15669r15670
57275839  }
57285840
57295841  /* Copy the entity tables. */
5730  if (!copyEntityTable(&(newDtd->generalEntities),
5842  if (!copyEntityTable(oldParser,
5843                       &(newDtd->generalEntities),
57315844                       &(newDtd->pool),
57325845                       &(oldDtd->generalEntities)))
57335846      return 0;
57345847
57355848#ifdef XML_DTD
5736  if (!copyEntityTable(&(newDtd->paramEntities),
5849  if (!copyEntityTable(oldParser,
5850                       &(newDtd->paramEntities),
57375851                       &(newDtd->pool),
57385852                       &(oldDtd->paramEntities)))
57395853      return 0;
r15669r15670
57565870}  /* End dtdCopy */
57575871
57585872static int
5759copyEntityTable(HASH_TABLE *newTable,
5873copyEntityTable(XML_Parser oldParser,
5874                HASH_TABLE *newTable,
57605875                STRING_POOL *newPool,
57615876                const HASH_TABLE *oldTable)
57625877{
r15669r15670
57755890    name = poolCopyString(newPool, oldE->name);
57765891    if (!name)
57775892      return 0;
5778    newE = (ENTITY *)lookup(newTable, name, sizeof(ENTITY));
5893    newE = (ENTITY *)lookup(oldParser, newTable, name, sizeof(ENTITY));
57795894    if (!newE)
57805895      return 0;
57815896    if (oldE->systemId) {
r15669r15670
58335948}
58345949
58355950static unsigned long FASTCALL
5836hash(KEY s)
5951hash(XML_Parser parser, KEY s)
58375952{
5838  unsigned long h = 0;
5953  unsigned long h = hash_secret_salt;
58395954  while (*s)
58405955    h = CHAR_HASH(h, *s++);
58415956  return h;
58425957}
58435958
58445959static NAMED *
5845lookup(HASH_TABLE *table, KEY name, size_t createSize)
5960lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize)
58465961{
58475962  size_t i;
58485963  if (table->size == 0) {
r15669r15670
58595974      return NULL;
58605975    }
58615976    memset(table->v, 0, tsize);
5862    i = hash(name) & ((unsigned long)table->size - 1);
5977    i = hash(parser, name) & ((unsigned long)table->size - 1);
58635978  }
58645979  else {
5865    unsigned long h = hash(name);
5980    unsigned long h = hash(parser, name);
58665981    unsigned long mask = (unsigned long)table->size - 1;
58675982    unsigned char step = 0;
58685983    i = h & mask;
r15669r15670
58886003      memset(newV, 0, tsize);
58896004      for (i = 0; i < table->size; i++)
58906005        if (table->v[i]) {
5891          unsigned long newHash = hash(table->v[i]->name);
6006          unsigned long newHash = hash(parser, table->v[i]->name);
58926007          size_t j = newHash & newMask;
58936008          step = 0;
58946009          while (newV[j]) {
r15669r15670
61096224  }
61106225  if (pool->blocks && pool->start == pool->blocks->s) {
61116226    int blockSize = (int)(pool->end - pool->start)*2;
6112    pool->blocks = (BLOCK *)
6227    BLOCK *temp = (BLOCK *)
61136228      pool->mem->realloc_fcn(pool->blocks,
61146229                             (offsetof(BLOCK, s)
61156230                              + blockSize * sizeof(XML_Char)));
6116    if (pool->blocks == NULL)
6231    if (temp == NULL)
61176232      return XML_FALSE;
6233    pool->blocks = temp;
61186234    pool->blocks->size = blockSize;
61196235    pool->ptr = pool->blocks->s + (pool->ptr - pool->start);
61206236    pool->start = pool->blocks->s;
r15669r15670
62636379
62646380  if (!name)
62656381    return NULL;
6266  ret = (ELEMENT_TYPE *) lookup(&dtd->elementTypes, name, sizeof(ELEMENT_TYPE));
6382  ret = (ELEMENT_TYPE *) lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE));
62676383  if (!ret)
62686384    return NULL;
62696385  if (ret->name != name)

Previous 15994 Revisions Next


© 1998-2018 The MESS Team