11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci See the file COPYING for copying permission. 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/ 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <stddef.h> 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string.h> /* memset(), memcpy() */ 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <assert.h> 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <limits.h> /* UINT_MAX */ 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <time.h> /* time() */ 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_BUILDING_EXPAT 1 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef COMPILED_FROM_DSP 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "winconfig.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(MACOS_CLASSIC) 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "macconfig.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(__amigaos__) 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "amigaconfig.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(__WATCOMC__) 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "watcomconfig.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(HAVE_EXPAT_CONFIG_H) 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <expat_config.h> 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* ndef COMPILED_FROM_DSP */ 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ascii.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "expat.h" 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_UNICODE 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlConvert XmlUtf16Convert 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlEncode XmlUtf16Encode 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Using pointer subtraction to convert to integer type. */ 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1)) 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef unsigned short ICHAR; 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlConvert XmlUtf8Convert 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlEncode XmlUtf8Encode 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MUST_CONVERT(enc, s) (!(enc)->isUtf8) 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef char ICHAR; 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef XML_NS 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlInitEncodingNS XmlInitEncoding 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef XmlGetInternalEncodingNS 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlGetInternalEncodingNS XmlGetInternalEncoding 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XmlParseXmlDeclNS XmlParseXmlDecl 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_UNICODE 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_UNICODE_WCHAR_T 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_T(x) (const wchar_t)x 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_L(x) L ## x 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_T(x) (const unsigned short)x 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_L(x) x 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_T(x) x 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define XML_L(x) x 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Round up n to be a multiple of sz, where sz is a power of 2. */ 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1)) 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Handle the case where memmove() doesn't exist. */ 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef HAVE_MEMMOVE 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef HAVE_BCOPY 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define memmove(d,s,l) bcopy((s),(d),(l)) 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#error memmove does not exist on this platform, nor is a substitute available 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* HAVE_BCOPY */ 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* HAVE_MEMMOVE */ 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "internal.h" 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "xmltok.h" 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "xmlrole.h" 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef const XML_Char *KEY; 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct { 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci KEY name; 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} NAMED; 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct { 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NAMED **v; 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned char power; 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t size; 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t used; 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Memory_Handling_Suite *mem; 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} HASH_TABLE; 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Basic character hash algorithm, taken from Python's string hash: 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci h = h * 1000003 ^ character, the constant being a prime number. 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/ 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_UNICODE 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CHAR_HASH(h, c) \ 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (((h) * 0xF4243) ^ (unsigned short)(c)) 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CHAR_HASH(h, c) \ 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (((h) * 0xF4243) ^ (unsigned char)(c)) 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* For probing (after a collision) we need a step size relative prime 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci to the hash table size, which is a power of 2. We use double-hashing, 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci since we can calculate a second hash value cheaply by taking those bits 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci of the first hash value that were discarded (masked out) when the table 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci index was calculated: index = hash & mask, where mask = table->size - 1. 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci We limit the maximum step size to table->size / 4 (mask >> 2) and make 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it odd, since odd numbers are always relative prime to a power of 2. 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/ 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define SECOND_HASH(hash, mask, power) \ 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2)) 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define PROBE_STEP(hash, mask, power) \ 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1)) 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct { 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NAMED **p; 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NAMED **end; 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} HASH_TABLE_ITER; 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_DATA_BUF_SIZE 1024 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_ATTS_SIZE 16 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_ATTS_VERSION 0xFFFFFFFF 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_BLOCK_SIZE 1024 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_BUFFER_SIZE 1024 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define EXPAND_SPARE 24 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct binding { 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct prefix *prefix; 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct binding *nextTagBinding; 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct binding *prevPrefixBinding; 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const struct attribute_id *attId; 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *uri; 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int uriLen; 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int uriAlloc; 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} BINDING; 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct prefix { 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name; 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BINDING *binding; 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} PREFIX; 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct { 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *str; 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *localPart; 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *prefix; 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int strLen; 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int uriLen; 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int prefixLen; 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} TAG_NAME; 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* TAG represents an open element. 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci The name of the element is stored in both the document and API 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encodings. The memory buffer 'buf' is a separately-allocated 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memory area which stores the name. During the XML_Parse()/ 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XMLParseBuffer() when the element is open, the memory for the 'raw' 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci version of the name (in the document encoding) is shared with the 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci document buffer. If the element is open across calls to 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci contain the 'raw' name as well. 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci A parser re-uses these structures, maintaining a list of allocated 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TAG objects in a free list. 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/ 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct tag { 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct tag *parent; /* parent of this element */ 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *rawName; /* tagName in the original encoding */ 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int rawNameLength; 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TAG_NAME name; /* tagName in the API encoding */ 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char *buf; /* buffer for name components */ 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char *bufEnd; /* end of the buffer */ 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BINDING *bindings; 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} TAG; 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct { 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name; 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *textPtr; 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int textLen; /* length in XML_Chars */ 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int processed; /* # of processed bytes - when suspended */ 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *systemId; 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *base; 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *publicId; 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *notation; 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool open; 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool is_param; 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool is_internal; /* true if declared in internal subset outside PE */ 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} ENTITY; 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct { 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Content_Type type; 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Content_Quant quant; 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char * name; 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int firstchild; 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int lastchild; 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int childcnt; 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int nextsib; 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} CONTENT_SCAFFOLD; 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_SCAFFOLD_ELEMENTS 32 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct block { 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct block *next; 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int size; 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char s[1]; 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} BLOCK; 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct { 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BLOCK *blocks; 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BLOCK *freeBlocks; 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *end; 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *ptr; 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *start; 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Memory_Handling_Suite *mem; 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} STRING_POOL; 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* The XML_Char before the name is used to determine whether 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci an attribute has been specified. */ 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct attribute_id { 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *name; 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PREFIX *prefix; 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool maybeTokenized; 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool xmlns; 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} ATTRIBUTE_ID; 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct { 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ATTRIBUTE_ID *id; 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool isCdata; 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *value; 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} DEFAULT_ATTRIBUTE; 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct { 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long version; 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long hash; 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *uriName; 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} NS_ATT; 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct { 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name; 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PREFIX *prefix; 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ATTRIBUTE_ID *idAtt; 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int nDefaultAtts; 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int allocDefaultAtts; 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DEFAULT_ATTRIBUTE *defaultAtts; 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} ELEMENT_TYPE; 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct { 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HASH_TABLE generalEntities; 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HASH_TABLE elementTypes; 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HASH_TABLE attributeIds; 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HASH_TABLE prefixes; 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci STRING_POOL pool; 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci STRING_POOL entityValuePool; 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* false once a parameter entity reference has been skipped */ 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool keepProcessing; 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* true once an internal or external PE reference has been encountered; 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this includes the reference to an external subset */ 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool hasParamEntityRefs; 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool standalone; 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* indicates if external PE has been read */ 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool paramEntityRead; 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HASH_TABLE paramEntities; 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PREFIX defaultPrefix; 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* === scaffolding for building content model === */ 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool in_eldecl; 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CONTENT_SCAFFOLD *scaffold; 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned contentStringLen; 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned scaffSize; 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned scaffCount; 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int scaffLevel; 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int *scaffIndex; 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} DTD; 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct open_internal_entity { 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *internalEventPtr; 2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *internalEventEndPtr; 2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct open_internal_entity *next; 2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ENTITY *entity; 2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int startTagLevel; 2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool betweenDecl; /* WFC: PE Between Declarations */ 2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} OPEN_INTERNAL_ENTITY; 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef enum XML_Error PTRCALL Processor(XML_Parser parser, 3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start, 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **endPtr); 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor prologProcessor; 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor prologInitProcessor; 3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor contentProcessor; 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor cdataSectionProcessor; 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor ignoreSectionProcessor; 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor externalParEntProcessor; 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor externalParEntInitProcessor; 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor entityValueProcessor; 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor entityValueInitProcessor; 3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor epilogProcessor; 3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor errorProcessor; 3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor externalEntityInitProcessor; 3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor externalEntityInitProcessor2; 3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor externalEntityInitProcessor3; 3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor externalEntityContentProcessor; 3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic Processor internalEntityProcessor; 3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihandleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); 3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciprocessXmlDecl(XML_Parser parser, int isGeneralTextEntity, 3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s, const char *next); 3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciinitializeEncoding(XML_Parser parser); 3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoProlog(XML_Parser parser, const ENCODING *enc, const char *s, 3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, int tok, const char *next, const char **nextPtr, 3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool haveMore); 3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciprocessInternalEntity(XML_Parser parser, ENTITY *entity, 3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool betweenDecl); 3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, 3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start, const char *end, const char **endPtr, 3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool haveMore); 3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, 3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, const char **nextPtr, XML_Bool haveMore); 3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, 3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, const char **nextPtr, XML_Bool haveMore); 3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistoreAtts(XML_Parser parser, const ENCODING *, const char *s, 3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TAG_NAME *tagNamePtr, BINDING **bindingsPtr); 3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciaddBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, 3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *uri, BINDING **bindingsPtr); 3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int 3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidefineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, 3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser); 3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistoreAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, 3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *, const char *, STRING_POOL *); 3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciappendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, 3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *, const char *, STRING_POOL *); 3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic ATTRIBUTE_ID * 3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccigetAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, 3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end); 3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int 3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccisetElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); 3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistoreEntityValue(XML_Parser parser, const ENCODING *enc, const char *start, 3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end); 3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int 3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccireportProcessingInstruction(XML_Parser parser, const ENCODING *enc, 3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start, const char *end); 3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int 3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccireportComment(XML_Parser parser, const ENCODING *enc, const char *start, 3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end); 3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void 3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccireportDefault(XML_Parser parser, const ENCODING *enc, const char *start, 3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end); 3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char * getContext(XML_Parser parser); 3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool 3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccisetContext(XML_Parser parser, const XML_Char *context); 3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL normalizePublicId(XML_Char *s); 3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic DTD * dtdCreate(const XML_Memory_Handling_Suite *ms); 3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* do not call if parentParser != NULL */ 3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms); 3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void 3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms); 3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int 3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidtdCopy(XML_Parser oldParser, 3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); 3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int 3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccicopyEntityTable(XML_Parser oldParser, 4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); 4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic NAMED * 4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccilookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize); 4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL 4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms); 4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL hashTableClear(HASH_TABLE *); 4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL hashTableDestroy(HASH_TABLE *); 4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL 4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); 4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *); 4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL 4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms); 4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL poolClear(STRING_POOL *); 4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL poolDestroy(STRING_POOL *); 4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Char * 4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolAppend(STRING_POOL *pool, const ENCODING *enc, 4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *ptr, const char *end); 4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Char * 4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolStoreString(STRING_POOL *pool, const ENCODING *enc, 4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *ptr, const char *end); 4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool FASTCALL poolGrow(STRING_POOL *pool); 4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char * FASTCALL 4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolCopyString(STRING_POOL *pool, const XML_Char *s); 4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char * 4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); 4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char * FASTCALL 4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolAppendString(STRING_POOL *pool, const XML_Char *s); 4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int FASTCALL nextScaffoldPart(XML_Parser parser); 4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Content * build_model(XML_Parser parser); 4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic ELEMENT_TYPE * 4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccigetElementType(XML_Parser parser, const ENCODING *enc, 4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *ptr, const char *end); 4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic unsigned long generate_hash_secret_salt(void); 4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool startParsing(XML_Parser parser); 4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Parser 4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciparserCreate(const XML_Char *encodingName, 4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Memory_Handling_Suite *memsuite, 4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *nameSep, 4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD *dtd); 4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void 4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciparserInit(XML_Parser parser, const XML_Char *encodingName); 4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolStart(pool) ((pool)->start) 4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolEnd(pool) ((pool)->ptr) 4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolLength(pool) ((pool)->ptr - (pool)->start) 4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolChop(pool) ((void)--(pool->ptr)) 4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolLastChar(pool) (((pool)->ptr)[-1]) 4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolDiscard(pool) ((pool)->ptr = (pool)->start) 4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolFinish(pool) ((pool)->start = (pool)->ptr) 4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define poolAppendChar(pool, c) \ 4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ 4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ? 0 \ 4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : ((*((pool)->ptr)++ = c), 1)) 4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct XML_ParserStruct { 4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* The first member must be userData so that the XML_GetUserData 4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci macro works. */ 4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void *m_userData; 4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void *m_handlerArg; 4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char *m_buffer; 4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Memory_Handling_Suite m_mem; 4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* first character to be parsed */ 4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *m_bufferPtr; 4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* past last character to be parsed */ 4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char *m_bufferEnd; 4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* allocated end of buffer */ 4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *m_bufferLim; 4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Index m_parseEndByteIndex; 4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *m_parseEndPtr; 4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *m_dataBuf; 4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *m_dataBufEnd; 4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartElementHandler m_startElementHandler; 4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndElementHandler m_endElementHandler; 4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_CharacterDataHandler m_characterDataHandler; 4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_ProcessingInstructionHandler m_processingInstructionHandler; 4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_CommentHandler m_commentHandler; 4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartCdataSectionHandler m_startCdataSectionHandler; 4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndCdataSectionHandler m_endCdataSectionHandler; 4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_DefaultHandler m_defaultHandler; 4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler; 4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler; 4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler; 4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_NotationDeclHandler m_notationDeclHandler; 4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler; 4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler; 4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_NotStandaloneHandler m_notStandaloneHandler; 4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_ExternalEntityRefHandler m_externalEntityRefHandler; 4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Parser m_externalEntityRefHandlerArg; 4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_SkippedEntityHandler m_skippedEntityHandler; 4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_UnknownEncodingHandler m_unknownEncodingHandler; 4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_ElementDeclHandler m_elementDeclHandler; 4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_AttlistDeclHandler m_attlistDeclHandler; 4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EntityDeclHandler m_entityDeclHandler; 4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_XmlDeclHandler m_xmlDeclHandler; 4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ENCODING *m_encoding; 5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci INIT_ENCODING m_initEncoding; 5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ENCODING *m_internalEncoding; 5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *m_protocolEncodingName; 5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool m_ns; 5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool m_ns_triplets; 5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void *m_unknownEncodingMem; 5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void *m_unknownEncodingData; 5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void *m_unknownEncodingHandlerData; 5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void (XMLCALL *m_unknownEncodingRelease)(void *); 5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PROLOG_STATE m_prologState; 5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Processor *m_processor; 5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error m_errorCode; 5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *m_eventPtr; 5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *m_eventEndPtr; 5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *m_positionPtr; 5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OPEN_INTERNAL_ENTITY *m_openInternalEntities; 5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OPEN_INTERNAL_ENTITY *m_freeInternalEntities; 5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool m_defaultExpandInternalEntities; 5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int m_tagLevel; 5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ENTITY *m_declEntity; 5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *m_doctypeName; 5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *m_doctypeSysid; 5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *m_doctypePubid; 5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *m_declAttributeType; 5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *m_declNotationName; 5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *m_declNotationPublicId; 5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ELEMENT_TYPE *m_declElementType; 5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ATTRIBUTE_ID *m_declAttributeId; 5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool m_declAttributeIsCdata; 5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool m_declAttributeIsId; 5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD *m_dtd; 5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *m_curBase; 5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TAG *m_tagStack; 5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TAG *m_freeTagList; 5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BINDING *m_inheritedBindings; 5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BINDING *m_freeBindingList; 5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int m_attsSize; 5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int m_nSpecifiedAtts; 5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int m_idAttIndex; 5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ATTRIBUTE *m_atts; 5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NS_ATT *m_nsAtts; 5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long m_nsAttsVersion; 5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned char m_nsAttsPower; 5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO 5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_AttrInfo *m_attInfo; 5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci POSITION m_position; 5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci STRING_POOL m_tempPool; 5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci STRING_POOL m_temp2Pool; 5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char *m_groupConnector; 5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned int m_groupSize; 5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char m_namespaceSeparator; 5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Parser m_parentParser; 5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_ParsingStatus m_parsingStatus; 5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool m_isParamEntity; 5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool m_useForeignDTD; 5571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_ParamEntityParsing m_paramEntityParsing; 5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long m_hash_secret_salt; 5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 5611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MALLOC(s) (parser->m_mem.malloc_fcn((s))) 5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s))) 5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define FREE(p) (parser->m_mem.free_fcn((p))) 5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define userData (parser->m_userData) 5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define handlerArg (parser->m_handlerArg) 5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define startElementHandler (parser->m_startElementHandler) 5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define endElementHandler (parser->m_endElementHandler) 5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define characterDataHandler (parser->m_characterDataHandler) 5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define processingInstructionHandler \ 5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (parser->m_processingInstructionHandler) 5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define commentHandler (parser->m_commentHandler) 5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define startCdataSectionHandler \ 5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (parser->m_startCdataSectionHandler) 5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define endCdataSectionHandler (parser->m_endCdataSectionHandler) 5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define defaultHandler (parser->m_defaultHandler) 5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler) 5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler) 5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define unparsedEntityDeclHandler \ 5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (parser->m_unparsedEntityDeclHandler) 5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define notationDeclHandler (parser->m_notationDeclHandler) 5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define startNamespaceDeclHandler \ 5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (parser->m_startNamespaceDeclHandler) 5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler) 5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define notStandaloneHandler (parser->m_notStandaloneHandler) 5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define externalEntityRefHandler \ 5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (parser->m_externalEntityRefHandler) 5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define externalEntityRefHandlerArg \ 5901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (parser->m_externalEntityRefHandlerArg) 5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define internalEntityRefHandler \ 5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (parser->m_internalEntityRefHandler) 5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define skippedEntityHandler (parser->m_skippedEntityHandler) 5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define unknownEncodingHandler (parser->m_unknownEncodingHandler) 5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define elementDeclHandler (parser->m_elementDeclHandler) 5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define attlistDeclHandler (parser->m_attlistDeclHandler) 5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define entityDeclHandler (parser->m_entityDeclHandler) 5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define xmlDeclHandler (parser->m_xmlDeclHandler) 5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define encoding (parser->m_encoding) 6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define initEncoding (parser->m_initEncoding) 6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define internalEncoding (parser->m_internalEncoding) 6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define unknownEncodingMem (parser->m_unknownEncodingMem) 6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define unknownEncodingData (parser->m_unknownEncodingData) 6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define unknownEncodingHandlerData \ 6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (parser->m_unknownEncodingHandlerData) 6061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define unknownEncodingRelease (parser->m_unknownEncodingRelease) 6071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define protocolEncodingName (parser->m_protocolEncodingName) 6081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define ns (parser->m_ns) 6091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define ns_triplets (parser->m_ns_triplets) 6101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define prologState (parser->m_prologState) 6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define processor (parser->m_processor) 6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define errorCode (parser->m_errorCode) 6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define eventPtr (parser->m_eventPtr) 6141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define eventEndPtr (parser->m_eventEndPtr) 6151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define positionPtr (parser->m_positionPtr) 6161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define position (parser->m_position) 6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define openInternalEntities (parser->m_openInternalEntities) 6181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define freeInternalEntities (parser->m_freeInternalEntities) 6191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define defaultExpandInternalEntities \ 6201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (parser->m_defaultExpandInternalEntities) 6211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define tagLevel (parser->m_tagLevel) 6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define buffer (parser->m_buffer) 6231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define bufferPtr (parser->m_bufferPtr) 6241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define bufferEnd (parser->m_bufferEnd) 6251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define parseEndByteIndex (parser->m_parseEndByteIndex) 6261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define parseEndPtr (parser->m_parseEndPtr) 6271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define bufferLim (parser->m_bufferLim) 6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define dataBuf (parser->m_dataBuf) 6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define dataBufEnd (parser->m_dataBufEnd) 6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define _dtd (parser->m_dtd) 6311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define curBase (parser->m_curBase) 6321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declEntity (parser->m_declEntity) 6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define doctypeName (parser->m_doctypeName) 6341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define doctypeSysid (parser->m_doctypeSysid) 6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define doctypePubid (parser->m_doctypePubid) 6361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declAttributeType (parser->m_declAttributeType) 6371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declNotationName (parser->m_declNotationName) 6381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declNotationPublicId (parser->m_declNotationPublicId) 6391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declElementType (parser->m_declElementType) 6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declAttributeId (parser->m_declAttributeId) 6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declAttributeIsCdata (parser->m_declAttributeIsCdata) 6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define declAttributeIsId (parser->m_declAttributeIsId) 6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define freeTagList (parser->m_freeTagList) 6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define freeBindingList (parser->m_freeBindingList) 6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define inheritedBindings (parser->m_inheritedBindings) 6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define tagStack (parser->m_tagStack) 6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define atts (parser->m_atts) 6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define attsSize (parser->m_attsSize) 6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define nSpecifiedAtts (parser->m_nSpecifiedAtts) 6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define idAttIndex (parser->m_idAttIndex) 6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define nsAtts (parser->m_nsAtts) 6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define nsAttsVersion (parser->m_nsAttsVersion) 6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define nsAttsPower (parser->m_nsAttsPower) 6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define attInfo (parser->m_attInfo) 6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define tempPool (parser->m_tempPool) 6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define temp2Pool (parser->m_temp2Pool) 6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define groupConnector (parser->m_groupConnector) 6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define groupSize (parser->m_groupSize) 6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define namespaceSeparator (parser->m_namespaceSeparator) 6601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define parentParser (parser->m_parentParser) 6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define ps_parsing (parser->m_parsingStatus.parsing) 6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define ps_finalBuffer (parser->m_parsingStatus.finalBuffer) 6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define isParamEntity (parser->m_isParamEntity) 6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define useForeignDTD (parser->m_useForeignDTD) 6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define paramEntityParsing (parser->m_paramEntityParsing) 6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define hash_secret_salt (parser->m_hash_secret_salt) 6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Parser XMLCALL 6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ParserCreate(const XML_Char *encodingName) 6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ParserCreate_MM(encodingName, NULL, NULL); 6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Parser XMLCALL 6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) 6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char tmp[2]; 6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *tmp = nsSep; 6811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ParserCreate_MM(encodingName, NULL, tmp); 6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char implicitContext[] = { 6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p, 6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, 6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g, 6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9, 6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e, 6901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0' 6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 6921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic unsigned long 6941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccigenerate_hash_secret_salt(void) 6951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 6961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned int seed = time(NULL) % UINT_MAX; 6971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci srand(seed); 6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return rand(); 6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool /* only valid for root parser */ 7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistartParsing(XML_Parser parser) 7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* hash functions must be initialized before setContext() is called */ 7051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (hash_secret_salt == 0) 7061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hash_secret_salt = generate_hash_secret_salt(); 7071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ns) { 7081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* implicit context only set for root parser, since child 7091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parsers (i.e. external entity parsers) will inherit it 7101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 7111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return setContext(parser, implicitContext); 7121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_TRUE; 7141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 7151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Parser XMLCALL 7171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ParserCreate_MM(const XML_Char *encodingName, 7181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Memory_Handling_Suite *memsuite, 7191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *nameSep) 7201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 7211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return parserCreate(encodingName, memsuite, nameSep, NULL); 7221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 7231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Parser 7251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciparserCreate(const XML_Char *encodingName, 7261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Memory_Handling_Suite *memsuite, 7271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *nameSep, 7281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD *dtd) 7291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Parser parser; 7311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (memsuite) { 7331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Memory_Handling_Suite *mtemp; 7341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parser = (XML_Parser) 7351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memsuite->malloc_fcn(sizeof(struct XML_ParserStruct)); 7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (parser != NULL) { 7371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); 7381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mtemp->malloc_fcn = memsuite->malloc_fcn; 7391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mtemp->realloc_fcn = memsuite->realloc_fcn; 7401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mtemp->free_fcn = memsuite->free_fcn; 7411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 7441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Memory_Handling_Suite *mtemp; 7451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct)); 7461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (parser != NULL) { 7471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); 7481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mtemp->malloc_fcn = malloc; 7491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mtemp->realloc_fcn = realloc; 7501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mtemp->free_fcn = free; 7511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!parser) 7551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return parser; 7561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer = NULL; 7581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferLim = NULL; 7591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci attsSize = INIT_ATTS_SIZE; 7611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE)); 7621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (atts == NULL) { 7631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(parser); 7641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 7651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO 7671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci attInfo = (XML_AttrInfo*)MALLOC(attsSize * sizeof(XML_AttrInfo)); 7681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (attInfo == NULL) { 7691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(atts); 7701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(parser); 7711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 7721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 7741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); 7751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dataBuf == NULL) { 7761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(atts); 7771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO 7781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(attInfo); 7791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 7801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(parser); 7811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 7821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; 7841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd) 7861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci _dtd = dtd; 7871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 7881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci _dtd = dtdCreate(&parser->m_mem); 7891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (_dtd == NULL) { 7901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(dataBuf); 7911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(atts); 7921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO 7931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(attInfo); 7941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 7951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(parser); 7961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 7971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeBindingList = NULL; 8011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeTagList = NULL; 8021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeInternalEntities = NULL; 8031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci groupSize = 0; 8051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci groupConnector = NULL; 8061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unknownEncodingHandler = NULL; 8081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unknownEncodingHandlerData = NULL; 8091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci namespaceSeparator = ASCII_EXCL; 8111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ns = XML_FALSE; 8121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ns_triplets = XML_FALSE; 8131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nsAtts = NULL; 8151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nsAttsVersion = 0; 8161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nsAttsPower = 0; 8171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolInit(&tempPool, &(parser->m_mem)); 8191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolInit(&temp2Pool, &(parser->m_mem)); 8201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parserInit(parser, encodingName); 8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (encodingName && !protocolEncodingName) { 8231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_ParserFree(parser); 8241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 8251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (nameSep) { 8281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ns = XML_TRUE; 8291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci internalEncoding = XmlGetInternalEncodingNS(); 8301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci namespaceSeparator = *nameSep; 8311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 8331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci internalEncoding = XmlGetInternalEncoding(); 8341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return parser; 8371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 8381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void 8401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciparserInit(XML_Parser parser, const XML_Char *encodingName) 8411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = prologInitProcessor; 8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlPrologStateInit(&prologState); 8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protocolEncodingName = (encodingName != NULL 8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ? poolCopyString(&tempPool, encodingName) 8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : NULL); 8471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci curBase = NULL; 8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlInitEncoding(&initEncoding, &encoding, 0); 8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci userData = NULL; 8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handlerArg = NULL; 8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startElementHandler = NULL; 8521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endElementHandler = NULL; 8531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci characterDataHandler = NULL; 8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processingInstructionHandler = NULL; 8551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commentHandler = NULL; 8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startCdataSectionHandler = NULL; 8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endCdataSectionHandler = NULL; 8581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci defaultHandler = NULL; 8591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startDoctypeDeclHandler = NULL; 8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endDoctypeDeclHandler = NULL; 8611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unparsedEntityDeclHandler = NULL; 8621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci notationDeclHandler = NULL; 8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startNamespaceDeclHandler = NULL; 8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endNamespaceDeclHandler = NULL; 8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci notStandaloneHandler = NULL; 8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci externalEntityRefHandler = NULL; 8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci externalEntityRefHandlerArg = parser; 8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci skippedEntityHandler = NULL; 8691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci elementDeclHandler = NULL; 8701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci attlistDeclHandler = NULL; 8711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entityDeclHandler = NULL; 8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xmlDeclHandler = NULL; 8731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferPtr = buffer; 8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferEnd = buffer; 8751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parseEndByteIndex = 0; 8761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parseEndPtr = NULL; 8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declElementType = NULL; 8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeId = NULL; 8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity = NULL; 8801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci doctypeName = NULL; 8811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci doctypeSysid = NULL; 8821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci doctypePubid = NULL; 8831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeType = NULL; 8841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declNotationName = NULL; 8851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declNotationPublicId = NULL; 8861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeIsCdata = XML_FALSE; 8871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeIsId = XML_FALSE; 8881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memset(&position, 0, sizeof(POSITION)); 8891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_NONE; 8901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = NULL; 8911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPtr = NULL; 8921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci positionPtr = NULL; 8931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openInternalEntities = NULL; 8941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci defaultExpandInternalEntities = XML_TRUE; 8951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tagLevel = 0; 8961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tagStack = NULL; 8971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci inheritedBindings = NULL; 8981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nSpecifiedAtts = 0; 8991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unknownEncodingMem = NULL; 9001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unknownEncodingRelease = NULL; 9011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unknownEncodingData = NULL; 9021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parentParser = NULL; 9031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps_parsing = XML_INITIALIZED; 9041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 9051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci isParamEntity = XML_FALSE; 9061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci useForeignDTD = XML_FALSE; 9071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; 9081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 9091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hash_secret_salt = 0; 9101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 9111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* moves list of bindings to freeBindingList */ 9131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL 9141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccimoveToFreeBindingList(XML_Parser parser, BINDING *bindings) 9151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 9161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (bindings) { 9171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BINDING *b = bindings; 9181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bindings = bindings->nextTagBinding; 9191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->nextTagBinding = freeBindingList; 9201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeBindingList = b; 9211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 9221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 9231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Bool XMLCALL 9251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ParserReset(XML_Parser parser, const XML_Char *encodingName) 9261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 9271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TAG *tStk; 9281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OPEN_INTERNAL_ENTITY *openEntityList; 9291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (parentParser) 9301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_FALSE; 9311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* move tagStack to freeTagList */ 9321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tStk = tagStack; 9331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (tStk) { 9341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TAG *tag = tStk; 9351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tStk = tStk->parent; 9361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->parent = freeTagList; 9371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci moveToFreeBindingList(parser, tag->bindings); 9381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->bindings = NULL; 9391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeTagList = tag; 9401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 9411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* move openInternalEntities to freeInternalEntities */ 9421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openEntityList = openInternalEntities; 9431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (openEntityList) { 9441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OPEN_INTERNAL_ENTITY *openEntity = openEntityList; 9451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openEntityList = openEntity->next; 9461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openEntity->next = freeInternalEntities; 9471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeInternalEntities = openEntity; 9481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 9491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci moveToFreeBindingList(parser, inheritedBindings); 9501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(unknownEncodingMem); 9511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (unknownEncodingRelease) 9521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unknownEncodingRelease(unknownEncodingData); 9531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&tempPool); 9541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&temp2Pool); 9551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parserInit(parser, encodingName); 9561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtdReset(_dtd, &parser->m_mem); 9571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_TRUE; 9581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 9591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Status XMLCALL 9611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) 9621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 9631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Block after XML_Parse()/XML_ParseBuffer() has been called. 9641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XXX There's no way for the caller to determine which of the 9651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XXX possible error cases caused the XML_STATUS_ERROR return. 9661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 9671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) 9681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 9691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (encodingName == NULL) 9701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protocolEncodingName = NULL; 9711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 9721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protocolEncodingName = poolCopyString(&tempPool, encodingName); 9731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!protocolEncodingName) 9741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 9751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 9761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_OK; 9771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 9781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Parser XMLCALL 9801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ExternalEntityParserCreate(XML_Parser oldParser, 9811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *context, 9821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *encodingName) 9831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 9841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Parser parser = oldParser; 9851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD *newDtd = NULL; 9861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD *oldDtd = _dtd; 9871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartElementHandler oldStartElementHandler = startElementHandler; 9881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndElementHandler oldEndElementHandler = endElementHandler; 9891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler; 9901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_ProcessingInstructionHandler oldProcessingInstructionHandler 9911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci = processingInstructionHandler; 9921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_CommentHandler oldCommentHandler = commentHandler; 9931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartCdataSectionHandler oldStartCdataSectionHandler 9941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci = startCdataSectionHandler; 9951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndCdataSectionHandler oldEndCdataSectionHandler 9961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci = endCdataSectionHandler; 9971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_DefaultHandler oldDefaultHandler = defaultHandler; 9981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler 9991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci = unparsedEntityDeclHandler; 10001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler; 10011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler 10021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci = startNamespaceDeclHandler; 10031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler 10041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci = endNamespaceDeclHandler; 10051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler; 10061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_ExternalEntityRefHandler oldExternalEntityRefHandler 10071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci = externalEntityRefHandler; 10081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler; 10091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_UnknownEncodingHandler oldUnknownEncodingHandler 10101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci = unknownEncodingHandler; 10111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler; 10121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler; 10131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler; 10141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler; 10151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ELEMENT_TYPE * oldDeclElementType = declElementType; 10161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void *oldUserData = userData; 10181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void *oldHandlerArg = handlerArg; 10191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities; 10201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg; 10211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 10221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing; 10231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int oldInEntityValue = prologState.inEntityValue; 10241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 10251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool oldns_triplets = ns_triplets; 10261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Note that the new parser shares the same hash secret as the old 10271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parser, so that dtdCopy and copyEntityTable can lookup values 10281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci from hash tables associated with either parser without us having 10291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci to worry which hash secrets each table has. 10301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 10311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long oldhash_secret_salt = hash_secret_salt; 10321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 10341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!context) 10351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newDtd = oldDtd; 10361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 10371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Note that the magical uses of the pre-processor to make field 10391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci access look more like C++ require that `parser' be overwritten 10401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci here. This makes this function more painful to follow than it 10411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci would be otherwise. 10421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 10431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ns) { 10441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char tmp[2]; 10451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *tmp = namespaceSeparator; 10461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd); 10471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 10481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 10491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd); 10501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 10511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!parser) 10531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 10541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startElementHandler = oldStartElementHandler; 10561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endElementHandler = oldEndElementHandler; 10571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci characterDataHandler = oldCharacterDataHandler; 10581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processingInstructionHandler = oldProcessingInstructionHandler; 10591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commentHandler = oldCommentHandler; 10601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startCdataSectionHandler = oldStartCdataSectionHandler; 10611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endCdataSectionHandler = oldEndCdataSectionHandler; 10621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci defaultHandler = oldDefaultHandler; 10631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler; 10641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci notationDeclHandler = oldNotationDeclHandler; 10651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startNamespaceDeclHandler = oldStartNamespaceDeclHandler; 10661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endNamespaceDeclHandler = oldEndNamespaceDeclHandler; 10671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci notStandaloneHandler = oldNotStandaloneHandler; 10681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci externalEntityRefHandler = oldExternalEntityRefHandler; 10691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci skippedEntityHandler = oldSkippedEntityHandler; 10701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unknownEncodingHandler = oldUnknownEncodingHandler; 10711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci elementDeclHandler = oldElementDeclHandler; 10721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci attlistDeclHandler = oldAttlistDeclHandler; 10731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entityDeclHandler = oldEntityDeclHandler; 10741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xmlDeclHandler = oldXmlDeclHandler; 10751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declElementType = oldDeclElementType; 10761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci userData = oldUserData; 10771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (oldUserData == oldHandlerArg) 10781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handlerArg = userData; 10791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 10801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handlerArg = parser; 10811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (oldExternalEntityRefHandlerArg != oldParser) 10821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; 10831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci defaultExpandInternalEntities = oldDefaultExpandInternalEntities; 10841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ns_triplets = oldns_triplets; 10851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hash_secret_salt = oldhash_secret_salt; 10861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parentParser = oldParser; 10871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 10881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci paramEntityParsing = oldParamEntityParsing; 10891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prologState.inEntityValue = oldInEntityValue; 10901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (context) { 10911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 10921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!dtdCopy(oldParser, _dtd, oldDtd, &parser->m_mem) 10931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci || !setContext(parser, context)) { 10941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_ParserFree(parser); 10951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 10961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 10971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = externalEntityInitProcessor; 10981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 10991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 11001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 11011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* The DTD instance referenced by _dtd is shared between the document's 11021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root parser and external PE parsers, therefore one does not need to 11031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci call setContext. In addition, one also *must* not call setContext, 11041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci because this would overwrite existing prefix->binding pointers in 11051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci _dtd with ones that get destroyed with the external PE parser. 11061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci This would leave those prefixes with dangling pointers. 11071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 11081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci isParamEntity = XML_TRUE; 11091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlPrologStateInitExternalEntity(&prologState); 11101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = externalParEntInitProcessor; 11111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 11121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 11131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return parser; 11141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 11151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 11161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL 11171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidestroyBindings(BINDING *bindings, XML_Parser parser) 11181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 11191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 11201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BINDING *b = bindings; 11211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!b) 11221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 11231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bindings = b->nextTagBinding; 11241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(b->uri); 11251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(b); 11261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 11271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 11281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 11291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 11301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ParserFree(XML_Parser parser) 11311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 11321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TAG *tagList; 11331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OPEN_INTERNAL_ENTITY *entityList; 11341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (parser == NULL) 11351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 11361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* free tagStack and freeTagList */ 11371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tagList = tagStack; 11381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 11391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TAG *p; 11401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tagList == NULL) { 11411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (freeTagList == NULL) 11421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 11431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tagList = freeTagList; 11441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeTagList = NULL; 11451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 11461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p = tagList; 11471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tagList = tagList->parent; 11481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(p->buf); 11491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci destroyBindings(p->bindings, parser); 11501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(p); 11511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 11521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* free openInternalEntities and freeInternalEntities */ 11531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entityList = openInternalEntities; 11541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 11551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OPEN_INTERNAL_ENTITY *openEntity; 11561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entityList == NULL) { 11571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (freeInternalEntities == NULL) 11581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 11591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entityList = freeInternalEntities; 11601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeInternalEntities = NULL; 11611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 11621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openEntity = entityList; 11631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entityList = entityList->next; 11641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(openEntity); 11651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 11661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 11671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci destroyBindings(freeBindingList, parser); 11681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci destroyBindings(inheritedBindings, parser); 11691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDestroy(&tempPool); 11701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDestroy(&temp2Pool); 11711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 11721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* external parameter entity parsers share the DTD structure 11731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parser->m_dtd with the root parser, so we must not destroy it 11741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 11751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!isParamEntity && _dtd) 11761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 11771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (_dtd) 11781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 11791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem); 11801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE((void *)atts); 11811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO 11821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE((void *)attInfo); 11831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 11841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(groupConnector); 11851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(buffer); 11861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(dataBuf); 11871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(nsAtts); 11881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(unknownEncodingMem); 11891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (unknownEncodingRelease) 11901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unknownEncodingRelease(unknownEncodingData); 11911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(parser); 11921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 11931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 11941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 11951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_UseParserAsHandlerArg(XML_Parser parser) 11961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 11971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handlerArg = parser; 11981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 11991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Error XMLCALL 12011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) 12021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 12031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 12041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* block after XML_Parse()/XML_ParseBuffer() has been called */ 12051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) 12061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING; 12071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci useForeignDTD = useDTD; 12081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 12091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 12101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_FEATURE_REQUIRES_XML_DTD; 12111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 12121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 12151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetReturnNSTriplet(XML_Parser parser, int do_nst) 12161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 12171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* block after XML_Parse()/XML_ParseBuffer() has been called */ 12181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) 12191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 12201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ns_triplets = do_nst ? XML_TRUE : XML_FALSE; 12211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 12241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetUserData(XML_Parser parser, void *p) 12251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 12261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (handlerArg == userData) 12271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handlerArg = userData = p; 12281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 12291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci userData = p; 12301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Status XMLCALL 12331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetBase(XML_Parser parser, const XML_Char *p) 12341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 12351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (p) { 12361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p = poolCopyString(&_dtd->pool, p); 12371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!p) 12381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 12391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci curBase = p; 12401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 12411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 12421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci curBase = NULL; 12431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_OK; 12441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst XML_Char * XMLCALL 12471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetBase(XML_Parser parser) 12481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 12491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return curBase; 12501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint XMLCALL 12531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetSpecifiedAttributeCount(XML_Parser parser) 12541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 12551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return nSpecifiedAtts; 12561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint XMLCALL 12591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetIdAttributeIndex(XML_Parser parser) 12601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 12611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return idAttIndex; 12621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO 12651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst XML_AttrInfo * XMLCALL 12661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetAttributeInfo(XML_Parser parser) 12671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 12681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return attInfo; 12691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 12711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 12731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetElementHandler(XML_Parser parser, 12741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartElementHandler start, 12751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndElementHandler end) 12761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 12771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startElementHandler = start; 12781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endElementHandler = end; 12791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 12821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetStartElementHandler(XML_Parser parser, 12831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartElementHandler start) { 12841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startElementHandler = start; 12851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 12881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetEndElementHandler(XML_Parser parser, 12891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndElementHandler end) { 12901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endElementHandler = end; 12911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 12941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetCharacterDataHandler(XML_Parser parser, 12951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_CharacterDataHandler handler) 12961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 12971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci characterDataHandler = handler; 12981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 13011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetProcessingInstructionHandler(XML_Parser parser, 13021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_ProcessingInstructionHandler handler) 13031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 13041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processingInstructionHandler = handler; 13051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 13081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetCommentHandler(XML_Parser parser, 13091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_CommentHandler handler) 13101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 13111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commentHandler = handler; 13121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 13151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetCdataSectionHandler(XML_Parser parser, 13161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartCdataSectionHandler start, 13171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndCdataSectionHandler end) 13181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 13191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startCdataSectionHandler = start; 13201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endCdataSectionHandler = end; 13211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 13241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetStartCdataSectionHandler(XML_Parser parser, 13251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartCdataSectionHandler start) { 13261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startCdataSectionHandler = start; 13271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 13301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetEndCdataSectionHandler(XML_Parser parser, 13311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndCdataSectionHandler end) { 13321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endCdataSectionHandler = end; 13331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 13361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetDefaultHandler(XML_Parser parser, 13371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_DefaultHandler handler) 13381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 13391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci defaultHandler = handler; 13401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci defaultExpandInternalEntities = XML_FALSE; 13411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 13441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetDefaultHandlerExpand(XML_Parser parser, 13451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_DefaultHandler handler) 13461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 13471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci defaultHandler = handler; 13481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci defaultExpandInternalEntities = XML_TRUE; 13491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 13521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetDoctypeDeclHandler(XML_Parser parser, 13531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartDoctypeDeclHandler start, 13541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndDoctypeDeclHandler end) 13551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 13561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startDoctypeDeclHandler = start; 13571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endDoctypeDeclHandler = end; 13581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 13611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetStartDoctypeDeclHandler(XML_Parser parser, 13621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartDoctypeDeclHandler start) { 13631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startDoctypeDeclHandler = start; 13641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 13671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetEndDoctypeDeclHandler(XML_Parser parser, 13681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndDoctypeDeclHandler end) { 13691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endDoctypeDeclHandler = end; 13701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 13731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetUnparsedEntityDeclHandler(XML_Parser parser, 13741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_UnparsedEntityDeclHandler handler) 13751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 13761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unparsedEntityDeclHandler = handler; 13771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 13801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetNotationDeclHandler(XML_Parser parser, 13811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_NotationDeclHandler handler) 13821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 13831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci notationDeclHandler = handler; 13841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 13871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetNamespaceDeclHandler(XML_Parser parser, 13881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartNamespaceDeclHandler start, 13891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndNamespaceDeclHandler end) 13901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 13911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startNamespaceDeclHandler = start; 13921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endNamespaceDeclHandler = end; 13931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 13961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetStartNamespaceDeclHandler(XML_Parser parser, 13971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_StartNamespaceDeclHandler start) { 13981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startNamespaceDeclHandler = start; 13991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 14021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetEndNamespaceDeclHandler(XML_Parser parser, 14031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EndNamespaceDeclHandler end) { 14041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endNamespaceDeclHandler = end; 14051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 14081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetNotStandaloneHandler(XML_Parser parser, 14091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_NotStandaloneHandler handler) 14101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 14111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci notStandaloneHandler = handler; 14121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 14151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetExternalEntityRefHandler(XML_Parser parser, 14161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_ExternalEntityRefHandler handler) 14171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 14181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci externalEntityRefHandler = handler; 14191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 14221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) 14231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 14241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (arg) 14251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci externalEntityRefHandlerArg = (XML_Parser)arg; 14261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 14271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci externalEntityRefHandlerArg = parser; 14281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 14311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetSkippedEntityHandler(XML_Parser parser, 14321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_SkippedEntityHandler handler) 14331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 14341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci skippedEntityHandler = handler; 14351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 14381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetUnknownEncodingHandler(XML_Parser parser, 14391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_UnknownEncodingHandler handler, 14401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void *data) 14411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 14421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unknownEncodingHandler = handler; 14431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unknownEncodingHandlerData = data; 14441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 14471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetElementDeclHandler(XML_Parser parser, 14481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_ElementDeclHandler eldecl) 14491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 14501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci elementDeclHandler = eldecl; 14511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 14541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetAttlistDeclHandler(XML_Parser parser, 14551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_AttlistDeclHandler attdecl) 14561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 14571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci attlistDeclHandler = attdecl; 14581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 14611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetEntityDeclHandler(XML_Parser parser, 14621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_EntityDeclHandler handler) 14631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 14641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entityDeclHandler = handler; 14651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 14681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetXmlDeclHandler(XML_Parser parser, 14691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_XmlDeclHandler handler) { 14701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xmlDeclHandler = handler; 14711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint XMLCALL 14741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetParamEntityParsing(XML_Parser parser, 14751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_ParamEntityParsing peParsing) 14761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 14771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* block after XML_Parse()/XML_ParseBuffer() has been called */ 14781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) 14791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 14801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 14811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci paramEntityParsing = peParsing; 14821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 1; 14831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 14841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return peParsing == XML_PARAM_ENTITY_PARSING_NEVER; 14851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 14861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint XMLCALL 14891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_SetHashSalt(XML_Parser parser, 14901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long hash_salt) 14911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 14921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* block after XML_Parse()/XML_ParseBuffer() has been called */ 14931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) 14941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 14951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hash_secret_salt = hash_salt; 14961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 1; 14971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Status XMLCALL 15001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Parse(XML_Parser parser, const char *s, int len, int isFinal) 15011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 15021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ps_parsing) { 15031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_SUSPENDED: 15041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_SUSPENDED; 15051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 15061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_FINISHED: 15071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_FINISHED; 15081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 15091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_INITIALIZED: 15101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (parentParser == NULL && !startParsing(parser)) { 15111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_NO_MEMORY; 15121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 15131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 15141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 15151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps_parsing = XML_PARSING; 15161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 15171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 15181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (len == 0) { 15191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps_finalBuffer = (XML_Bool)isFinal; 15201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!isFinal) 15211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_OK; 15221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci positionPtr = bufferPtr; 15231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parseEndPtr = bufferEnd; 15241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 15251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* If data are left over from last buffer, and we now know that these 15261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data are the final chunk of input, then we have to check them again 15271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci to detect errors based on that fact. 15281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 15291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); 15301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 15311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (errorCode == XML_ERROR_NONE) { 15321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ps_parsing) { 15331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_SUSPENDED: 15341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); 15351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci positionPtr = bufferPtr; 15361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_SUSPENDED; 15371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_INITIALIZED: 15381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_PARSING: 15391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps_parsing = XML_FINISHED; 15401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* fall through */ 15411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 15421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_OK; 15431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 15441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 15451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPtr = eventPtr; 15461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = errorProcessor; 15471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 15481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 15491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef XML_CONTEXT_BYTES 15501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (bufferPtr == bufferEnd) { 15511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end; 15521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int nLeftOver; 15531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result; 15541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parseEndByteIndex += len; 15551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci positionPtr = s; 15561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps_finalBuffer = (XML_Bool)isFinal; 15571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 15581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = processor(parser, s, parseEndPtr = s + len, &end); 15591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 15601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (errorCode != XML_ERROR_NONE) { 15611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPtr = eventPtr; 15621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = errorProcessor; 15631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 15641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 15651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 15661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ps_parsing) { 15671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_SUSPENDED: 15681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_STATUS_SUSPENDED; 15691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 15701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_INITIALIZED: 15711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_PARSING: 15721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (isFinal) { 15731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps_parsing = XML_FINISHED; 15741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_OK; 15751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 15761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* fall through */ 15771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 15781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_STATUS_OK; 15791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 15801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 15811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 15821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlUpdatePosition(encoding, positionPtr, end, &position); 15831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nLeftOver = s + len - end; 15841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (nLeftOver) { 15851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (buffer == NULL || nLeftOver > bufferLim - buffer) { 15861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* FIXME avoid integer overflow */ 15871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char *temp; 15881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci temp = (buffer == NULL 15891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ? (char *)MALLOC(len * 2) 15901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : (char *)REALLOC(buffer, len * 2)); 15911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (temp == NULL) { 15921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_NO_MEMORY; 15931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = eventEndPtr = NULL; 15941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = errorProcessor; 15951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 15961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 15971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer = temp; 15981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferLim = buffer + len * 2; 15991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 16001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memcpy(buffer, end, nLeftOver); 16011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 16021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferPtr = buffer; 16031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferEnd = buffer + nLeftOver; 16041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci positionPtr = bufferPtr; 16051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parseEndPtr = bufferEnd; 16061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = bufferPtr; 16071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPtr = bufferPtr; 16081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 16091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 16101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* not defined XML_CONTEXT_BYTES */ 16111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 16121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void *buff = XML_GetBuffer(parser, len); 16131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (buff == NULL) 16141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 16151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 16161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memcpy(buff, s, len); 16171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ParseBuffer(parser, len, isFinal); 16181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 16191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 16201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 16211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 16221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Status XMLCALL 16231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ParseBuffer(XML_Parser parser, int len, int isFinal) 16241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 16251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start; 16261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Status result = XML_STATUS_OK; 16271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 16281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ps_parsing) { 16291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_SUSPENDED: 16301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_SUSPENDED; 16311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 16321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_FINISHED: 16331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_FINISHED; 16341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 16351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_INITIALIZED: 16361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (parentParser == NULL && !startParsing(parser)) { 16371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_NO_MEMORY; 16381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 16391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 16401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 16411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps_parsing = XML_PARSING; 16421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 16431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 16441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci start = bufferPtr; 16451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci positionPtr = start; 16461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferEnd += len; 16471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parseEndPtr = bufferEnd; 16481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parseEndByteIndex += len; 16491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps_finalBuffer = (XML_Bool)isFinal; 16501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 16511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = processor(parser, start, parseEndPtr, &bufferPtr); 16521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 16531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (errorCode != XML_ERROR_NONE) { 16541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPtr = eventPtr; 16551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = errorProcessor; 16561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 16571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 16581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 16591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ps_parsing) { 16601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_SUSPENDED: 16611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_STATUS_SUSPENDED; 16621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 16631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_INITIALIZED: 16641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_PARSING: 16651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (isFinal) { 16661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps_parsing = XML_FINISHED; 16671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 16681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 16691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: ; /* should not happen */ 16701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 16711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 16721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 16731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); 16741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci positionPtr = bufferPtr; 16751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 16761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 16771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 16781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid * XMLCALL 16791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetBuffer(XML_Parser parser, int len) 16801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 16811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ps_parsing) { 16821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_SUSPENDED: 16831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_SUSPENDED; 16841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 16851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_FINISHED: 16861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_FINISHED; 16871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 16881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: ; 16891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 16901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 16911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (len > bufferLim - bufferEnd) { 16921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* FIXME avoid integer overflow */ 16931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int neededSize = len + (int)(bufferEnd - bufferPtr); 16941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_CONTEXT_BYTES 16951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int keep = (int)(bufferPtr - buffer); 16961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 16971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (keep > XML_CONTEXT_BYTES) 16981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci keep = XML_CONTEXT_BYTES; 16991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci neededSize += keep; 17001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* defined XML_CONTEXT_BYTES */ 17011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (neededSize <= bufferLim - buffer) { 17021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_CONTEXT_BYTES 17031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (keep < bufferPtr - buffer) { 17041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int offset = (int)(bufferPtr - buffer) - keep; 17051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep); 17061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferEnd -= offset; 17071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferPtr -= offset; 17081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 17091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 17101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memmove(buffer, bufferPtr, bufferEnd - bufferPtr); 17111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferEnd = buffer + (bufferEnd - bufferPtr); 17121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferPtr = buffer; 17131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* not defined XML_CONTEXT_BYTES */ 17141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 17151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 17161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char *newBuf; 17171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int bufferSize = (int)(bufferLim - bufferPtr); 17181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (bufferSize == 0) 17191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferSize = INIT_BUFFER_SIZE; 17201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci do { 17211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferSize *= 2; 17221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } while (bufferSize < neededSize); 17231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newBuf = (char *)MALLOC(bufferSize); 17241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (newBuf == 0) { 17251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_NO_MEMORY; 17261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 17271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 17281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferLim = newBuf + bufferSize; 17291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_CONTEXT_BYTES 17301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (bufferPtr) { 17311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int keep = (int)(bufferPtr - buffer); 17321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (keep > XML_CONTEXT_BYTES) 17331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci keep = XML_CONTEXT_BYTES; 17341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep); 17351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(buffer); 17361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer = newBuf; 17371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferEnd = buffer + (bufferEnd - bufferPtr) + keep; 17381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferPtr = buffer + keep; 17391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 17401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 17411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferEnd = newBuf + (bufferEnd - bufferPtr); 17421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferPtr = buffer = newBuf; 17431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 17441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 17451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (bufferPtr) { 17461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); 17471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(buffer); 17481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 17491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferEnd = newBuf + (bufferEnd - bufferPtr); 17501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufferPtr = buffer = newBuf; 17511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* not defined XML_CONTEXT_BYTES */ 17521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 17531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = eventEndPtr = NULL; 17541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci positionPtr = NULL; 17551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 17561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return bufferEnd; 17571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 17581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 17591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Status XMLCALL 17601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_StopParser(XML_Parser parser, XML_Bool resumable) 17611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 17621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ps_parsing) { 17631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_SUSPENDED: 17641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (resumable) { 17651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_SUSPENDED; 17661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 17671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 17681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps_parsing = XML_FINISHED; 17691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 17701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_FINISHED: 17711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_FINISHED; 17721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 17731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 17741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (resumable) { 17751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 17761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (isParamEntity) { 17771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_SUSPEND_PE; 17781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 17791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 17801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 17811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps_parsing = XML_SUSPENDED; 17821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 17831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 17841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps_parsing = XML_FINISHED; 17851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 17861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_OK; 17871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 17881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 17891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Status XMLCALL 17901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ResumeParser(XML_Parser parser) 17911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 17921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Status result = XML_STATUS_OK; 17931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 17941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ps_parsing != XML_SUSPENDED) { 17951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = XML_ERROR_NOT_SUSPENDED; 17961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 17971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 17981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps_parsing = XML_PARSING; 17991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 18001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); 18011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 18021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (errorCode != XML_ERROR_NONE) { 18031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPtr = eventPtr; 18041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = errorProcessor; 18051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_STATUS_ERROR; 18061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 18071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 18081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ps_parsing) { 18091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_SUSPENDED: 18101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_STATUS_SUSPENDED; 18111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 18121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_INITIALIZED: 18131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_PARSING: 18141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ps_finalBuffer) { 18151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ps_parsing = XML_FINISHED; 18161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 18171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 18181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: ; 18191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 18201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 18211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 18221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); 18231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci positionPtr = bufferPtr; 18241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 18251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 18261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 18271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 18281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status) 18291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 18301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assert(status != NULL); 18311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *status = parser->m_parsingStatus; 18321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 18331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 18341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum XML_Error XMLCALL 18351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetErrorCode(XML_Parser parser) 18361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 18371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return errorCode; 18381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 18391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 18401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Index XMLCALL 18411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetCurrentByteIndex(XML_Parser parser) 18421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 18431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (eventPtr) 18441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return parseEndByteIndex - (parseEndPtr - eventPtr); 18451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return -1; 18461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 18471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 18481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint XMLCALL 18491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetCurrentByteCount(XML_Parser parser) 18501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 18511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (eventEndPtr && eventPtr) 18521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return (int)(eventEndPtr - eventPtr); 18531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 18541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 18551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 18561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char * XMLCALL 18571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetInputContext(XML_Parser parser, int *offset, int *size) 18581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 18591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_CONTEXT_BYTES 18601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (eventPtr && buffer) { 18611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *offset = (int)(eventPtr - buffer); 18621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *size = (int)(bufferEnd - buffer); 18631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return buffer; 18641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 18651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* defined XML_CONTEXT_BYTES */ 18661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return (char *) 0; 18671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 18681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 18691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Size XMLCALL 18701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetCurrentLineNumber(XML_Parser parser) 18711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 18721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (eventPtr && eventPtr >= positionPtr) { 18731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); 18741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci positionPtr = eventPtr; 18751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 18761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return position.lineNumber + 1; 18771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 18781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 18791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Size XMLCALL 18801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetCurrentColumnNumber(XML_Parser parser) 18811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 18821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (eventPtr && eventPtr >= positionPtr) { 18831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); 18841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci positionPtr = eventPtr; 18851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 18861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return position.columnNumber; 18871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 18881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 18891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 18901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_FreeContentModel(XML_Parser parser, XML_Content *model) 18911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 18921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(model); 18931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 18941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 18951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid * XMLCALL 18961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_MemMalloc(XML_Parser parser, size_t size) 18971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 18981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return MALLOC(size); 18991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 19001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 19011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid * XMLCALL 19021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_MemRealloc(XML_Parser parser, void *ptr, size_t size) 19031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 19041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return REALLOC(ptr, size); 19051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 19061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 19071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 19081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_MemFree(XML_Parser parser, void *ptr) 19091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 19101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(ptr); 19111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 19121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 19131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid XMLCALL 19141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_DefaultCurrent(XML_Parser parser) 19151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 19161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (defaultHandler) { 19171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (openInternalEntities) 19181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, 19191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci internalEncoding, 19201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openInternalEntities->internalEventPtr, 19211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openInternalEntities->internalEventEndPtr); 19221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 19231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, encoding, eventPtr, eventEndPtr); 19241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 19251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 19261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 19271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst XML_LChar * XMLCALL 19281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ErrorString(enum XML_Error code) 19291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 19301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_LChar* const message[] = { 19311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, 19321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("out of memory"), 19331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("syntax error"), 19341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("no element found"), 19351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("not well-formed (invalid token)"), 19361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("unclosed token"), 19371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("partial character"), 19381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("mismatched tag"), 19391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("duplicate attribute"), 19401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("junk after document element"), 19411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("illegal parameter entity reference"), 19421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("undefined entity"), 19431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("recursive entity reference"), 19441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("asynchronous entity"), 19451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("reference to invalid character number"), 19461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("reference to binary entity"), 19471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("reference to external entity in attribute"), 19481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("XML or text declaration not at start of entity"), 19491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("unknown encoding"), 19501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("encoding specified in XML declaration is incorrect"), 19511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("unclosed CDATA section"), 19521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("error in processing external entity reference"), 19531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("document is not standalone"), 19541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("unexpected parser state - please send a bug report"), 19551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("entity declared in parameter entity"), 19561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("requested feature requires XML_DTD support in Expat"), 19571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("cannot change setting once parsing has begun"), 19581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("unbound prefix"), 19591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("must not undeclare prefix"), 19601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("incomplete markup in parameter entity"), 19611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("XML declaration not well-formed"), 19621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("text declaration not well-formed"), 19631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("illegal character(s) in public id"), 19641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("parser suspended"), 19651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("parser not suspended"), 19661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("parsing aborted"), 19671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("parsing finished"), 19681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("cannot suspend in external parameter entity"), 19691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("reserved prefix (xml) must not be undeclared or bound to another namespace name"), 19701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("reserved prefix (xmlns) must not be declared or undeclared"), 19711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_L("prefix must not be bound to one of the reserved namespace names") 19721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 19731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (code > 0 && code < sizeof(message)/sizeof(message[0])) 19741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return message[code]; 19751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 19761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 19771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 19781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst XML_LChar * XMLCALL 19791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ExpatVersion(void) { 19801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 19811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* V1 is used to string-ize the version number. However, it would 19821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci string-ize the actual version macro *names* unless we get them 19831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci substituted before being passed to V1. CPP is defined to expand 19841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a macro, then rescan for more expansions. Thus, we use V2 to expand 19851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci the version macros, then CPP will expand the resulting V1() macro 19861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci with the correct numerals. */ 19871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* ### I'm assuming cpp is portable in this respect... */ 19881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 19891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c) 19901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define V2(a,b,c) XML_L("expat_")V1(a,b,c) 19911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 19921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION); 19931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 19941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef V1 19951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef V2 19961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 19971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 19981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_Expat_Version XMLCALL 19991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_ExpatVersionInfo(void) 20001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 20011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Expat_Version version; 20021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 20031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci version.major = XML_MAJOR_VERSION; 20041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci version.minor = XML_MINOR_VERSION; 20051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci version.micro = XML_MICRO_VERSION; 20061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 20071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return version; 20081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 20091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 20101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst XML_Feature * XMLCALL 20111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciXML_GetFeatureList(void) 20121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 20131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Feature features[] = { 20141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"), 20151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(XML_Char)}, 20161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"), 20171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(XML_LChar)}, 20181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_UNICODE 20191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0}, 20201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 20211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_UNICODE_WCHAR_T 20221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0}, 20231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 20241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 20251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {XML_FEATURE_DTD, XML_L("XML_DTD"), 0}, 20261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 20271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_CONTEXT_BYTES 20281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), 20291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_CONTEXT_BYTES}, 20301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 20311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_MIN_SIZE 20321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, 20331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 20341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_NS 20351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {XML_FEATURE_NS, XML_L("XML_NS"), 0}, 20361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 20371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_LARGE_SIZE 20381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0}, 20391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 20401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO 20411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0}, 20421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 20431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {XML_FEATURE_END, NULL, 0} 20441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 20451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 20461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return features; 20471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 20481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 20491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Initially tag->rawName always points into the parse buffer; 20501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for those TAG instances opened while the current parse buffer was 20511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processed, and not yet closed, we need to store tag->rawName in a more 20521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci permanent location, since the parse buffer is about to be discarded. 20531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/ 20541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool 20551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistoreRawNames(XML_Parser parser) 20561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 20571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TAG *tag = tagStack; 20581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (tag) { 20591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int bufSize; 20601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1); 20611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char *rawNameBuf = tag->buf + nameLen; 20621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Stop if already stored. Since tagStack is a stack, we can stop 20631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci at the first entry that has already been copied; everything 20641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci below it in the stack is already been accounted for in a 20651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci previous call to this function. 20661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 20671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tag->rawName == rawNameBuf) 20681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 20691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* For re-use purposes we need to ensure that the 20701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size of tag->buf is a multiple of sizeof(XML_Char). 20711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 20721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)); 20731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (bufSize > tag->bufEnd - tag->buf) { 20741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char *temp = (char *)REALLOC(tag->buf, bufSize); 20751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (temp == NULL) 20761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_FALSE; 20771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* if tag->name.str points to tag->buf (only when namespace 20781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processing is off) then we have to update it 20791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 20801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tag->name.str == (XML_Char *)tag->buf) 20811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->name.str = (XML_Char *)temp; 20821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* if tag->name.localPart is set (when namespace processing is on) 20831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci then update it as well, since it will always point into tag->buf 20841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 20851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tag->name.localPart) 20861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->name.localPart = (XML_Char *)temp + (tag->name.localPart - 20871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (XML_Char *)tag->buf); 20881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->buf = temp; 20891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->bufEnd = temp + bufSize; 20901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rawNameBuf = temp + nameLen; 20911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 20921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memcpy(rawNameBuf, tag->rawName, tag->rawNameLength); 20931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->rawName = rawNameBuf; 20941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag = tag->parent; 20951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 20961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_TRUE; 20971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 20981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 20991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 21001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccicontentProcessor(XML_Parser parser, 21011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start, 21021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 21031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **endPtr) 21041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 21051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = doContent(parser, 0, encoding, start, end, 21061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endPtr, (XML_Bool)!ps_finalBuffer); 21071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result == XML_ERROR_NONE) { 21081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!storeRawNames(parser)) 21091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 21101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 21111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 21121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 21131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 21151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciexternalEntityInitProcessor(XML_Parser parser, 21161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start, 21171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 21181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **endPtr) 21191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 21201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = initializeEncoding(parser); 21211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 21221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 21231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = externalEntityInitProcessor2; 21241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return externalEntityInitProcessor2(parser, start, end, endPtr); 21251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 21261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 21281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciexternalEntityInitProcessor2(XML_Parser parser, 21291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start, 21301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 21311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **endPtr) 21321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 21331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next = start; /* XmlContentTok doesn't always set the last arg */ 21341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok = XmlContentTok(encoding, start, end, &next); 21351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (tok) { 21361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_BOM: 21371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* If we are at the end of the buffer, this would cause the next stage, 21381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i.e. externalEntityInitProcessor3, to pass control directly to 21391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci doContent (by detecting XML_TOK_NONE) without processing any xml text 21401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent. 21411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 21421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (next == end && !ps_finalBuffer) { 21431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *endPtr = next; 21441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 21451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 21461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci start = next; 21471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 21481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL: 21491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ps_finalBuffer) { 21501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *endPtr = start; 21511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 21521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 21531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = start; 21541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNCLOSED_TOKEN; 21551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL_CHAR: 21561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ps_finalBuffer) { 21571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *endPtr = start; 21581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 21591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 21601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = start; 21611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_PARTIAL_CHAR; 21621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 21631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = externalEntityInitProcessor3; 21641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return externalEntityInitProcessor3(parser, start, end, endPtr); 21651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 21661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 21681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciexternalEntityInitProcessor3(XML_Parser parser, 21691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start, 21701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 21711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **endPtr) 21721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 21731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok; 21741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next = start; /* XmlContentTok doesn't always set the last arg */ 21751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = start; 21761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tok = XmlContentTok(encoding, start, end, &next); 21771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPtr = next; 21781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (tok) { 21801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_XML_DECL: 21811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 21821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result; 21831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = processXmlDecl(parser, 1, start, next); 21841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 21851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 21861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ps_parsing) { 21871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_SUSPENDED: 21881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *endPtr = next; 21891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 21901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_FINISHED: 21911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ABORTED; 21921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 21931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci start = next; 21941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 21951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 21961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 21971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL: 21981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ps_finalBuffer) { 21991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *endPtr = start; 22001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 22011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 22021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNCLOSED_TOKEN; 22031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL_CHAR: 22041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ps_finalBuffer) { 22051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *endPtr = start; 22061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 22071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 22081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_PARTIAL_CHAR; 22091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 22101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = externalEntityContentProcessor; 22111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tagLevel = 1; 22121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return externalEntityContentProcessor(parser, start, end, endPtr); 22131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 22141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 22151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 22161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciexternalEntityContentProcessor(XML_Parser parser, 22171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start, 22181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 22191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **endPtr) 22201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 22211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = doContent(parser, 1, encoding, start, end, 22221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endPtr, (XML_Bool)!ps_finalBuffer); 22231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result == XML_ERROR_NONE) { 22241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!storeRawNames(parser)) 22251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 22261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 22271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 22281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 22291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 22301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 22311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoContent(XML_Parser parser, 22321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int startTagLevel, 22331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ENCODING *enc, 22341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s, 22351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 22361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **nextPtr, 22371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool haveMore) 22381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 22391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* save one level of indirection */ 22401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD * const dtd = _dtd; 22411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 22421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **eventPP; 22431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **eventEndPP; 22441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) { 22451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPP = &eventPtr; 22461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPP = &eventEndPtr; 22471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 22481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 22491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPP = &(openInternalEntities->internalEventPtr); 22501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPP = &(openInternalEntities->internalEventEndPtr); 22511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 22521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = s; 22531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 22541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 22551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next = s; /* XmlContentTok doesn't always set the last arg */ 22561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok = XmlContentTok(enc, s, end, &next); 22571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = next; 22581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (tok) { 22591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_TRAILING_CR: 22601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (haveMore) { 22611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 22621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 22631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 22641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = end; 22651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (characterDataHandler) { 22661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char c = 0xA; 22671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci characterDataHandler(handlerArg, &c, 1); 22681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 22691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 22701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, end); 22711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* We are at the end of the final buffer, should we check for 22721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_SUSPENDED, XML_FINISHED? 22731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 22741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (startTagLevel == 0) 22751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_ELEMENTS; 22761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tagLevel != startTagLevel) 22771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ASYNC_ENTITY; 22781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = end; 22791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 22801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_NONE: 22811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (haveMore) { 22821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 22831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 22841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 22851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (startTagLevel > 0) { 22861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tagLevel != startTagLevel) 22871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ASYNC_ENTITY; 22881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 22891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 22901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 22911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_ELEMENTS; 22921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_INVALID: 22931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = next; 22941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_INVALID_TOKEN; 22951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL: 22961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (haveMore) { 22971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 22981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 22991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 23001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNCLOSED_TOKEN; 23011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL_CHAR: 23021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (haveMore) { 23031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 23041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 23051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 23061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_PARTIAL_CHAR; 23071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_ENTITY_REF: 23081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 23091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name; 23101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ENTITY *entity; 23111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, 23121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s + enc->minBytesPerChar, 23131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next - enc->minBytesPerChar); 23141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ch) { 23151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (characterDataHandler) 23161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci characterDataHandler(handlerArg, &ch, 1); 23171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 23181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 23191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 23201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 23211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci name = poolStoreString(&dtd->pool, enc, 23221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s + enc->minBytesPerChar, 23231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next - enc->minBytesPerChar); 23241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!name) 23251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 23261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); 23271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&dtd->pool); 23281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* First, determine if a check for an existing declaration is needed; 23291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if yes, check that the entity exists, and that it is internal, 23301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci otherwise call the skipped entity or default handler. 23311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 23321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!dtd->hasParamEntityRefs || dtd->standalone) { 23331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!entity) 23341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNDEFINED_ENTITY; 23351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (!entity->is_internal) 23361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ENTITY_DECLARED_IN_PE; 23371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 23381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (!entity) { 23391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (skippedEntityHandler) 23401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci skippedEntityHandler(handlerArg, name, 0); 23411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 23421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 23431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 23441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 23451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entity->open) 23461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_RECURSIVE_ENTITY_REF; 23471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entity->notation) 23481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_BINARY_ENTITY_REF; 23491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entity->textPtr) { 23501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result; 23511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!defaultExpandInternalEntities) { 23521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (skippedEntityHandler) 23531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci skippedEntityHandler(handlerArg, entity->name, 0); 23541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 23551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 23561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 23571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 23581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = processInternalEntity(parser, entity, XML_FALSE); 23591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 23601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 23611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 23621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (externalEntityRefHandler) { 23631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *context; 23641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_TRUE; 23651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context = getContext(parser); 23661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_FALSE; 23671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!context) 23681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 23691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!externalEntityRefHandler(externalEntityRefHandlerArg, 23701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context, 23711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->base, 23721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->systemId, 23731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->publicId)) 23741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_EXTERNAL_ENTITY_HANDLING; 23751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&tempPool); 23761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 23771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 23781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 23791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 23801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 23811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_START_TAG_NO_ATTS: 23821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* fall through */ 23831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_START_TAG_WITH_ATTS: 23841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 23851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TAG *tag; 23861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result; 23871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *toPtr; 23881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (freeTagList) { 23891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag = freeTagList; 23901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeTagList = freeTagList->parent; 23911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 23921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 23931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag = (TAG *)MALLOC(sizeof(TAG)); 23941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!tag) 23951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 23961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE); 23971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!tag->buf) { 23981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(tag); 23991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 24001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 24011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; 24021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 24031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->bindings = NULL; 24041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->parent = tagStack; 24051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tagStack = tag; 24061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->name.localPart = NULL; 24071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->name.prefix = NULL; 24081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->rawName = s + enc->minBytesPerChar; 24091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->rawNameLength = XmlNameLength(enc, tag->rawName); 24101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++tagLevel; 24111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 24121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *rawNameEnd = tag->rawName + tag->rawNameLength; 24131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *fromPtr = tag->rawName; 24141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci toPtr = (XML_Char *)tag->buf; 24151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 24161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int bufSize; 24171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int convLen; 24181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlConvert(enc, 24191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &fromPtr, rawNameEnd, 24201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); 24211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci convLen = (int)(toPtr - (XML_Char *)tag->buf); 24221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (fromPtr == rawNameEnd) { 24231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->name.strLen = convLen; 24241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 24251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 24261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bufSize = (int)(tag->bufEnd - tag->buf) << 1; 24271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 24281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char *temp = (char *)REALLOC(tag->buf, bufSize); 24291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (temp == NULL) 24301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 24311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->buf = temp; 24321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->bufEnd = temp + bufSize; 24331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci toPtr = (XML_Char *)temp + convLen; 24341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 24351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 24361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 24371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->name.str = (XML_Char *)tag->buf; 24381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *toPtr = XML_T('\0'); 24391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); 24401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result) 24411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 24421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (startElementHandler) 24431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startElementHandler(handlerArg, tag->name.str, 24441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (const XML_Char **)atts); 24451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 24461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 24471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&tempPool); 24481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 24491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 24501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_EMPTY_ELEMENT_NO_ATTS: 24511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* fall through */ 24521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: 24531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 24541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *rawName = s + enc->minBytesPerChar; 24551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result; 24561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BINDING *bindings = NULL; 24571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool noElmHandlers = XML_TRUE; 24581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TAG_NAME name; 24591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci name.str = poolStoreString(&tempPool, enc, rawName, 24601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rawName + XmlNameLength(enc, rawName)); 24611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!name.str) 24621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 24631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&tempPool); 24641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = storeAtts(parser, enc, s, &name, &bindings); 24651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result) 24661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 24671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&tempPool); 24681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (startElementHandler) { 24691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startElementHandler(handlerArg, name.str, (const XML_Char **)atts); 24701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci noElmHandlers = XML_FALSE; 24711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 24721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (endElementHandler) { 24731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (startElementHandler) 24741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = *eventEndPP; 24751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endElementHandler(handlerArg, name.str); 24761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci noElmHandlers = XML_FALSE; 24771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 24781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (noElmHandlers && defaultHandler) 24791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 24801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&tempPool); 24811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (bindings) { 24821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BINDING *b = bindings; 24831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (endNamespaceDeclHandler) 24841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endNamespaceDeclHandler(handlerArg, b->prefix->name); 24851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bindings = bindings->nextTagBinding; 24861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->nextTagBinding = freeBindingList; 24871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeBindingList = b; 24881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->prefix->binding = b->prevPrefixBinding; 24891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 24901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 24911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tagLevel == 0) 24921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return epilogProcessor(parser, next, end, nextPtr); 24931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 24941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_END_TAG: 24951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tagLevel == startTagLevel) 24961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ASYNC_ENTITY; 24971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 24981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int len; 24991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *rawName; 25001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TAG *tag = tagStack; 25011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tagStack = tag->parent; 25021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->parent = freeTagList; 25031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeTagList = tag; 25041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rawName = s + enc->minBytesPerChar*2; 25051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci len = XmlNameLength(enc, rawName); 25061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (len != tag->rawNameLength 25071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci || memcmp(tag->rawName, rawName, len) != 0) { 25081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = rawName; 25091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_TAG_MISMATCH; 25101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 25111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci --tagLevel; 25121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (endElementHandler) { 25131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *localPart; 25141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *prefix; 25151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *uri; 25161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci localPart = tag->name.localPart; 25171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ns && localPart) { 25181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* localPart and prefix may have been overwritten in 25191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->name.str, since this points to the binding->uri 25201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer which gets re-used; so we have to add them again 25211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 25221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uri = (XML_Char *)tag->name.str + tag->name.uriLen; 25231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* don't need to check for space - already done in storeAtts() */ 25241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (*localPart) *uri++ = *localPart++; 25251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefix = (XML_Char *)tag->name.prefix; 25261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ns_triplets && prefix) { 25271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *uri++ = namespaceSeparator; 25281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (*prefix) *uri++ = *prefix++; 25291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 25301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *uri = XML_T('\0'); 25311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 25321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endElementHandler(handlerArg, tag->name.str); 25331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 25341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 25351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 25361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (tag->bindings) { 25371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BINDING *b = tag->bindings; 25381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (endNamespaceDeclHandler) 25391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endNamespaceDeclHandler(handlerArg, b->prefix->name); 25401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tag->bindings = tag->bindings->nextTagBinding; 25411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->nextTagBinding = freeBindingList; 25421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeBindingList = b; 25431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->prefix->binding = b->prevPrefixBinding; 25441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 25451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tagLevel == 0) 25461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return epilogProcessor(parser, next, end, nextPtr); 25471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 25481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 25491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_CHAR_REF: 25501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 25511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int n = XmlCharRefNumber(enc, s); 25521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (n < 0) 25531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_BAD_CHAR_REF; 25541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (characterDataHandler) { 25551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char buf[XML_ENCODE_MAX]; 25561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf)); 25571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 25581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 25591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 25601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 25611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 25621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_XML_DECL: 25631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_MISPLACED_XML_PI; 25641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_DATA_NEWLINE: 25651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (characterDataHandler) { 25661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char c = 0xA; 25671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci characterDataHandler(handlerArg, &c, 1); 25681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 25691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 25701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 25711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 25721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_CDATA_SECT_OPEN: 25731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 25741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result; 25751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (startCdataSectionHandler) 25761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startCdataSectionHandler(handlerArg); 25771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if 0 25781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Suppose you doing a transformation on a document that involves 25791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci changing only the character data. You set up a defaultHandler 25801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci and a characterDataHandler. The defaultHandler simply copies 25811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci characters through. The characterDataHandler does the 25821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transformation and writes the characters out escaping them as 25831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci necessary. This case will fail to work if we leave out the 25841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci following two lines (because & and < inside CDATA sections will 25851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci be incorrectly escaped). 25861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 25871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci However, now we have a start/endCdataSectionHandler, so it seems 25881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci easier to let the user deal with this. 25891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 25901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (characterDataHandler) 25911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci characterDataHandler(handlerArg, dataBuf, 0); 25921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 25931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 25941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 25951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore); 25961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 25971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 25981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (!next) { 25991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = cdataSectionProcessor; 26001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 26011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 26041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_TRAILING_RSQB: 26051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (haveMore) { 26061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 26071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 26081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (characterDataHandler) { 26101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (MUST_CONVERT(enc, s)) { 26111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ICHAR *dataPtr = (ICHAR *)dataBuf; 26121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); 26131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci characterDataHandler(handlerArg, dataBuf, 26141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (int)(dataPtr - (ICHAR *)dataBuf)); 26151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 26171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci characterDataHandler(handlerArg, 26181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (XML_Char *)s, 26191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (int)((XML_Char *)end - (XML_Char *)s)); 26201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 26221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, end); 26231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* We are at the end of the final buffer, should we check for 26241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_SUSPENDED, XML_FINISHED? 26251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 26261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (startTagLevel == 0) { 26271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = end; 26281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_ELEMENTS; 26291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tagLevel != startTagLevel) { 26311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = end; 26321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ASYNC_ENTITY; 26331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = end; 26351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 26361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_DATA_CHARS: 26371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 26381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_CharacterDataHandler charDataHandler = characterDataHandler; 26391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (charDataHandler) { 26401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (MUST_CONVERT(enc, s)) { 26411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 26421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ICHAR *dataPtr = (ICHAR *)dataBuf; 26431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); 26441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = s; 26451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci charDataHandler(handlerArg, dataBuf, 26461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (int)(dataPtr - (ICHAR *)dataBuf)); 26471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (s == next) 26481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 26491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = s; 26501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 26531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci charDataHandler(handlerArg, 26541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (XML_Char *)s, 26551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (int)((XML_Char *)next - (XML_Char *)s)); 26561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 26581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 26591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 26611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PI: 26621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!reportProcessingInstruction(parser, enc, s, next)) 26631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 26641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 26651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_COMMENT: 26661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!reportComment(parser, enc, s, next)) 26671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 26681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 26691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 26701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (defaultHandler) 26711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 26721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 26731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = s = next; 26751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ps_parsing) { 26761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_SUSPENDED: 26771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = next; 26781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 26791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_FINISHED: 26801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ABORTED; 26811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: ; 26821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* not reached */ 26851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 26861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 26871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Precondition: all arguments must be non-NULL; 26881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Purpose: 26891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci - normalize attributes 26901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci - check attributes for well-formedness 26911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci - generate namespace aware attribute names (URI, prefix) 26921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci - build list of attributes for startElementHandler 26931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci - default attributes 26941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci - process namespace declarations (check and report them) 26951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci - generate namespace aware element name (URI, prefix) 26961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/ 26971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 26981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistoreAtts(XML_Parser parser, const ENCODING *enc, 26991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *attStr, TAG_NAME *tagNamePtr, 27001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BINDING **bindingsPtr) 27011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 27021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD * const dtd = _dtd; /* save one level of indirection */ 27031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ELEMENT_TYPE *elementType; 27041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int nDefaultAtts; 27051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char **appAtts; /* the attribute list for the application */ 27061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int attIndex = 0; 27071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int prefixLen; 27081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int i; 27091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int n; 27101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *uri; 27111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int nPrefixes = 0; 27121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BINDING *binding; 27131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *localPart; 27141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 27151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* lookup the element type name */ 27161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str,0); 27171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!elementType) { 27181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); 27191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!name) 27201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 27211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name, 27221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(ELEMENT_TYPE)); 27231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!elementType) 27241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 27251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ns && !setElementTypePrefix(parser, elementType)) 27261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 27271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 27281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nDefaultAtts = elementType->nDefaultAtts; 27291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 27301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* get the attributes from the tokenizer */ 27311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci n = XmlGetAttributes(enc, attStr, attsSize, atts); 27321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (n + nDefaultAtts > attsSize) { 27331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int oldAttsSize = attsSize; 27341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ATTRIBUTE *temp; 27351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO 27361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_AttrInfo *temp2; 27371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 27381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; 27391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); 27401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (temp == NULL) 27411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 27421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci atts = temp; 27431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO 27441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci temp2 = (XML_AttrInfo *)REALLOC((void *)attInfo, attsSize * sizeof(XML_AttrInfo)); 27451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (temp2 == NULL) 27461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 27471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci attInfo = temp2; 27481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 27491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (n > oldAttsSize) 27501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlGetAttributes(enc, attStr, n, atts); 27511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 27521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 27531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci appAtts = (const XML_Char **)atts; 27541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; i < n; i++) { 27551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ATTRIBUTE *currAtt = &atts[i]; 27561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO 27571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_AttrInfo *currAttInfo = &attInfo[i]; 27581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 27591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* add the name and value to the attribute list */ 27601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name, 27611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci currAtt->name 27621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci + XmlNameLength(enc, currAtt->name)); 27631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!attId) 27641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 27651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_ATTR_INFO 27661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci currAttInfo->nameStart = parseEndByteIndex - (parseEndPtr - currAtt->name); 27671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci currAttInfo->nameEnd = currAttInfo->nameStart + 27681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlNameLength(enc, currAtt->name); 27691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci currAttInfo->valueStart = parseEndByteIndex - 27701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (parseEndPtr - currAtt->valuePtr); 27711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci currAttInfo->valueEnd = parseEndByteIndex - (parseEndPtr - currAtt->valueEnd); 27721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 27731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Detect duplicate attributes by their QNames. This does not work when 27741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci namespace processing is turned on and different prefixes for the same 27751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci namespace are used. For this case we have a check further down. 27761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 27771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if ((attId->name)[-1]) { 27781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 27791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = atts[i].name; 27801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_DUPLICATE_ATTRIBUTE; 27811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 27821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (attId->name)[-1] = 1; 27831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci appAtts[attIndex++] = attId->name; 27841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!atts[i].normalized) { 27851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result; 27861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool isCdata = XML_TRUE; 27871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 27881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* figure out whether declared as other than CDATA */ 27891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (attId->maybeTokenized) { 27901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int j; 27911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (j = 0; j < nDefaultAtts; j++) { 27921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (attId == elementType->defaultAtts[j].id) { 27931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci isCdata = elementType->defaultAtts[j].isCdata; 27941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 27951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 27961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 27971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 27981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 27991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* normalize the attribute value */ 28001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = storeAttributeValue(parser, enc, isCdata, 28011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci atts[i].valuePtr, atts[i].valueEnd, 28021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &tempPool); 28031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result) 28041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 28051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci appAtts[attIndex] = poolStart(&tempPool); 28061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&tempPool); 28071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 28091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* the value did not need normalizing */ 28101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr, 28111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci atts[i].valueEnd); 28121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (appAtts[attIndex] == 0) 28131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 28141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&tempPool); 28151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* handle prefixed attribute names */ 28171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (attId->prefix) { 28181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (attId->xmlns) { 28191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* deal with namespace declarations here */ 28201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = addBinding(parser, attId->prefix, attId, 28211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci appAtts[attIndex], bindingsPtr); 28221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result) 28231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 28241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci --attIndex; 28251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 28271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* deal with other prefixed names later */ 28281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci attIndex++; 28291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nPrefixes++; 28301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (attId->name)[-1] = 2; 28311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 28341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci attIndex++; 28351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 28371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* set-up for XML_GetSpecifiedAttributeCount and XML_GetIdAttributeIndex */ 28381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nSpecifiedAtts = attIndex; 28391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (elementType->idAtt && (elementType->idAtt->name)[-1]) { 28401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; i < attIndex; i += 2) 28411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (appAtts[i] == elementType->idAtt->name) { 28421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci idAttIndex = i; 28431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 28441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 28471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci idAttIndex = -1; 28481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 28491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* do attribute defaulting */ 28501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; i < nDefaultAtts; i++) { 28511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i; 28521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!(da->id->name)[-1] && da->value) { 28531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (da->id->prefix) { 28541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (da->id->xmlns) { 28551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = addBinding(parser, da->id->prefix, da->id, 28561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci da->value, bindingsPtr); 28571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result) 28581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 28591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 28611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (da->id->name)[-1] = 2; 28621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nPrefixes++; 28631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci appAtts[attIndex++] = da->id->name; 28641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci appAtts[attIndex++] = da->value; 28651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 28681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (da->id->name)[-1] = 1; 28691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci appAtts[attIndex++] = da->id->name; 28701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci appAtts[attIndex++] = da->value; 28711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci appAtts[attIndex] = 0; 28751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 28761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* expand prefixed attribute names, check for duplicates, 28771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci and clear flags that say whether attributes were specified */ 28781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i = 0; 28791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (nPrefixes) { 28801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int j; /* hash table index */ 28811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long version = nsAttsVersion; 28821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int nsAttsSize = (int)1 << nsAttsPower; 28831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* size of hash table must be at least 2 * (# of prefixed attributes) */ 28841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if ((nPrefixes << 1) >> nsAttsPower) { /* true for nsAttsPower = 0 */ 28851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NS_ATT *temp; 28861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* hash table size must also be a power of 2 and >= 8 */ 28871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (nPrefixes >> nsAttsPower++); 28881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (nsAttsPower < 3) 28891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nsAttsPower = 3; 28901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nsAttsSize = (int)1 << nsAttsPower; 28911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci temp = (NS_ATT *)REALLOC(nsAtts, nsAttsSize * sizeof(NS_ATT)); 28921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!temp) 28931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 28941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nsAtts = temp; 28951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci version = 0; /* force re-initialization of nsAtts hash table */ 28961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 28971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* using a version flag saves us from initializing nsAtts every time */ 28981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!version) { /* initialize version flags when version wraps around */ 28991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci version = INIT_ATTS_VERSION; 29001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (j = nsAttsSize; j != 0; ) 29011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nsAtts[--j].version = version; 29021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 29031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nsAttsVersion = --version; 29041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 29051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* expand prefixed names and check for duplicates */ 29061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (; i < attIndex; i += 2) { 29071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *s = appAtts[i]; 29081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (s[-1] == 2) { /* prefixed */ 29091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ATTRIBUTE_ID *id; 29101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BINDING *b; 29111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long uriHash = hash_secret_salt; 29121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ((XML_Char *)s)[-1] = 0; /* clear flag */ 29131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0); 29141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b = id->prefix->binding; 29151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!b) 29161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNBOUND_PREFIX; 29171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 29181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* as we expand the name we also calculate its hash value */ 29191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (j = 0; j < b->uriLen; j++) { 29201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char c = b->uri[j]; 29211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, c)) 29221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 29231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uriHash = CHAR_HASH(uriHash, c); 29241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 29251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (*s++ != XML_T(ASCII_COLON)) 29261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ; 29271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci do { /* copies null terminator */ 29281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char c = *s; 29291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, *s)) 29301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 29311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uriHash = CHAR_HASH(uriHash, c); 29321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } while (*s++); 29331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 29341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { /* Check hash table for duplicate of expanded name (uriName). 29351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Derived from code in lookup(parser, HASH_TABLE *table, ...). 29361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 29371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned char step = 0; 29381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long mask = nsAttsSize - 1; 29391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci j = uriHash & mask; /* index into hash table */ 29401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (nsAtts[j].version == version) { 29411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* for speed we compare stored hash values first */ 29421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (uriHash == nsAtts[j].hash) { 29431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *s1 = poolStart(&tempPool); 29441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *s2 = nsAtts[j].uriName; 29451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* s1 is null terminated, but not s2 */ 29461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (; *s1 == *s2 && *s1 != 0; s1++, s2++); 29471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (*s1 == 0) 29481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_DUPLICATE_ATTRIBUTE; 29491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 29501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!step) 29511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci step = PROBE_STEP(uriHash, mask, nsAttsPower); 29521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci j < step ? (j += nsAttsSize - step) : (j -= step); 29531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 29541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 29551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 29561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ns_triplets) { /* append namespace separator and prefix */ 29571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tempPool.ptr[-1] = namespaceSeparator; 29581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s = b->prefix->name; 29591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci do { 29601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, *s)) 29611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 29621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } while (*s++); 29631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 29641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 29651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* store expanded name in attribute list */ 29661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s = poolStart(&tempPool); 29671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&tempPool); 29681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci appAtts[i] = s; 29691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 29701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* fill empty slot with new version, uriName and hash value */ 29711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nsAtts[j].version = version; 29721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nsAtts[j].hash = uriHash; 29731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nsAtts[j].uriName = s; 29741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 29751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!--nPrefixes) { 29761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i += 2; 29771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 29781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 29791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 29801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else /* not prefixed */ 29811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ((XML_Char *)s)[-1] = 0; /* clear flag */ 29821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 29831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 29841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* clear flags for the remaining attributes */ 29851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (; i < attIndex; i += 2) 29861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ((XML_Char *)(appAtts[i]))[-1] = 0; 29871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding) 29881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci binding->attId->name[-1] = 0; 29891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 29901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ns) 29911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 29921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 29931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* expand the element type name */ 29941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (elementType->prefix) { 29951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci binding = elementType->prefix->binding; 29961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!binding) 29971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNBOUND_PREFIX; 29981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci localPart = tagNamePtr->str; 29991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (*localPart++ != XML_T(ASCII_COLON)) 30001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ; 30011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 30021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (dtd->defaultPrefix.binding) { 30031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci binding = dtd->defaultPrefix.binding; 30041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci localPart = tagNamePtr->str; 30051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 30061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 30071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 30081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefixLen = 0; 30091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ns_triplets && binding->prefix->name) { 30101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (; binding->prefix->name[prefixLen++];) 30111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ; /* prefixLen includes null terminator */ 30121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 30131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tagNamePtr->localPart = localPart; 30141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tagNamePtr->uriLen = binding->uriLen; 30151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tagNamePtr->prefix = binding->prefix->name; 30161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tagNamePtr->prefixLen = prefixLen; 30171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; localPart[i++];) 30181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ; /* i includes null terminator */ 30191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci n = i + binding->uriLen + prefixLen; 30201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (n > binding->uriAlloc) { 30211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TAG *p; 30221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char)); 30231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!uri) 30241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 30251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci binding->uriAlloc = n + EXPAND_SPARE; 30261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char)); 30271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (p = tagStack; p; p = p->parent) 30281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (p->name.str == binding->uri) 30291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->name.str = uri; 30301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(binding->uri); 30311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci binding->uri = uri; 30321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 30331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* if namespaceSeparator != '\0' then uri includes it already */ 30341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uri = binding->uri + binding->uriLen; 30351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memcpy(uri, localPart, i * sizeof(XML_Char)); 30361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* we always have a namespace separator between localPart and prefix */ 30371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (prefixLen) { 30381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uri += i - 1; 30391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *uri = namespaceSeparator; /* replace null terminator */ 30401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char)); 30411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 30421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tagNamePtr->str = binding->uri; 30431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 30441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 30451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 30461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* addBinding() overwrites the value of prefix->binding without checking. 30471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Therefore one must keep track of the old value outside of addBinding(). 30481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/ 30491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 30501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciaddBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, 30511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *uri, BINDING **bindingsPtr) 30521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 30531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Char xmlNamespace[] = { 30541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, 30551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, 30561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, 30571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH, 30581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c, 30591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_e, '\0' 30601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 30611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const int xmlLen = 30621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1; 30631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Char xmlnsNamespace[] = { 30641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, 30651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, 30661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0, 30671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s, 30681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_SLASH, '\0' 30691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 30701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const int xmlnsLen = 30711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1; 30721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 30731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool mustBeXML = XML_FALSE; 30741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool isXML = XML_TRUE; 30751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool isXMLNS = XML_TRUE; 30761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 30771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BINDING *b; 30781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int len; 30791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 30801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* empty URI is only valid for default namespace per XML NS 1.0 (not 1.1) */ 30811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (*uri == XML_T('\0') && prefix->name) 30821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNDECLARING_PREFIX; 30831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 30841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (prefix->name 30851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && prefix->name[0] == XML_T(ASCII_x) 30861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && prefix->name[1] == XML_T(ASCII_m) 30871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && prefix->name[2] == XML_T(ASCII_l)) { 30881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 30891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Not allowed to bind xmlns */ 30901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (prefix->name[3] == XML_T(ASCII_n) 30911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && prefix->name[4] == XML_T(ASCII_s) 30921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && prefix->name[5] == XML_T('\0')) 30931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_RESERVED_PREFIX_XMLNS; 30941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 30951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (prefix->name[3] == XML_T('\0')) 30961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mustBeXML = XML_TRUE; 30971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 30981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 30991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (len = 0; uri[len]; len++) { 31001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len])) 31011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci isXML = XML_FALSE; 31021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 31031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!mustBeXML && isXMLNS 31041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && (len > xmlnsLen || uri[len] != xmlnsNamespace[len])) 31051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci isXMLNS = XML_FALSE; 31061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 31071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci isXML = isXML && len == xmlLen; 31081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci isXMLNS = isXMLNS && len == xmlnsLen; 31091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 31101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (mustBeXML != isXML) 31111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return mustBeXML ? XML_ERROR_RESERVED_PREFIX_XML 31121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : XML_ERROR_RESERVED_NAMESPACE_URI; 31131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 31141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (isXMLNS) 31151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_RESERVED_NAMESPACE_URI; 31161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 31171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (namespaceSeparator) 31181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci len++; 31191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (freeBindingList) { 31201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b = freeBindingList; 31211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (len > b->uriAlloc) { 31221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *temp = (XML_Char *)REALLOC(b->uri, 31231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(XML_Char) * (len + EXPAND_SPARE)); 31241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (temp == NULL) 31251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 31261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->uri = temp; 31271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->uriAlloc = len + EXPAND_SPARE; 31281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 31291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeBindingList = b->nextTagBinding; 31301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 31311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 31321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b = (BINDING *)MALLOC(sizeof(BINDING)); 31331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!b) 31341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 31351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE)); 31361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!b->uri) { 31371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FREE(b); 31381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 31391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 31401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->uriAlloc = len + EXPAND_SPARE; 31411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 31421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->uriLen = len; 31431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memcpy(b->uri, uri, len * sizeof(XML_Char)); 31441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (namespaceSeparator) 31451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->uri[len - 1] = namespaceSeparator; 31461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->prefix = prefix; 31471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->attId = attId; 31481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->prevPrefixBinding = prefix->binding; 31491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* NULL binding when default namespace undeclared */ 31501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix) 31511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefix->binding = NULL; 31521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 31531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefix->binding = b; 31541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->nextTagBinding = *bindingsPtr; 31551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *bindingsPtr = b; 31561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* if attId == NULL then we are not starting a namespace scope */ 31571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (attId && startNamespaceDeclHandler) 31581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startNamespaceDeclHandler(handlerArg, prefix->name, 31591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefix->binding ? uri : 0); 31601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 31611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 31621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 31631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* The idea here is to avoid using stack for each CDATA section when 31641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci the whole file is parsed with one call. 31651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/ 31661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 31671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccicdataSectionProcessor(XML_Parser parser, 31681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start, 31691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 31701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **endPtr) 31711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 31721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = doCdataSection(parser, encoding, &start, end, 31731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endPtr, (XML_Bool)!ps_finalBuffer); 31741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 31751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 31761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (start) { 31771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (parentParser) { /* we are parsing an external entity */ 31781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = externalEntityContentProcessor; 31791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return externalEntityContentProcessor(parser, start, end, endPtr); 31801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 31811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 31821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = contentProcessor; 31831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return contentProcessor(parser, start, end, endPtr); 31841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 31851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 31861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 31871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 31881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 31891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* startPtr gets set to non-null if the section is closed, and to null if 31901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci the section is not yet closed. 31911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/ 31921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 31931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoCdataSection(XML_Parser parser, 31941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ENCODING *enc, 31951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **startPtr, 31961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 31971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **nextPtr, 31981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool haveMore) 31991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 32001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s = *startPtr; 32011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **eventPP; 32021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **eventEndPP; 32031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) { 32041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPP = &eventPtr; 32051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = s; 32061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPP = &eventEndPtr; 32071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 32081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 32091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPP = &(openInternalEntities->internalEventPtr); 32101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPP = &(openInternalEntities->internalEventEndPtr); 32111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 32121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = s; 32131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *startPtr = NULL; 32141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 32151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 32161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next; 32171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok = XmlCdataSectionTok(enc, s, end, &next); 32181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = next; 32191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (tok) { 32201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_CDATA_SECT_CLOSE: 32211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (endCdataSectionHandler) 32221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endCdataSectionHandler(handlerArg); 32231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if 0 32241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* see comment under XML_TOK_CDATA_SECT_OPEN */ 32251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (characterDataHandler) 32261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci characterDataHandler(handlerArg, dataBuf, 0); 32271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 32281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 32291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 32301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *startPtr = next; 32311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = next; 32321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ps_parsing == XML_FINISHED) 32331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ABORTED; 32341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 32351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 32361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_DATA_NEWLINE: 32371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (characterDataHandler) { 32381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char c = 0xA; 32391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci characterDataHandler(handlerArg, &c, 1); 32401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 32411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 32421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 32431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 32441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_DATA_CHARS: 32451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 32461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_CharacterDataHandler charDataHandler = characterDataHandler; 32471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (charDataHandler) { 32481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (MUST_CONVERT(enc, s)) { 32491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 32501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ICHAR *dataPtr = (ICHAR *)dataBuf; 32511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); 32521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = next; 32531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci charDataHandler(handlerArg, dataBuf, 32541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (int)(dataPtr - (ICHAR *)dataBuf)); 32551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (s == next) 32561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 32571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = s; 32581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 32591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 32601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 32611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci charDataHandler(handlerArg, 32621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (XML_Char *)s, 32631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (int)((XML_Char *)next - (XML_Char *)s)); 32641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 32651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 32661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 32671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 32681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 32691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_INVALID: 32701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = next; 32711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_INVALID_TOKEN; 32721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL_CHAR: 32731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (haveMore) { 32741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 32751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 32761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 32771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_PARTIAL_CHAR; 32781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL: 32791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_NONE: 32801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (haveMore) { 32811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 32821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 32831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 32841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNCLOSED_CDATA_SECTION; 32851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 32861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = next; 32871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNEXPECTED_STATE; 32881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 32891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 32901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = s = next; 32911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ps_parsing) { 32921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_SUSPENDED: 32931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = next; 32941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 32951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_FINISHED: 32961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ABORTED; 32971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: ; 32981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 32991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 33001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* not reached */ 33011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 33021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 33031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 33041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 33051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* The idea here is to avoid using stack for each IGNORE section when 33061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci the whole file is parsed with one call. 33071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/ 33081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 33091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciignoreSectionProcessor(XML_Parser parser, 33101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start, 33111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 33121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **endPtr) 33131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 33141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = doIgnoreSection(parser, encoding, &start, end, 33151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endPtr, (XML_Bool)!ps_finalBuffer); 33161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 33171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 33181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (start) { 33191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = prologProcessor; 33201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return prologProcessor(parser, start, end, endPtr); 33211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 33221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 33231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 33241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 33251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* startPtr gets set to non-null is the section is closed, and to null 33261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if the section is not yet closed. 33271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/ 33281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 33291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoIgnoreSection(XML_Parser parser, 33301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ENCODING *enc, 33311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **startPtr, 33321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 33331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **nextPtr, 33341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool haveMore) 33351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 33361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next; 33371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok; 33381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s = *startPtr; 33391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **eventPP; 33401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **eventEndPP; 33411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) { 33421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPP = &eventPtr; 33431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = s; 33441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPP = &eventEndPtr; 33451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 33461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 33471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPP = &(openInternalEntities->internalEventPtr); 33481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPP = &(openInternalEntities->internalEventEndPtr); 33491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 33501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = s; 33511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *startPtr = NULL; 33521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tok = XmlIgnoreSectionTok(enc, s, end, &next); 33531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = next; 33541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (tok) { 33551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_IGNORE_SECT: 33561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (defaultHandler) 33571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 33581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *startPtr = next; 33591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = next; 33601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ps_parsing == XML_FINISHED) 33611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ABORTED; 33621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 33631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 33641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_INVALID: 33651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = next; 33661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_INVALID_TOKEN; 33671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL_CHAR: 33681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (haveMore) { 33691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 33701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 33711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 33721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_PARTIAL_CHAR; 33731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL: 33741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_NONE: 33751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (haveMore) { 33761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 33771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 33781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 33791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */ 33801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 33811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = next; 33821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNEXPECTED_STATE; 33831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 33841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* not reached */ 33851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 33861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 33871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 33881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 33891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 33901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciinitializeEncoding(XML_Parser parser) 33911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 33921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s; 33931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_UNICODE 33941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char encodingBuf[128]; 33951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!protocolEncodingName) 33961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s = NULL; 33971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 33981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int i; 33991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; protocolEncodingName[i]; i++) { 34001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (i == sizeof(encodingBuf) - 1 34011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci || (protocolEncodingName[i] & ~0x7f) != 0) { 34021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encodingBuf[0] = '\0'; 34031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 34041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 34051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encodingBuf[i] = (char)protocolEncodingName[i]; 34061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 34071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encodingBuf[i] = '\0'; 34081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s = encodingBuf; 34091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 34101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 34111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s = protocolEncodingName; 34121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 34131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s)) 34141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 34151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return handleUnknownEncoding(parser, protocolEncodingName); 34161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 34171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 34181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 34191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciprocessXmlDecl(XML_Parser parser, int isGeneralTextEntity, 34201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s, const char *next) 34211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 34221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *encodingName = NULL; 34231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *storedEncName = NULL; 34241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ENCODING *newEncoding = NULL; 34251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *version = NULL; 34261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *versionend; 34271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *storedversion = NULL; 34281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int standalone = -1; 34291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!(ns 34301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ? XmlParseXmlDeclNS 34311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : XmlParseXmlDecl)(isGeneralTextEntity, 34321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encoding, 34331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s, 34341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next, 34351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &eventPtr, 34361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &version, 34371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &versionend, 34381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &encodingName, 34391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &newEncoding, 34401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &standalone)) { 34411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (isGeneralTextEntity) 34421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_TEXT_DECL; 34431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 34441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_XML_DECL; 34451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 34461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!isGeneralTextEntity && standalone == 1) { 34471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci _dtd->standalone = XML_TRUE; 34481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 34491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) 34501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; 34511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 34521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 34531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (xmlDeclHandler) { 34541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (encodingName != NULL) { 34551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci storedEncName = poolStoreString(&temp2Pool, 34561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encoding, 34571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encodingName, 34581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encodingName 34591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci + XmlNameLength(encoding, encodingName)); 34601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!storedEncName) 34611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 34621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&temp2Pool); 34631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 34641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (version) { 34651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci storedversion = poolStoreString(&temp2Pool, 34661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encoding, 34671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci version, 34681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci versionend - encoding->minBytesPerChar); 34691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!storedversion) 34701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 34711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 34721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone); 34731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 34741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (defaultHandler) 34751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, encoding, s, next); 34761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (protocolEncodingName == NULL) { 34771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (newEncoding) { 34781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) { 34791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = encodingName; 34801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_INCORRECT_ENCODING; 34811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 34821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encoding = newEncoding; 34831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 34841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (encodingName) { 34851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result; 34861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!storedEncName) { 34871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci storedEncName = poolStoreString( 34881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &temp2Pool, encoding, encodingName, 34891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encodingName + XmlNameLength(encoding, encodingName)); 34901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!storedEncName) 34911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 34921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 34931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = handleUnknownEncoding(parser, storedEncName); 34941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&temp2Pool); 34951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result == XML_ERROR_UNKNOWN_ENCODING) 34961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = encodingName; 34971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 34981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 34991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 35001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 35011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (storedEncName || storedversion) 35021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&temp2Pool); 35031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 35041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 35051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 35061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 35071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 35081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihandleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) 35091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 35101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (unknownEncodingHandler) { 35111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Encoding info; 35121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int i; 35131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; i < 256; i++) 35141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci info.map[i] = -1; 35151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci info.convert = NULL; 35161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci info.data = NULL; 35171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci info.release = NULL; 35181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, 35191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &info)) { 35201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ENCODING *enc; 35211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding()); 35221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!unknownEncodingMem) { 35231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (info.release) 35241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci info.release(info.data); 35251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 35261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 35271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enc = (ns 35281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ? XmlInitUnknownEncodingNS 35291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : XmlInitUnknownEncoding)(unknownEncodingMem, 35301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci info.map, 35311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci info.convert, 35321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci info.data); 35331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc) { 35341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unknownEncodingData = info.data; 35351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unknownEncodingRelease = info.release; 35361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encoding = enc; 35371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 35381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 35391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 35401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (info.release != NULL) 35411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci info.release(info.data); 35421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 35431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNKNOWN_ENCODING; 35441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 35451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 35461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 35471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciprologInitProcessor(XML_Parser parser, 35481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s, 35491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 35501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **nextPtr) 35511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 35521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = initializeEncoding(parser); 35531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 35541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 35551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = prologProcessor; 35561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return prologProcessor(parser, s, end, nextPtr); 35571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 35581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 35591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 35601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 35611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 35621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciexternalParEntInitProcessor(XML_Parser parser, 35631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s, 35641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 35651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **nextPtr) 35661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 35671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = initializeEncoding(parser); 35681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 35691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 35701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 35711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* we know now that XML_Parse(Buffer) has been called, 35721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci so we consider the external parameter entity read */ 35731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci _dtd->paramEntityRead = XML_TRUE; 35741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 35751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (prologState.inEntityValue) { 35761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = entityValueInitProcessor; 35771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return entityValueInitProcessor(parser, s, end, nextPtr); 35781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 35791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 35801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = externalParEntProcessor; 35811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return externalParEntProcessor(parser, s, end, nextPtr); 35821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 35831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 35841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 35851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 35861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccientityValueInitProcessor(XML_Parser parser, 35871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s, 35881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 35891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **nextPtr) 35901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 35911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok; 35921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start = s; 35931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next = start; 35941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = start; 35951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 35961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 35971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tok = XmlPrologTok(encoding, start, end, &next); 35981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPtr = next; 35991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tok <= 0) { 36001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ps_finalBuffer && tok != XML_TOK_INVALID) { 36011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 36021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 36031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 36041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (tok) { 36051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_INVALID: 36061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_INVALID_TOKEN; 36071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL: 36081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNCLOSED_TOKEN; 36091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL_CHAR: 36101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_PARTIAL_CHAR; 36111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_NONE: /* start == end */ 36121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 36131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 36141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 36151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* found end of entity value - can store it now */ 36161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return storeEntityValue(parser, encoding, s, end); 36171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 36181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (tok == XML_TOK_XML_DECL) { 36191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result; 36201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = processXmlDecl(parser, 0, start, next); 36211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 36221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 36231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ps_parsing) { 36241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_SUSPENDED: 36251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = next; 36261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 36271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_FINISHED: 36281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ABORTED; 36291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 36301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = next; 36311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 36321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* stop scanning for text declaration - we found one */ 36331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = entityValueProcessor; 36341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return entityValueProcessor(parser, next, end, nextPtr); 36351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 36361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* If we are at the end of the buffer, this would cause XmlPrologTok to 36371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_TOK_NONE on the next call, which would then cause the 36381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci function to exit with *nextPtr set to s - that is what we want for other 36391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tokens, but not for the BOM - we would rather like to skip it; 36401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci then, when this routine is entered the next time, XmlPrologTok will 36411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_TOK_INVALID, since the BOM is still in the buffer 36421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 36431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (tok == XML_TOK_BOM && next == end && !ps_finalBuffer) { 36441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = next; 36451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 36461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 36471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci start = next; 36481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = start; 36491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 36501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 36511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 36521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 36531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciexternalParEntProcessor(XML_Parser parser, 36541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s, 36551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 36561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **nextPtr) 36571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 36581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next = s; 36591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok; 36601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 36611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tok = XmlPrologTok(encoding, s, end, &next); 36621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tok <= 0) { 36631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ps_finalBuffer && tok != XML_TOK_INVALID) { 36641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 36651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 36661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 36671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (tok) { 36681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_INVALID: 36691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_INVALID_TOKEN; 36701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL: 36711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNCLOSED_TOKEN; 36721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL_CHAR: 36731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_PARTIAL_CHAR; 36741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_NONE: /* start == end */ 36751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 36761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 36771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 36781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 36791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM. 36801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci However, when parsing an external subset, doProlog will not accept a BOM 36811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci as valid, and report a syntax error, so we have to skip the BOM 36821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 36831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (tok == XML_TOK_BOM) { 36841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s = next; 36851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tok = XmlPrologTok(encoding, s, end, &next); 36861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 36871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 36881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = prologProcessor; 36891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return doProlog(parser, encoding, s, end, tok, next, 36901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nextPtr, (XML_Bool)!ps_finalBuffer); 36911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 36921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 36931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 36941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccientityValueProcessor(XML_Parser parser, 36951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s, 36961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 36971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **nextPtr) 36981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 36991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start = s; 37001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next = s; 37011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ENCODING *enc = encoding; 37021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok; 37031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 37041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 37051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tok = XmlPrologTok(enc, start, end, &next); 37061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tok <= 0) { 37071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ps_finalBuffer && tok != XML_TOK_INVALID) { 37081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 37091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 37101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 37111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (tok) { 37121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_INVALID: 37131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_INVALID_TOKEN; 37141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL: 37151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNCLOSED_TOKEN; 37161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL_CHAR: 37171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_PARTIAL_CHAR; 37181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_NONE: /* start == end */ 37191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 37201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 37211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 37221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* found end of entity value - can store it now */ 37231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return storeEntityValue(parser, enc, s, end); 37241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 37251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci start = next; 37261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 37271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 37281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 37291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 37301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 37311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 37321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciprologProcessor(XML_Parser parser, 37331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s, 37341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 37351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **nextPtr) 37361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 37371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next = s; 37381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok = XmlPrologTok(encoding, s, end, &next); 37391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return doProlog(parser, encoding, s, end, tok, next, 37401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nextPtr, (XML_Bool)!ps_finalBuffer); 37411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 37421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 37431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 37441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidoProlog(XML_Parser parser, 37451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ENCODING *enc, 37461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s, 37471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 37481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok, 37491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next, 37501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **nextPtr, 37511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool haveMore) 37521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 37531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 37541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' }; 37551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 37561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Char atypeCDATA[] = 37571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; 37581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' }; 37591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Char atypeIDREF[] = 37601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; 37611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Char atypeIDREFS[] = 37621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; 37631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Char atypeENTITY[] = 37641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; 37651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Char atypeENTITIES[] = { ASCII_E, ASCII_N, 37661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' }; 37671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Char atypeNMTOKEN[] = { 37681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; 37691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Char atypeNMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T, 37701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' }; 37711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Char notationPrefix[] = { ASCII_N, ASCII_O, ASCII_T, 37721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0' }; 37731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Char enumValueSep[] = { ASCII_PIPE, '\0' }; 37741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' }; 37751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 37761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* save one level of indirection */ 37771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD * const dtd = _dtd; 37781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 37791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **eventPP; 37801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **eventEndPP; 37811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Content_Quant quant; 37821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 37831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) { 37841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPP = &eventPtr; 37851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPP = &eventEndPtr; 37861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 37871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 37881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPP = &(openInternalEntities->internalEventPtr); 37891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPP = &(openInternalEntities->internalEventEndPtr); 37901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 37911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 37921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 37931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int role; 37941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool handleDefault = XML_TRUE; 37951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = s; 37961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = next; 37971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tok <= 0) { 37981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (haveMore && tok != XML_TOK_INVALID) { 37991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 38001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 38011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 38021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (tok) { 38031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_INVALID: 38041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = next; 38051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_INVALID_TOKEN; 38061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL: 38071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNCLOSED_TOKEN; 38081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL_CHAR: 38091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_PARTIAL_CHAR; 38101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case -XML_TOK_PROLOG_S: 38111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tok = -tok; 38121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 38131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_NONE: 38141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 38151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* for internal PE NOT referenced between declarations */ 38161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc != encoding && !openInternalEntities->betweenDecl) { 38171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 38181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 38191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 38201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* WFC: PE Between Declarations - must check that PE contains 38211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci complete markup, not only for external PEs, but also for 38221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci internal PEs if the reference occurs between declarations. 38231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 38241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (isParamEntity || enc != encoding) { 38251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc) 38261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci == XML_ROLE_ERROR) 38271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_INCOMPLETE_PE; 38281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 38291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 38301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 38311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 38321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_ELEMENTS; 38331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 38341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tok = -tok; 38351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next = end; 38361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 38371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 38381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 38391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci role = XmlTokenRole(&prologState, tok, s, next, enc); 38401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (role) { 38411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_XML_DECL: 38421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 38431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = processXmlDecl(parser, 0, s, next); 38441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 38451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 38461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enc = encoding; 38471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 38481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 38491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 38501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_DOCTYPE_NAME: 38511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (startDoctypeDeclHandler) { 38521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci doctypeName = poolStoreString(&tempPool, enc, s, next); 38531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!doctypeName) 38541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 38551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&tempPool); 38561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci doctypePubid = NULL; 38571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 38581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 38591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci doctypeSysid = NULL; /* always initialize to NULL */ 38601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 38611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_DOCTYPE_INTERNAL_SUBSET: 38621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (startDoctypeDeclHandler) { 38631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid, 38641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci doctypePubid, 1); 38651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci doctypeName = NULL; 38661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&tempPool); 38671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 38681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 38691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 38701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 38711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_TEXT_DECL: 38721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 38731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = processXmlDecl(parser, 1, s, next); 38741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 38751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 38761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enc = encoding; 38771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 38781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 38791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 38801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 38811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_DOCTYPE_PUBLIC_ID: 38821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 38831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci useForeignDTD = XML_FALSE; 38841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity = (ENTITY *)lookup(parser, 38851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &dtd->paramEntities, 38861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci externalSubsetName, 38871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(ENTITY)); 38881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!declEntity) 38891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 38901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 38911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->hasParamEntityRefs = XML_TRUE; 38921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (startDoctypeDeclHandler) { 38931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *pubId; 38941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!XmlIsPublicId(enc, s, next, eventPP)) 38951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_PUBLICID; 38961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pubId = poolStoreString(&tempPool, enc, 38971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s + enc->minBytesPerChar, 38981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next - enc->minBytesPerChar); 38991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!pubId) 39001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 39011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci normalizePublicId(pubId); 39021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&tempPool); 39031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci doctypePubid = pubId; 39041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 39051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto alreadyChecked; 39061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 39071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* fall through */ 39081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ENTITY_PUBLIC_ID: 39091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!XmlIsPublicId(enc, s, next, eventPP)) 39101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_PUBLICID; 39111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci alreadyChecked: 39121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->keepProcessing && declEntity) { 39131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *tem = poolStoreString(&dtd->pool, 39141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enc, 39151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s + enc->minBytesPerChar, 39161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next - enc->minBytesPerChar); 39171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!tem) 39181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 39191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci normalizePublicId(tem); 39201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->publicId = tem; 39211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&dtd->pool); 39221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entityDeclHandler) 39231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 39241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 39251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 39261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_DOCTYPE_CLOSE: 39271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (doctypeName) { 39281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci startDoctypeDeclHandler(handlerArg, doctypeName, 39291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci doctypeSysid, doctypePubid, 0); 39301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&tempPool); 39311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 39321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 39331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* doctypeSysid will be non-NULL in the case of a previous 39341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler 39351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci was not set, indicating an external subset 39361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 39371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 39381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (doctypeSysid || useForeignDTD) { 39391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; 39401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->hasParamEntityRefs = XML_TRUE; 39411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (paramEntityParsing && externalEntityRefHandler) { 39421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ENTITY *entity = (ENTITY *)lookup(parser, 39431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &dtd->paramEntities, 39441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci externalSubsetName, 39451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(ENTITY)); 39461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!entity) 39471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 39481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (useForeignDTD) 39491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->base = curBase; 39501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->paramEntityRead = XML_FALSE; 39511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!externalEntityRefHandler(externalEntityRefHandlerArg, 39521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, 39531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->base, 39541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->systemId, 39551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->publicId)) 39561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_EXTERNAL_ENTITY_HANDLING; 39571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->paramEntityRead) { 39581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!dtd->standalone && 39591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci notStandaloneHandler && 39601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !notStandaloneHandler(handlerArg)) 39611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NOT_STANDALONE; 39621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 39631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* if we didn't read the foreign DTD then this means that there 39641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is no external subset and we must reset dtd->hasParamEntityRefs 39651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 39661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (!doctypeSysid) 39671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->hasParamEntityRefs = hadParamEntityRefs; 39681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* end of DTD - no need to update dtd->keepProcessing */ 39691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 39701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci useForeignDTD = XML_FALSE; 39711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 39721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 39731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (endDoctypeDeclHandler) { 39741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci endDoctypeDeclHandler(handlerArg); 39751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 39761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 39771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 39781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_INSTANCE_START: 39791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 39801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* if there is no DOCTYPE declaration then now is the 39811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci last chance to read the foreign DTD 39821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 39831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (useForeignDTD) { 39841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; 39851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->hasParamEntityRefs = XML_TRUE; 39861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (paramEntityParsing && externalEntityRefHandler) { 39871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities, 39881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci externalSubsetName, 39891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(ENTITY)); 39901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!entity) 39911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 39921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->base = curBase; 39931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->paramEntityRead = XML_FALSE; 39941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!externalEntityRefHandler(externalEntityRefHandlerArg, 39951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, 39961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->base, 39971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->systemId, 39981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->publicId)) 39991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_EXTERNAL_ENTITY_HANDLING; 40001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->paramEntityRead) { 40011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!dtd->standalone && 40021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci notStandaloneHandler && 40031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !notStandaloneHandler(handlerArg)) 40041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NOT_STANDALONE; 40051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 40061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* if we didn't read the foreign DTD then this means that there 40071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is no external subset and we must reset dtd->hasParamEntityRefs 40081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 40091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 40101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->hasParamEntityRefs = hadParamEntityRefs; 40111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* end of DTD - no need to update dtd->keepProcessing */ 40121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 40131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 40141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 40151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = contentProcessor; 40161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return contentProcessor(parser, s, end, nextPtr); 40171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ATTLIST_ELEMENT_NAME: 40181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declElementType = getElementType(parser, enc, s, next); 40191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!declElementType) 40201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 40211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto checkAttListDeclHandler; 40221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ATTRIBUTE_NAME: 40231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeId = getAttributeId(parser, enc, s, next); 40241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!declAttributeId) 40251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 40261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeIsCdata = XML_FALSE; 40271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeType = NULL; 40281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeIsId = XML_FALSE; 40291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto checkAttListDeclHandler; 40301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ATTRIBUTE_TYPE_CDATA: 40311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeIsCdata = XML_TRUE; 40321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeType = atypeCDATA; 40331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto checkAttListDeclHandler; 40341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ATTRIBUTE_TYPE_ID: 40351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeIsId = XML_TRUE; 40361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeType = atypeID; 40371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto checkAttListDeclHandler; 40381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ATTRIBUTE_TYPE_IDREF: 40391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeType = atypeIDREF; 40401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto checkAttListDeclHandler; 40411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ATTRIBUTE_TYPE_IDREFS: 40421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeType = atypeIDREFS; 40431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto checkAttListDeclHandler; 40441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ATTRIBUTE_TYPE_ENTITY: 40451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeType = atypeENTITY; 40461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto checkAttListDeclHandler; 40471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES: 40481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeType = atypeENTITIES; 40491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto checkAttListDeclHandler; 40501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN: 40511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeType = atypeNMTOKEN; 40521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto checkAttListDeclHandler; 40531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS: 40541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeType = atypeNMTOKENS; 40551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci checkAttListDeclHandler: 40561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->keepProcessing && attlistDeclHandler) 40571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 40581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 40591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ATTRIBUTE_ENUM_VALUE: 40601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ATTRIBUTE_NOTATION_VALUE: 40611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->keepProcessing && attlistDeclHandler) { 40621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *prefix; 40631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (declAttributeType) { 40641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefix = enumValueSep; 40651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 40661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 40671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE 40681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ? notationPrefix 40691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : enumValueStart); 40701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 40711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendString(&tempPool, prefix)) 40721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 40731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppend(&tempPool, enc, s, next)) 40741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 40751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeType = tempPool.start; 40761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 40771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 40781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 40791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: 40801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: 40811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->keepProcessing) { 40821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!defineAttribute(declElementType, declAttributeId, 40831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeIsCdata, declAttributeIsId, 40841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, parser)) 40851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 40861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (attlistDeclHandler && declAttributeType) { 40871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (*declAttributeType == XML_T(ASCII_LPAREN) 40881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci || (*declAttributeType == XML_T(ASCII_N) 40891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && declAttributeType[1] == XML_T(ASCII_O))) { 40901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Enumerated or Notation type */ 40911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN)) 40921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci || !poolAppendChar(&tempPool, XML_T('\0'))) 40931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 40941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeType = tempPool.start; 40951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&tempPool); 40961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 40971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = s; 40981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci attlistDeclHandler(handlerArg, declElementType->name, 40991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeId->name, declAttributeType, 41001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE); 41011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&tempPool); 41021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 41031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 41041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 41051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 41061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: 41071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_FIXED_ATTRIBUTE_VALUE: 41081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->keepProcessing) { 41091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *attVal; 41101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = 41111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci storeAttributeValue(parser, enc, declAttributeIsCdata, 41121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s + enc->minBytesPerChar, 41131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next - enc->minBytesPerChar, 41141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &dtd->pool); 41151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result) 41161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 41171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci attVal = poolStart(&dtd->pool); 41181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&dtd->pool); 41191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* ID attributes aren't allowed to have a default */ 41201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!defineAttribute(declElementType, declAttributeId, 41211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeIsCdata, XML_FALSE, attVal, parser)) 41221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 41231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (attlistDeclHandler && declAttributeType) { 41241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (*declAttributeType == XML_T(ASCII_LPAREN) 41251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci || (*declAttributeType == XML_T(ASCII_N) 41261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && declAttributeType[1] == XML_T(ASCII_O))) { 41271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Enumerated or Notation type */ 41281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN)) 41291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci || !poolAppendChar(&tempPool, XML_T('\0'))) 41301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 41311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeType = tempPool.start; 41321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&tempPool); 41331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 41341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = s; 41351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci attlistDeclHandler(handlerArg, declElementType->name, 41361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declAttributeId->name, declAttributeType, 41371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci attVal, 41381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci role == XML_ROLE_FIXED_ATTRIBUTE_VALUE); 41391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&tempPool); 41401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 41411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 41421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 41431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 41441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ENTITY_VALUE: 41451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->keepProcessing) { 41461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = storeEntityValue(parser, enc, 41471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s + enc->minBytesPerChar, 41481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next - enc->minBytesPerChar); 41491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (declEntity) { 41501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->textPtr = poolStart(&dtd->entityValuePool); 41511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->textLen = (int)(poolLength(&dtd->entityValuePool)); 41521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&dtd->entityValuePool); 41531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entityDeclHandler) { 41541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = s; 41551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entityDeclHandler(handlerArg, 41561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->name, 41571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->is_param, 41581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->textPtr, 41591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->textLen, 41601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci curBase, 0, 0, 0); 41611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 41621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 41631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 41641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 41651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&dtd->entityValuePool); 41661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 41671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 41681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 41691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 41701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_DOCTYPE_SYSTEM_ID: 41711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 41721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci useForeignDTD = XML_FALSE; 41731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 41741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->hasParamEntityRefs = XML_TRUE; 41751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (startDoctypeDeclHandler) { 41761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci doctypeSysid = poolStoreString(&tempPool, enc, 41771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s + enc->minBytesPerChar, 41781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next - enc->minBytesPerChar); 41791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (doctypeSysid == NULL) 41801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 41811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&tempPool); 41821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 41831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 41841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 41851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 41861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* use externalSubsetName to make doctypeSysid non-NULL 41871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for the case where no startDoctypeDeclHandler is set */ 41881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci doctypeSysid = externalSubsetName; 41891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 41901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!dtd->standalone 41911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 41921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && !paramEntityParsing 41931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 41941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && notStandaloneHandler 41951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && !notStandaloneHandler(handlerArg)) 41961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NOT_STANDALONE; 41971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef XML_DTD 41981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 41991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else /* XML_DTD */ 42001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!declEntity) { 42011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity = (ENTITY *)lookup(parser, 42021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &dtd->paramEntities, 42031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci externalSubsetName, 42041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(ENTITY)); 42051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!declEntity) 42061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 42071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->publicId = NULL; 42081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 42091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* fall through */ 42101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 42111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ENTITY_SYSTEM_ID: 42121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->keepProcessing && declEntity) { 42131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->systemId = poolStoreString(&dtd->pool, enc, 42141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s + enc->minBytesPerChar, 42151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next - enc->minBytesPerChar); 42161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!declEntity->systemId) 42171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 42181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->base = curBase; 42191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&dtd->pool); 42201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entityDeclHandler) 42211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 42221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 42231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 42241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ENTITY_COMPLETE: 42251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->keepProcessing && declEntity && entityDeclHandler) { 42261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = s; 42271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entityDeclHandler(handlerArg, 42281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->name, 42291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->is_param, 42301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0,0, 42311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->base, 42321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->systemId, 42331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->publicId, 42341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0); 42351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 42361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 42371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 42381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ENTITY_NOTATION_NAME: 42391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->keepProcessing && declEntity) { 42401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->notation = poolStoreString(&dtd->pool, enc, s, next); 42411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!declEntity->notation) 42421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 42431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&dtd->pool); 42441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (unparsedEntityDeclHandler) { 42451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = s; 42461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unparsedEntityDeclHandler(handlerArg, 42471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->name, 42481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->base, 42491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->systemId, 42501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->publicId, 42511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->notation); 42521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 42531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 42541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (entityDeclHandler) { 42551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = s; 42561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entityDeclHandler(handlerArg, 42571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->name, 42581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0,0,0, 42591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->base, 42601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->systemId, 42611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->publicId, 42621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->notation); 42631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 42641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 42651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 42661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 42671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_GENERAL_ENTITY_NAME: 42681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 42691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (XmlPredefinedEntityName(enc, s, next)) { 42701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity = NULL; 42711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 42721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 42731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->keepProcessing) { 42741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); 42751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!name) 42761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 42771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 42781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(ENTITY)); 42791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!declEntity) 42801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 42811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (declEntity->name != name) { 42821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&dtd->pool); 42831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity = NULL; 42841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 42851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 42861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&dtd->pool); 42871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->publicId = NULL; 42881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->is_param = XML_FALSE; 42891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* if we have a parent parser or are reading an internal parameter 42901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity, then the entity declaration is not considered "internal" 42911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 42921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->is_internal = !(parentParser || openInternalEntities); 42931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entityDeclHandler) 42941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 42951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 42961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 42971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 42981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&dtd->pool); 42991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity = NULL; 43001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 43011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 43021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 43031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_PARAM_ENTITY_NAME: 43041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 43051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->keepProcessing) { 43061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); 43071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!name) 43081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 43091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities, 43101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci name, sizeof(ENTITY)); 43111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!declEntity) 43121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 43131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (declEntity->name != name) { 43141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&dtd->pool); 43151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity = NULL; 43161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 43171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 43181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&dtd->pool); 43191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->publicId = NULL; 43201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->is_param = XML_TRUE; 43211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* if we have a parent parser or are reading an internal parameter 43221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity, then the entity declaration is not considered "internal" 43231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 43241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity->is_internal = !(parentParser || openInternalEntities); 43251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entityDeclHandler) 43261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 43271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 43281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 43291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 43301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&dtd->pool); 43311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity = NULL; 43321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 43331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else /* not XML_DTD */ 43341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declEntity = NULL; 43351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 43361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 43371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_NOTATION_NAME: 43381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declNotationPublicId = NULL; 43391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declNotationName = NULL; 43401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (notationDeclHandler) { 43411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declNotationName = poolStoreString(&tempPool, enc, s, next); 43421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!declNotationName) 43431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 43441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&tempPool); 43451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 43461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 43471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 43481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_NOTATION_PUBLIC_ID: 43491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!XmlIsPublicId(enc, s, next, eventPP)) 43501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_PUBLICID; 43511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (declNotationName) { /* means notationDeclHandler != NULL */ 43521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *tem = poolStoreString(&tempPool, 43531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enc, 43541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s + enc->minBytesPerChar, 43551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next - enc->minBytesPerChar); 43561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!tem) 43571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 43581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci normalizePublicId(tem); 43591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declNotationPublicId = tem; 43601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&tempPool); 43611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 43621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 43631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 43641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_NOTATION_SYSTEM_ID: 43651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (declNotationName && notationDeclHandler) { 43661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *systemId 43671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci = poolStoreString(&tempPool, enc, 43681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s + enc->minBytesPerChar, 43691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next - enc->minBytesPerChar); 43701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!systemId) 43711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 43721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = s; 43731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci notationDeclHandler(handlerArg, 43741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declNotationName, 43751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci curBase, 43761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci systemId, 43771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declNotationPublicId); 43781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 43791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 43801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&tempPool); 43811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 43821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_NOTATION_NO_SYSTEM_ID: 43831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (declNotationPublicId && notationDeclHandler) { 43841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = s; 43851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci notationDeclHandler(handlerArg, 43861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declNotationName, 43871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci curBase, 43881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, 43891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declNotationPublicId); 43901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 43911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 43921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&tempPool); 43931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 43941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ERROR: 43951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (tok) { 43961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARAM_ENTITY_REF: 43971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* PE references in internal subset are 43981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci not allowed within declarations. */ 43991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_PARAM_ENTITY_REF; 44001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_XML_DECL: 44011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_MISPLACED_XML_PI; 44021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 44031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_SYNTAX; 44041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 44051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 44061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_IGNORE_SECT: 44071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 44081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result; 44091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (defaultHandler) 44101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 44111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 44121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore); 44131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 44141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 44151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (!next) { 44161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = ignoreSectionProcessor; 44171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 44181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 44191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 44201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 44211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 44221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_GROUP_OPEN: 44231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (prologState.level >= groupSize) { 44241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (groupSize) { 44251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char *temp = (char *)REALLOC(groupConnector, groupSize *= 2); 44261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (temp == NULL) 44271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 44281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci groupConnector = temp; 44291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->scaffIndex) { 44301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int *temp = (int *)REALLOC(dtd->scaffIndex, 44311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci groupSize * sizeof(int)); 44321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (temp == NULL) 44331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 44341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffIndex = temp; 44351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 44361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 44371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 44381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci groupConnector = (char *)MALLOC(groupSize = 32); 44391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!groupConnector) 44401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 44411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 44421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 44431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci groupConnector[prologState.level] = 0; 44441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->in_eldecl) { 44451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int myindex = nextScaffoldPart(parser); 44461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (myindex < 0) 44471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 44481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffIndex[dtd->scaffLevel] = myindex; 44491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffLevel++; 44501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffold[myindex].type = XML_CTYPE_SEQ; 44511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (elementDeclHandler) 44521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 44531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 44541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 44551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_GROUP_SEQUENCE: 44561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (groupConnector[prologState.level] == ASCII_PIPE) 44571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_SYNTAX; 44581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci groupConnector[prologState.level] = ASCII_COMMA; 44591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->in_eldecl && elementDeclHandler) 44601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 44611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 44621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_GROUP_CHOICE: 44631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (groupConnector[prologState.level] == ASCII_COMMA) 44641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_SYNTAX; 44651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->in_eldecl 44661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && !groupConnector[prologState.level] 44671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type 44681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci != XML_CTYPE_MIXED) 44691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ) { 44701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type 44711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci = XML_CTYPE_CHOICE; 44721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (elementDeclHandler) 44731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 44741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 44751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci groupConnector[prologState.level] = ASCII_PIPE; 44761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 44771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_PARAM_ENTITY_REF: 44781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 44791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_INNER_PARAM_ENTITY_REF: 44801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->hasParamEntityRefs = XML_TRUE; 44811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!paramEntityParsing) 44821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->keepProcessing = dtd->standalone; 44831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 44841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name; 44851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ENTITY *entity; 44861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci name = poolStoreString(&dtd->pool, enc, 44871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s + enc->minBytesPerChar, 44881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next - enc->minBytesPerChar); 44891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!name) 44901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 44911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); 44921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&dtd->pool); 44931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* first, determine if a check for an existing declaration is needed; 44941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if yes, check that the entity exists, and that it is internal, 44951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci otherwise call the skipped entity handler 44961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 44971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (prologState.documentEntity && 44981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (dtd->standalone 44991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ? !openInternalEntities 45001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : !dtd->hasParamEntityRefs)) { 45011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!entity) 45021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNDEFINED_ENTITY; 45031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (!entity->is_internal) 45041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ENTITY_DECLARED_IN_PE; 45051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 45061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (!entity) { 45071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->keepProcessing = dtd->standalone; 45081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* cannot report skipped entities in declarations */ 45091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) { 45101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci skippedEntityHandler(handlerArg, name, 1); 45111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 45121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 45131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 45141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 45151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entity->open) 45161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_RECURSIVE_ENTITY_REF; 45171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entity->textPtr) { 45181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result; 45191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool betweenDecl = 45201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); 45211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = processInternalEntity(parser, entity, betweenDecl); 45221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 45231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 45241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 45251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 45261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 45271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (externalEntityRefHandler) { 45281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->paramEntityRead = XML_FALSE; 45291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_TRUE; 45301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!externalEntityRefHandler(externalEntityRefHandlerArg, 45311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, 45321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->base, 45331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->systemId, 45341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->publicId)) { 45351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_FALSE; 45361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_EXTERNAL_ENTITY_HANDLING; 45371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 45381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_FALSE; 45391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 45401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!dtd->paramEntityRead) { 45411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->keepProcessing = dtd->standalone; 45421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 45431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 45441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 45451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 45461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->keepProcessing = dtd->standalone; 45471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 45481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 45491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 45501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 45511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!dtd->standalone && 45521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci notStandaloneHandler && 45531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !notStandaloneHandler(handlerArg)) 45541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NOT_STANDALONE; 45551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 45561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 45571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Element declaration stuff */ 45581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 45591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ELEMENT_NAME: 45601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (elementDeclHandler) { 45611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declElementType = getElementType(parser, enc, s, next); 45621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!declElementType) 45631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 45641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffLevel = 0; 45651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffCount = 0; 45661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->in_eldecl = XML_TRUE; 45671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 45681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 45691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 45701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 45711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_CONTENT_ANY: 45721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_CONTENT_EMPTY: 45731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->in_eldecl) { 45741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (elementDeclHandler) { 45751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content)); 45761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!content) 45771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 45781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content->quant = XML_CQUANT_NONE; 45791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content->name = NULL; 45801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content->numchildren = 0; 45811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content->children = NULL; 45821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content->type = ((role == XML_ROLE_CONTENT_ANY) ? 45831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_CTYPE_ANY : 45841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_CTYPE_EMPTY); 45851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = s; 45861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci elementDeclHandler(handlerArg, declElementType->name, content); 45871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 45881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 45891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->in_eldecl = XML_FALSE; 45901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 45911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 45921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 45931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_CONTENT_PCDATA: 45941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->in_eldecl) { 45951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type 45961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci = XML_CTYPE_MIXED; 45971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (elementDeclHandler) 45981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 45991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 46001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 46011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 46021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_CONTENT_ELEMENT: 46031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quant = XML_CQUANT_NONE; 46041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto elementContent; 46051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_CONTENT_ELEMENT_OPT: 46061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quant = XML_CQUANT_OPT; 46071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto elementContent; 46081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_CONTENT_ELEMENT_REP: 46091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quant = XML_CQUANT_REP; 46101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto elementContent; 46111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_CONTENT_ELEMENT_PLUS: 46121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quant = XML_CQUANT_PLUS; 46131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci elementContent: 46141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->in_eldecl) { 46151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ELEMENT_TYPE *el; 46161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name; 46171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int nameLen; 46181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *nxt = (quant == XML_CQUANT_NONE 46191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ? next 46201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : next - enc->minBytesPerChar); 46211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int myindex = nextScaffoldPart(parser); 46221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (myindex < 0) 46231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 46241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffold[myindex].type = XML_CTYPE_NAME; 46251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffold[myindex].quant = quant; 46261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci el = getElementType(parser, enc, s, nxt); 46271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!el) 46281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 46291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci name = el->name; 46301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffold[myindex].name = name; 46311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nameLen = 0; 46321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (; name[nameLen++]; ); 46331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->contentStringLen += nameLen; 46341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (elementDeclHandler) 46351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 46361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 46371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 46381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 46391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_GROUP_CLOSE: 46401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quant = XML_CQUANT_NONE; 46411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto closeGroup; 46421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_GROUP_CLOSE_OPT: 46431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quant = XML_CQUANT_OPT; 46441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto closeGroup; 46451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_GROUP_CLOSE_REP: 46461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quant = XML_CQUANT_REP; 46471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto closeGroup; 46481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_GROUP_CLOSE_PLUS: 46491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci quant = XML_CQUANT_PLUS; 46501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci closeGroup: 46511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->in_eldecl) { 46521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (elementDeclHandler) 46531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 46541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffLevel--; 46551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant; 46561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->scaffLevel == 0) { 46571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!handleDefault) { 46581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Content *model = build_model(parser); 46591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!model) 46601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 46611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = s; 46621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci elementDeclHandler(handlerArg, declElementType->name, model); 46631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 46641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->in_eldecl = XML_FALSE; 46651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->contentStringLen = 0; 46661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 46671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 46681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 46691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* End element declaration stuff */ 46701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 46711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_PI: 46721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!reportProcessingInstruction(parser, enc, s, next)) 46731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 46741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 46751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 46761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_COMMENT: 46771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!reportComment(parser, enc, s, next)) 46781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 46791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 46801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 46811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_NONE: 46821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (tok) { 46831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_BOM: 46841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 46851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 46861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 46871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 46881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_DOCTYPE_NONE: 46891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (startDoctypeDeclHandler) 46901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 46911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 46921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ENTITY_NONE: 46931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->keepProcessing && entityDeclHandler) 46941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 46951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 46961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_NOTATION_NONE: 46971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (notationDeclHandler) 46981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 46991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 47001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ATTLIST_NONE: 47011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->keepProcessing && attlistDeclHandler) 47021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 47031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 47041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_ROLE_ELEMENT_NONE: 47051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (elementDeclHandler) 47061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handleDefault = XML_FALSE; 47071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 47081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } /* end of big switch */ 47091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 47101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (handleDefault && defaultHandler) 47111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, s, next); 47121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 47131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ps_parsing) { 47141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_SUSPENDED: 47151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = next; 47161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 47171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_FINISHED: 47181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ABORTED; 47191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 47201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s = next; 47211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tok = XmlPrologTok(enc, s, end, &next); 47221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 47231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 47241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* not reached */ 47251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 47261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 47271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 47281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciepilogProcessor(XML_Parser parser, 47291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s, 47301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 47311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **nextPtr) 47321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 47331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = epilogProcessor; 47341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = s; 47351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 47361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next = NULL; 47371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok = XmlPrologTok(encoding, s, end, &next); 47381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPtr = next; 47391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (tok) { 47401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* report partial linebreak - it might be the last token */ 47411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case -XML_TOK_PROLOG_S: 47421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (defaultHandler) { 47431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, encoding, s, next); 47441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ps_parsing == XML_FINISHED) 47451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ABORTED; 47461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 47471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = next; 47481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 47491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_NONE: 47501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 47511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 47521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PROLOG_S: 47531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (defaultHandler) 47541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, encoding, s, next); 47551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 47561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PI: 47571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!reportProcessingInstruction(parser, encoding, s, next)) 47581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 47591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 47601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_COMMENT: 47611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!reportComment(parser, encoding, s, next)) 47621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 47631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 47641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_INVALID: 47651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = next; 47661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_INVALID_TOKEN; 47671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL: 47681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ps_finalBuffer) { 47691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 47701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 47711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 47721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNCLOSED_TOKEN; 47731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL_CHAR: 47741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ps_finalBuffer) { 47751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = s; 47761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 47771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 47781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_PARTIAL_CHAR; 47791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 47801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; 47811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 47821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = s = next; 47831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (ps_parsing) { 47841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_SUSPENDED: 47851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *nextPtr = next; 47861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 47871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_FINISHED: 47881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ABORTED; 47891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: ; 47901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 47911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 47921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 47931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 47941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 47951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciprocessInternalEntity(XML_Parser parser, ENTITY *entity, 47961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool betweenDecl) 47971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 47981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *textStart, *textEnd; 47991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next; 48001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result; 48011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OPEN_INTERNAL_ENTITY *openEntity; 48021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 48031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (freeInternalEntities) { 48041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openEntity = freeInternalEntities; 48051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeInternalEntities = openEntity->next; 48061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 48071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 48081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(sizeof(OPEN_INTERNAL_ENTITY)); 48091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!openEntity) 48101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 48111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 48121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_TRUE; 48131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->processed = 0; 48141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openEntity->next = openInternalEntities; 48151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openInternalEntities = openEntity; 48161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openEntity->entity = entity; 48171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openEntity->startTagLevel = tagLevel; 48181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openEntity->betweenDecl = betweenDecl; 48191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openEntity->internalEventPtr = NULL; 48201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openEntity->internalEventEndPtr = NULL; 48211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci textStart = (char *)entity->textPtr; 48221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci textEnd = (char *)(entity->textPtr + entity->textLen); 48231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 48241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 48251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entity->is_param) { 48261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); 48271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = doProlog(parser, internalEncoding, textStart, textEnd, tok, 48281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next, &next, XML_FALSE); 48291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 48301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 48311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 48321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = doContent(parser, tagLevel, internalEncoding, textStart, 48331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci textEnd, &next, XML_FALSE); 48341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 48351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result == XML_ERROR_NONE) { 48361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (textEnd != next && ps_parsing == XML_SUSPENDED) { 48371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->processed = (int)(next - textStart); 48381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = internalEntityProcessor; 48391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 48401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 48411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_FALSE; 48421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openInternalEntities = openEntity->next; 48431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* put openEntity back in list of free instances */ 48441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openEntity->next = freeInternalEntities; 48451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeInternalEntities = openEntity; 48461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 48471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 48481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 48491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 48501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 48511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 48521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciinternalEntityProcessor(XML_Parser parser, 48531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s, 48541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 48551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **nextPtr) 48561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 48571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ENTITY *entity; 48581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *textStart, *textEnd; 48591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next; 48601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result; 48611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OPEN_INTERNAL_ENTITY *openEntity = openInternalEntities; 48621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!openEntity) 48631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNEXPECTED_STATE; 48641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 48651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity = openEntity->entity; 48661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci textStart = ((char *)entity->textPtr) + entity->processed; 48671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci textEnd = (char *)(entity->textPtr + entity->textLen); 48681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 48691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 48701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entity->is_param) { 48711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); 48721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = doProlog(parser, internalEncoding, textStart, textEnd, tok, 48731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next, &next, XML_FALSE); 48741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 48751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 48761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 48771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = doContent(parser, openEntity->startTagLevel, internalEncoding, 48781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci textStart, textEnd, &next, XML_FALSE); 48791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 48801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result != XML_ERROR_NONE) 48811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 48821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (textEnd != next && ps_parsing == XML_SUSPENDED) { 48831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->processed = (int)(next - (char *)entity->textPtr); 48841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 48851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 48861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 48871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_FALSE; 48881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openInternalEntities = openEntity->next; 48891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* put openEntity back in list of free instances */ 48901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci openEntity->next = freeInternalEntities; 48911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci freeInternalEntities = openEntity; 48921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 48931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 48941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 48951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entity->is_param) { 48961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok; 48971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = prologProcessor; 48981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tok = XmlPrologTok(encoding, s, end, &next); 48991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return doProlog(parser, encoding, s, end, tok, next, nextPtr, 49001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (XML_Bool)!ps_finalBuffer); 49011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 49021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 49031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 49041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 49051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processor = contentProcessor; 49061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* see externalEntityContentProcessor vs contentProcessor */ 49071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return doContent(parser, parentParser ? 1 : 0, encoding, s, end, 49081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nextPtr, (XML_Bool)!ps_finalBuffer); 49091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 49101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 49111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 49121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error PTRCALL 49131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccierrorProcessor(XML_Parser parser, 49141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s, 49151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end, 49161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **nextPtr) 49171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 49181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return errorCode; 49191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 49201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 49211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 49221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistoreAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, 49231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *ptr, const char *end, 49241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci STRING_POOL *pool) 49251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 49261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, 49271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci end, pool); 49281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result) 49291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 49301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) 49311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolChop(pool); 49321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(pool, XML_T('\0'))) 49331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 49341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 49351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 49361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 49371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 49381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciappendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, 49391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *ptr, const char *end, 49401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci STRING_POOL *pool) 49411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 49421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD * const dtd = _dtd; /* save one level of indirection */ 49431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 49441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next; 49451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok = XmlAttributeValueTok(enc, ptr, end, &next); 49461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (tok) { 49471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_NONE: 49481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NONE; 49491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_INVALID: 49501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 49511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = next; 49521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_INVALID_TOKEN; 49531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL: 49541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 49551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = ptr; 49561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_INVALID_TOKEN; 49571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_CHAR_REF: 49581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 49591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char buf[XML_ENCODE_MAX]; 49601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int i; 49611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int n = XmlCharRefNumber(enc, ptr); 49621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (n < 0) { 49631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 49641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = ptr; 49651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_BAD_CHAR_REF; 49661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 49671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!isCdata 49681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && n == 0x20 /* space */ 49691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) 49701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 49711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci n = XmlEncode(n, (ICHAR *)buf); 49721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!n) { 49731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 49741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = ptr; 49751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_BAD_CHAR_REF; 49761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 49771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; i < n; i++) { 49781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(pool, buf[i])) 49791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 49801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 49811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 49821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 49831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_DATA_CHARS: 49841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppend(pool, enc, ptr, next)) 49851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 49861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 49871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_TRAILING_CR: 49881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next = ptr + enc->minBytesPerChar; 49891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* fall through */ 49901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_ATTRIBUTE_VALUE_S: 49911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_DATA_NEWLINE: 49921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) 49931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 49941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(pool, 0x20)) 49951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 49961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 49971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_ENTITY_REF: 49981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 49991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name; 50001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ENTITY *entity; 50011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char checkEntityDecl; 50021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, 50031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ptr + enc->minBytesPerChar, 50041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next - enc->minBytesPerChar); 50051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ch) { 50061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(pool, ch)) 50071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 50081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 50091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci name = poolStoreString(&temp2Pool, enc, 50111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ptr + enc->minBytesPerChar, 50121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next - enc->minBytesPerChar); 50131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!name) 50141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 50151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); 50161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&temp2Pool); 50171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* First, determine if a check for an existing declaration is needed; 50181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if yes, check that the entity exists, and that it is internal. 50191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 50201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pool == &dtd->pool) /* are we called from prolog? */ 50211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci checkEntityDecl = 50221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 50231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prologState.documentEntity && 50241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 50251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (dtd->standalone 50261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ? !openInternalEntities 50271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : !dtd->hasParamEntityRefs); 50281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else /* if (pool == &tempPool): we are called from content */ 50291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone; 50301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (checkEntityDecl) { 50311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!entity) 50321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNDEFINED_ENTITY; 50331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (!entity->is_internal) 50341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ENTITY_DECLARED_IN_PE; 50351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (!entity) { 50371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Cannot report skipped entity here - see comments on 50381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci skippedEntityHandler. 50391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (skippedEntityHandler) 50401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci skippedEntityHandler(handlerArg, name, 0); 50411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 50421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Cannot call the default handler because this would be 50431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci out of sync with the call to the startElementHandler. 50441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if ((pool == &tempPool) && defaultHandler) 50451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, ptr, next); 50461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 50471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 50481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entity->open) { 50501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 50511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = ptr; 50521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_RECURSIVE_ENTITY_REF; 50531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entity->notation) { 50551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 50561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = ptr; 50571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_BINARY_ENTITY_REF; 50581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!entity->textPtr) { 50601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 50611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = ptr; 50621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; 50631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 50651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result; 50661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *textEnd = entity->textPtr + entity->textLen; 50671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_TRUE; 50681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = appendAttributeValue(parser, internalEncoding, isCdata, 50691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (char *)entity->textPtr, 50701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (char *)textEnd, pool); 50711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_FALSE; 50721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result) 50731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 50741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 50771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 50781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 50791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = ptr; 50801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_UNEXPECTED_STATE; 50811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ptr = next; 50831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 50841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* not reached */ 50851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 50861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 50871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic enum XML_Error 50881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccistoreEntityValue(XML_Parser parser, 50891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ENCODING *enc, 50901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *entityTextPtr, 50911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *entityTextEnd) 50921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 50931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD * const dtd = _dtd; /* save one level of indirection */ 50941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci STRING_POOL *pool = &(dtd->entityValuePool); 50951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum XML_Error result = XML_ERROR_NONE; 50961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 50971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int oldInEntityValue = prologState.inEntityValue; 50981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prologState.inEntityValue = 1; 50991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 51001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* never return Null for the value argument in EntityDeclHandler, 51011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci since this would indicate an external entity; therefore we 51021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci have to make sure that entityValuePool.start is not null */ 51031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!pool->blocks) { 51041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolGrow(pool)) 51051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_ERROR_NO_MEMORY; 51061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 51071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 51091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *next; 51101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next); 51111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (tok) { 51121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARAM_ENTITY_REF: 51131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 51141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (isParamEntity || enc != encoding) { 51151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name; 51161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ENTITY *entity; 51171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci name = poolStoreString(&tempPool, enc, 51181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entityTextPtr + enc->minBytesPerChar, 51191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next - enc->minBytesPerChar); 51201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!name) { 51211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_ERROR_NO_MEMORY; 51221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 51231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 51241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); 51251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&tempPool); 51261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!entity) { 51271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ 51281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* cannot report skipped entity here - see comments on 51291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci skippedEntityHandler 51301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (skippedEntityHandler) 51311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci skippedEntityHandler(handlerArg, name, 0); 51321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 51331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->keepProcessing = dtd->standalone; 51341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 51351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 51361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entity->open) { 51371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 51381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = entityTextPtr; 51391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_ERROR_RECURSIVE_ENTITY_REF; 51401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 51411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 51421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (entity->systemId) { 51431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (externalEntityRefHandler) { 51441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->paramEntityRead = XML_FALSE; 51451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_TRUE; 51461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!externalEntityRefHandler(externalEntityRefHandlerArg, 51471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, 51481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->base, 51491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->systemId, 51501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->publicId)) { 51511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_FALSE; 51521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_ERROR_EXTERNAL_ENTITY_HANDLING; 51531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 51541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 51551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_FALSE; 51561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!dtd->paramEntityRead) 51571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->keepProcessing = dtd->standalone; 51581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 51591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 51601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->keepProcessing = dtd->standalone; 51611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 51621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 51631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_TRUE; 51641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = storeEntityValue(parser, 51651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci internalEncoding, 51661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (char *)entity->textPtr, 51671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (char *)(entity->textPtr 51681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci + entity->textLen)); 51691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entity->open = XML_FALSE; 51701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result) 51711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 51721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 51731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 51741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 51751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 51761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* In the internal subset, PE references are not legal 51771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci within markup declarations, e.g entity values in this case. */ 51781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = entityTextPtr; 51791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_ERROR_PARAM_ENTITY_REF; 51801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 51811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_NONE: 51821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_ERROR_NONE; 51831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 51841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_ENTITY_REF: 51851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_DATA_CHARS: 51861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppend(pool, enc, entityTextPtr, next)) { 51871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_ERROR_NO_MEMORY; 51881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 51891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 51901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 51911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_TRAILING_CR: 51921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next = entityTextPtr + enc->minBytesPerChar; 51931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* fall through */ 51941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_DATA_NEWLINE: 51951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pool->end == pool->ptr && !poolGrow(pool)) { 51961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_ERROR_NO_MEMORY; 51971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 51981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 51991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *(pool->ptr)++ = 0xA; 52001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 52011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_CHAR_REF: 52021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 52031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char buf[XML_ENCODE_MAX]; 52041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int i; 52051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int n = XmlCharRefNumber(enc, entityTextPtr); 52061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (n < 0) { 52071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 52081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = entityTextPtr; 52091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_ERROR_BAD_CHAR_REF; 52101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 52111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 52121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci n = XmlEncode(n, (ICHAR *)buf); 52131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!n) { 52141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 52151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = entityTextPtr; 52161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_ERROR_BAD_CHAR_REF; 52171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 52181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 52191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; i < n; i++) { 52201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pool->end == pool->ptr && !poolGrow(pool)) { 52211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_ERROR_NO_MEMORY; 52221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 52231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 52241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *(pool->ptr)++ = buf[i]; 52251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 52261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 52271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 52281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_PARTIAL: 52291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 52301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = entityTextPtr; 52311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_ERROR_INVALID_TOKEN; 52321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 52331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case XML_TOK_INVALID: 52341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 52351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = next; 52361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_ERROR_INVALID_TOKEN; 52371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 52381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 52391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) 52401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPtr = entityTextPtr; 52411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = XML_ERROR_UNEXPECTED_STATE; 52421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci goto endEntityValue; 52431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 52441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entityTextPtr = next; 52451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 52461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciendEntityValue: 52471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 52481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prologState.inEntityValue = oldInEntityValue; 52491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 52501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 52511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 52521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 52531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL 52541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccinormalizeLines(XML_Char *s) 52551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 52561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *p; 52571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;; s++) { 52581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (*s == XML_T('\0')) 52591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 52601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (*s == 0xD) 52611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 52621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 52631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p = s; 52641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci do { 52651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (*s == 0xD) { 52661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *p++ = 0xA; 52671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (*++s == 0xA) 52681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s++; 52691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 52701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 52711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *p++ = *s++; 52721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } while (*s); 52731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *p = XML_T('\0'); 52741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 52751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 52761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int 52771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccireportProcessingInstruction(XML_Parser parser, const ENCODING *enc, 52781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start, const char *end) 52791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 52801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *target; 52811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *data; 52821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *tem; 52831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!processingInstructionHandler) { 52841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (defaultHandler) 52851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, start, end); 52861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 1; 52871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 52881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci start += enc->minBytesPerChar * 2; 52891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tem = start + XmlNameLength(enc, start); 52901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci target = poolStoreString(&tempPool, enc, start, tem); 52911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!target) 52921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 52931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&tempPool); 52941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data = poolStoreString(&tempPool, enc, 52951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlSkipS(enc, tem), 52961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci end - enc->minBytesPerChar*2); 52971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!data) 52981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 52991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci normalizeLines(data); 53001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci processingInstructionHandler(handlerArg, target, data); 53011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&tempPool); 53021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 1; 53031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 53041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 53051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int 53061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccireportComment(XML_Parser parser, const ENCODING *enc, 53071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start, const char *end) 53081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 53091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *data; 53101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!commentHandler) { 53111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (defaultHandler) 53121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reportDefault(parser, enc, start, end); 53131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 1; 53141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 53151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data = poolStoreString(&tempPool, 53161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enc, 53171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci start + enc->minBytesPerChar * 4, 53181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci end - enc->minBytesPerChar * 3); 53191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!data) 53201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 53211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci normalizeLines(data); 53221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commentHandler(handlerArg, data); 53231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&tempPool); 53241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 1; 53251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 53261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 53271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void 53281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccireportDefault(XML_Parser parser, const ENCODING *enc, 53291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *s, const char *end) 53301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 53311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (MUST_CONVERT(enc, s)) { 53321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **eventPP; 53331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char **eventEndPP; 53341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (enc == encoding) { 53351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPP = &eventPtr; 53361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPP = &eventEndPtr; 53371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 53381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 53391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventPP = &(openInternalEntities->internalEventPtr); 53401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci eventEndPP = &(openInternalEntities->internalEventEndPtr); 53411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 53421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci do { 53431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ICHAR *dataPtr = (ICHAR *)dataBuf; 53441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); 53451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventEndPP = s; 53461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci defaultHandler(handlerArg, dataBuf, (int)(dataPtr - (ICHAR *)dataBuf)); 53471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *eventPP = s; 53481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } while (s != end); 53491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 53501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 53511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci defaultHandler(handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s)); 53521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 53531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 53541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 53551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int 53561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidefineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, 53571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool isId, const XML_Char *value, XML_Parser parser) 53581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 53591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DEFAULT_ATTRIBUTE *att; 53601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (value || isId) { 53611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* The handling of default attributes gets messed up if we have 53621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a default which duplicates a non-default. */ 53631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int i; 53641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; i < type->nDefaultAtts; i++) 53651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (attId == type->defaultAtts[i].id) 53661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 1; 53671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (isId && !type->idAtt && !attId->xmlns) 53681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci type->idAtt = attId; 53691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 53701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (type->nDefaultAtts == type->allocDefaultAtts) { 53711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (type->allocDefaultAtts == 0) { 53721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci type->allocDefaultAtts = 8; 53731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts 53741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * sizeof(DEFAULT_ATTRIBUTE)); 53751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!type->defaultAtts) 53761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 53771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 53781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 53791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DEFAULT_ATTRIBUTE *temp; 53801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int count = type->allocDefaultAtts * 2; 53811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci temp = (DEFAULT_ATTRIBUTE *) 53821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE))); 53831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (temp == NULL) 53841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 53851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci type->allocDefaultAtts = count; 53861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci type->defaultAtts = temp; 53871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 53881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 53891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci att = type->defaultAtts + type->nDefaultAtts; 53901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci att->id = attId; 53911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci att->value = value; 53921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci att->isCdata = isCdata; 53931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!isCdata) 53941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci attId->maybeTokenized = XML_TRUE; 53951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci type->nDefaultAtts += 1; 53961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 1; 53971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 53981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 53991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int 54001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccisetElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) 54011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 54021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD * const dtd = _dtd; /* save one level of indirection */ 54031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name; 54041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (name = elementType->name; *name; name++) { 54051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (*name == XML_T(ASCII_COLON)) { 54061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PREFIX *prefix; 54071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *s; 54081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (s = elementType->name; s != name; s++) { 54091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&dtd->pool, *s)) 54101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 54111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 54121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&dtd->pool, XML_T('\0'))) 54131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 54141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), 54151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(PREFIX)); 54161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!prefix) 54171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 54181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (prefix->name == poolStart(&dtd->pool)) 54191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&dtd->pool); 54201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 54211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&dtd->pool); 54221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci elementType->prefix = prefix; 54231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 54241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 54251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 54261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 1; 54271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 54281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 54291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic ATTRIBUTE_ID * 54301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccigetAttributeId(XML_Parser parser, const ENCODING *enc, 54311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *start, const char *end) 54321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 54331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD * const dtd = _dtd; /* save one level of indirection */ 54341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ATTRIBUTE_ID *id; 54351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name; 54361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&dtd->pool, XML_T('\0'))) 54371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 54381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci name = poolStoreString(&dtd->pool, enc, start, end); 54391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!name) 54401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 54411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* skip quotation mark - its storage will be re-used (like in name[-1]) */ 54421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++name; 54431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); 54441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!id) 54451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 54461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (id->name != name) 54471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&dtd->pool); 54481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 54491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&dtd->pool); 54501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ns) 54511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ; 54521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (name[0] == XML_T(ASCII_x) 54531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && name[1] == XML_T(ASCII_m) 54541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && name[2] == XML_T(ASCII_l) 54551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && name[3] == XML_T(ASCII_n) 54561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && name[4] == XML_T(ASCII_s) 54571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) { 54581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (name[5] == XML_T('\0')) 54591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci id->prefix = &dtd->defaultPrefix; 54601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 54611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, sizeof(PREFIX)); 54621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci id->xmlns = XML_TRUE; 54631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 54641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 54651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int i; 54661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; name[i]; i++) { 54671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* attributes without prefix are *not* in the default namespace */ 54681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (name[i] == XML_T(ASCII_COLON)) { 54691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int j; 54701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (j = 0; j < i; j++) { 54711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&dtd->pool, name[j])) 54721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 54731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 54741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&dtd->pool, XML_T('\0'))) 54751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 54761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), 54771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(PREFIX)); 54781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (id->prefix->name == poolStart(&dtd->pool)) 54791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&dtd->pool); 54801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 54811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&dtd->pool); 54821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 54831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 54841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 54851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 54861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 54871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return id; 54881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 54891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 54901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CONTEXT_SEP XML_T(ASCII_FF) 54911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 54921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char * 54931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccigetContext(XML_Parser parser) 54941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 54951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD * const dtd = _dtd; /* save one level of indirection */ 54961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HASH_TABLE_ITER iter; 54971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Bool needSep = XML_FALSE; 54981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 54991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->defaultPrefix.binding) { 55001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int i; 55011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int len; 55021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS))) 55031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 55041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci len = dtd->defaultPrefix.binding->uriLen; 55051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (namespaceSeparator) 55061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci len--; 55071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; i < len; i++) 55081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i])) 55091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 55101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci needSep = XML_TRUE; 55111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 55121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 55131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableIterInit(&iter, &(dtd->prefixes)); 55141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 55151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int i; 55161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int len; 55171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *s; 55181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter); 55191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!prefix) 55201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 55211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!prefix->binding) 55221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci continue; 55231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) 55241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 55251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (s = prefix->name; *s; s++) 55261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, *s)) 55271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 55281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS))) 55291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 55301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci len = prefix->binding->uriLen; 55311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (namespaceSeparator) 55321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci len--; 55331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; i < len; i++) 55341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, prefix->binding->uri[i])) 55351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 55361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci needSep = XML_TRUE; 55371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 55381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 55391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 55401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableIterInit(&iter, &(dtd->generalEntities)); 55411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 55421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *s; 55431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ENTITY *e = (ENTITY *)hashTableIterNext(&iter); 55441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!e) 55451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 55461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!e->open) 55471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci continue; 55481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) 55491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 55501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (s = e->name; *s; s++) 55511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, *s)) 55521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 55531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci needSep = XML_TRUE; 55541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 55551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 55561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, XML_T('\0'))) 55571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 55581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return tempPool.start; 55591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 55601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 55611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool 55621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccisetContext(XML_Parser parser, const XML_Char *context) 55631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 55641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD * const dtd = _dtd; /* save one level of indirection */ 55651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *s = context; 55661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 55671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (*context != XML_T('\0')) { 55681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (*s == CONTEXT_SEP || *s == XML_T('\0')) { 55691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ENTITY *e; 55701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, XML_T('\0'))) 55711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_FALSE; 55721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&tempPool), 0); 55731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (e) 55741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci e->open = XML_TRUE; 55751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (*s != XML_T('\0')) 55761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s++; 55771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context = s; 55781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&tempPool); 55791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 55801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (*s == XML_T(ASCII_EQUALS)) { 55811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PREFIX *prefix; 55821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (poolLength(&tempPool) == 0) 55831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefix = &dtd->defaultPrefix; 55841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 55851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, XML_T('\0'))) 55861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_FALSE; 55871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&tempPool), 55881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(PREFIX)); 55891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!prefix) 55901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_FALSE; 55911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (prefix->name == poolStart(&tempPool)) { 55921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefix->name = poolCopyString(&dtd->pool, prefix->name); 55931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!prefix->name) 55941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_FALSE; 55951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 55961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&tempPool); 55971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 55981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (context = s + 1; 55991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *context != CONTEXT_SEP && *context != XML_T('\0'); 56001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context++) 56011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, *context)) 56021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_FALSE; 56031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, XML_T('\0'))) 56041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_FALSE; 56051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (addBinding(parser, prefix, NULL, poolStart(&tempPool), 56061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &inheritedBindings) != XML_ERROR_NONE) 56071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_FALSE; 56081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&tempPool); 56091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (*context != XML_T('\0')) 56101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++context; 56111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s = context; 56121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 56131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 56141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&tempPool, *s)) 56151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_FALSE; 56161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s++; 56171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 56181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 56191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_TRUE; 56201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 56211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 56221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL 56231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccinormalizePublicId(XML_Char *publicId) 56241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 56251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *p = publicId; 56261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char *s; 56271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (s = publicId; *s; s++) { 56281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (*s) { 56291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case 0x20: 56301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case 0xD: 56311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case 0xA: 56321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (p != publicId && p[-1] != 0x20) 56331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *p++ = 0x20; 56341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 56351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 56361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *p++ = *s; 56371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 56381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 56391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (p != publicId && p[-1] == 0x20) 56401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci --p; 56411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *p = XML_T('\0'); 56421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 56431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 56441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic DTD * 56451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidtdCreate(const XML_Memory_Handling_Suite *ms) 56461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 56471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD)); 56481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (p == NULL) 56491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return p; 56501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolInit(&(p->pool), ms); 56511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolInit(&(p->entityValuePool), ms); 56521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableInit(&(p->generalEntities), ms); 56531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableInit(&(p->elementTypes), ms); 56541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableInit(&(p->attributeIds), ms); 56551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableInit(&(p->prefixes), ms); 56561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 56571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->paramEntityRead = XML_FALSE; 56581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableInit(&(p->paramEntities), ms); 56591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 56601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->defaultPrefix.name = NULL; 56611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->defaultPrefix.binding = NULL; 56621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 56631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->in_eldecl = XML_FALSE; 56641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->scaffIndex = NULL; 56651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->scaffold = NULL; 56661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->scaffLevel = 0; 56671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->scaffSize = 0; 56681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->scaffCount = 0; 56691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->contentStringLen = 0; 56701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 56711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->keepProcessing = XML_TRUE; 56721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->hasParamEntityRefs = XML_FALSE; 56731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->standalone = XML_FALSE; 56741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return p; 56751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 56761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 56771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void 56781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) 56791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 56801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HASH_TABLE_ITER iter; 56811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableIterInit(&iter, &(p->elementTypes)); 56821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 56831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); 56841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!e) 56851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 56861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (e->allocDefaultAtts != 0) 56871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ms->free_fcn(e->defaultAtts); 56881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 56891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableClear(&(p->generalEntities)); 56901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 56911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->paramEntityRead = XML_FALSE; 56921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableClear(&(p->paramEntities)); 56931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 56941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableClear(&(p->elementTypes)); 56951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableClear(&(p->attributeIds)); 56961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableClear(&(p->prefixes)); 56971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&(p->pool)); 56981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolClear(&(p->entityValuePool)); 56991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->defaultPrefix.name = NULL; 57001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->defaultPrefix.binding = NULL; 57011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 57021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->in_eldecl = XML_FALSE; 57031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 57041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ms->free_fcn(p->scaffIndex); 57051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->scaffIndex = NULL; 57061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ms->free_fcn(p->scaffold); 57071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->scaffold = NULL; 57081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 57091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->scaffLevel = 0; 57101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->scaffSize = 0; 57111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->scaffCount = 0; 57121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->contentStringLen = 0; 57131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 57141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->keepProcessing = XML_TRUE; 57151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->hasParamEntityRefs = XML_FALSE; 57161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->standalone = XML_FALSE; 57171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 57181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 57191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void 57201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) 57211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 57221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HASH_TABLE_ITER iter; 57231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableIterInit(&iter, &(p->elementTypes)); 57241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 57251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); 57261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!e) 57271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 57281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (e->allocDefaultAtts != 0) 57291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ms->free_fcn(e->defaultAtts); 57301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 57311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableDestroy(&(p->generalEntities)); 57321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 57331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableDestroy(&(p->paramEntities)); 57341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 57351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableDestroy(&(p->elementTypes)); 57361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableDestroy(&(p->attributeIds)); 57371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableDestroy(&(p->prefixes)); 57381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDestroy(&(p->pool)); 57391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDestroy(&(p->entityValuePool)); 57401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (isDocEntity) { 57411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ms->free_fcn(p->scaffIndex); 57421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ms->free_fcn(p->scaffold); 57431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 57441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ms->free_fcn(p); 57451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 57461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 57471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise. 57481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci The new DTD has already been initialized. 57491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci*/ 57501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int 57511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccidtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) 57521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 57531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HASH_TABLE_ITER iter; 57541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 57551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Copy the prefix table. */ 57561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 57571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableIterInit(&iter, &(oldDtd->prefixes)); 57581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 57591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name; 57601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); 57611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!oldP) 57621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 57631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci name = poolCopyString(&(newDtd->pool), oldP->name); 57641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!name) 57651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 57661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX))) 57671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 57681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 57691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 57701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableIterInit(&iter, &(oldDtd->attributeIds)); 57711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 57721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Copy the attribute id table. */ 57731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 57741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 57751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ATTRIBUTE_ID *newA; 57761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name; 57771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); 57781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 57791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!oldA) 57801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 57811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Remember to allocate the scratch byte before the name. */ 57821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) 57831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 57841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci name = poolCopyString(&(newDtd->pool), oldA->name); 57851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!name) 57861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 57871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++name; 57881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newA = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), name, 57891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(ATTRIBUTE_ID)); 57901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!newA) 57911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 57921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newA->maybeTokenized = oldA->maybeTokenized; 57931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (oldA->prefix) { 57941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newA->xmlns = oldA->xmlns; 57951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (oldA->prefix == &oldDtd->defaultPrefix) 57961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newA->prefix = &newDtd->defaultPrefix; 57971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 57981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newA->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes), 57991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci oldA->prefix->name, 0); 58001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 58011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 58021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 58031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Copy the element type table. */ 58041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 58051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableIterInit(&iter, &(oldDtd->elementTypes)); 58061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 58071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 58081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int i; 58091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ELEMENT_TYPE *newE; 58101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name; 58111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); 58121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!oldE) 58131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 58141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci name = poolCopyString(&(newDtd->pool), oldE->name); 58151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!name) 58161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 58171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE = (ELEMENT_TYPE *)lookup(oldParser, &(newDtd->elementTypes), name, 58181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(ELEMENT_TYPE)); 58191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!newE) 58201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 58211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (oldE->nDefaultAtts) { 58221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->defaultAtts = (DEFAULT_ATTRIBUTE *) 58231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); 58241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!newE->defaultAtts) { 58251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ms->free_fcn(newE); 58261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 58271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 58281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 58291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (oldE->idAtt) 58301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->idAtt = (ATTRIBUTE_ID *) 58311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci lookup(oldParser, &(newDtd->attributeIds), oldE->idAtt->name, 0); 58321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; 58331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (oldE->prefix) 58341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes), 58351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci oldE->prefix->name, 0); 58361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; i < newE->nDefaultAtts; i++) { 58371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->defaultAtts[i].id = (ATTRIBUTE_ID *) 58381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci lookup(oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); 58391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; 58401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (oldE->defaultAtts[i].value) { 58411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->defaultAtts[i].value 58421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); 58431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!newE->defaultAtts[i].value) 58441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 58451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 58461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 58471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->defaultAtts[i].value = NULL; 58481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 58491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 58501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 58511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Copy the entity tables. */ 58521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!copyEntityTable(oldParser, 58531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &(newDtd->generalEntities), 58541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &(newDtd->pool), 58551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &(oldDtd->generalEntities))) 58561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 58571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 58581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef XML_DTD 58591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!copyEntityTable(oldParser, 58601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &(newDtd->paramEntities), 58611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &(newDtd->pool), 58621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &(oldDtd->paramEntities))) 58631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 58641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newDtd->paramEntityRead = oldDtd->paramEntityRead; 58651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif /* XML_DTD */ 58661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 58671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newDtd->keepProcessing = oldDtd->keepProcessing; 58681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs; 58691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newDtd->standalone = oldDtd->standalone; 58701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 58711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Don't want deep copying for scaffolding */ 58721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newDtd->in_eldecl = oldDtd->in_eldecl; 58731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newDtd->scaffold = oldDtd->scaffold; 58741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newDtd->contentStringLen = oldDtd->contentStringLen; 58751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newDtd->scaffSize = oldDtd->scaffSize; 58761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newDtd->scaffLevel = oldDtd->scaffLevel; 58771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newDtd->scaffIndex = oldDtd->scaffIndex; 58781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 58791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 1; 58801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} /* End dtdCopy */ 58811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 58821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int 58831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccicopyEntityTable(XML_Parser oldParser, 58841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HASH_TABLE *newTable, 58851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci STRING_POOL *newPool, 58861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const HASH_TABLE *oldTable) 58871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 58881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HASH_TABLE_ITER iter; 58891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *cachedOldBase = NULL; 58901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *cachedNewBase = NULL; 58911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 58921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci hashTableIterInit(&iter, oldTable); 58931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 58941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 58951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ENTITY *newE; 58961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name; 58971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); 58981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!oldE) 58991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 59001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci name = poolCopyString(newPool, oldE->name); 59011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!name) 59021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 59031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE = (ENTITY *)lookup(oldParser, newTable, name, sizeof(ENTITY)); 59041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!newE) 59051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 59061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (oldE->systemId) { 59071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *tem = poolCopyString(newPool, oldE->systemId); 59081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!tem) 59091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 59101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->systemId = tem; 59111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (oldE->base) { 59121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (oldE->base == cachedOldBase) 59131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->base = cachedNewBase; 59141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 59151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cachedOldBase = oldE->base; 59161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tem = poolCopyString(newPool, cachedOldBase); 59171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!tem) 59181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 59191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cachedNewBase = newE->base = tem; 59201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 59211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 59221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (oldE->publicId) { 59231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tem = poolCopyString(newPool, oldE->publicId); 59241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!tem) 59251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 59261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->publicId = tem; 59271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 59281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 59291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 59301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr, 59311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci oldE->textLen); 59321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!tem) 59331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 59341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->textPtr = tem; 59351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->textLen = oldE->textLen; 59361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 59371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (oldE->notation) { 59381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *tem = poolCopyString(newPool, oldE->notation); 59391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!tem) 59401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 59411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->notation = tem; 59421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 59431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->is_param = oldE->is_param; 59441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newE->is_internal = oldE->is_internal; 59451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 59461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 1; 59471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 59481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 59491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define INIT_POWER 6 59501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 59511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool FASTCALL 59521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccikeyeq(KEY s1, KEY s2) 59531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 59541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (; *s1 == *s2; s1++, s2++) 59551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (*s1 == 0) 59561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_TRUE; 59571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_FALSE; 59581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 59591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 59601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic unsigned long FASTCALL 59611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccihash(XML_Parser parser, KEY s) 59621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 59631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long h = hash_secret_salt; 59641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (*s) 59651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci h = CHAR_HASH(h, *s++); 59661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return h; 59671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 59681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 59691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic NAMED * 59701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccilookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) 59711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 59721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t i; 59731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (table->size == 0) { 59741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t tsize; 59751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!createSize) 59761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 59771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->power = INIT_POWER; 59781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* table->size is a power of 2 */ 59791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->size = (size_t)1 << INIT_POWER; 59801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tsize = table->size * sizeof(NAMED *); 59811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->v = (NAMED **)table->mem->malloc_fcn(tsize); 59821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!table->v) { 59831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->size = 0; 59841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 59851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 59861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memset(table->v, 0, tsize); 59871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i = hash(parser, name) & ((unsigned long)table->size - 1); 59881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 59891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 59901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long h = hash(parser, name); 59911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long mask = (unsigned long)table->size - 1; 59921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned char step = 0; 59931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i = h & mask; 59941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (table->v[i]) { 59951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (keyeq(name, table->v[i]->name)) 59961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return table->v[i]; 59971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!step) 59981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci step = PROBE_STEP(h, mask, table->power); 59991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i < step ? (i += table->size - step) : (i -= step); 60001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 60011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!createSize) 60021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 60031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 60041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* check for overflow (table is half full) */ 60051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (table->used >> (table->power - 1)) { 60061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned char newPower = table->power + 1; 60071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t newSize = (size_t)1 << newPower; 60081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long newMask = (unsigned long)newSize - 1; 60091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t tsize = newSize * sizeof(NAMED *); 60101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize); 60111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!newV) 60121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 60131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memset(newV, 0, tsize); 60141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; i < table->size; i++) 60151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (table->v[i]) { 60161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long newHash = hash(parser, table->v[i]->name); 60171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t j = newHash & newMask; 60181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci step = 0; 60191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (newV[j]) { 60201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!step) 60211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci step = PROBE_STEP(newHash, newMask, newPower); 60221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci j < step ? (j += newSize - step) : (j -= step); 60231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 60241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newV[j] = table->v[i]; 60251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 60261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->mem->free_fcn(table->v); 60271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->v = newV; 60281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->power = newPower; 60291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->size = newSize; 60301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i = h & newMask; 60311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci step = 0; 60321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (table->v[i]) { 60331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!step) 60341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci step = PROBE_STEP(h, newMask, newPower); 60351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i < step ? (i += newSize - step) : (i -= step); 60361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 60371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 60381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 60391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize); 60401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!table->v[i]) 60411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 60421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memset(table->v[i], 0, createSize); 60431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->v[i]->name = name; 60441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (table->used)++; 60451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return table->v[i]; 60461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 60471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 60481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL 60491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihashTableClear(HASH_TABLE *table) 60501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 60511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t i; 60521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; i < table->size; i++) { 60531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->mem->free_fcn(table->v[i]); 60541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->v[i] = NULL; 60551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 60561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->used = 0; 60571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 60581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 60591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL 60601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihashTableDestroy(HASH_TABLE *table) 60611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 60621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t i; 60631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0; i < table->size; i++) 60641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->mem->free_fcn(table->v[i]); 60651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table->mem->free_fcn(table->v); 60661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 60671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 60681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL 60691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) 60701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 60711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->power = 0; 60721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->size = 0; 60731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->used = 0; 60741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->v = NULL; 60751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->mem = ms; 60761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 60771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 60781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL 60791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) 60801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 60811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci iter->p = table->v; 60821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci iter->end = iter->p + table->size; 60831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 60841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 60851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic NAMED * FASTCALL 60861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccihashTableIterNext(HASH_TABLE_ITER *iter) 60871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 60881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (iter->p != iter->end) { 60891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NAMED *tem = *(iter->p)++; 60901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (tem) 60911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return tem; 60921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 60931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 60941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 60951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 60961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL 60971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) 60981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 60991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->blocks = NULL; 61001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->freeBlocks = NULL; 61011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->start = NULL; 61021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->ptr = NULL; 61031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->end = NULL; 61041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->mem = ms; 61051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 61061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 61071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL 61081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolClear(STRING_POOL *pool) 61091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 61101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!pool->freeBlocks) 61111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->freeBlocks = pool->blocks; 61121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 61131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BLOCK *p = pool->blocks; 61141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (p) { 61151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BLOCK *tem = p->next; 61161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p->next = pool->freeBlocks; 61171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->freeBlocks = p; 61181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p = tem; 61191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 61201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 61211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->blocks = NULL; 61221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->start = NULL; 61231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->ptr = NULL; 61241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->end = NULL; 61251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 61261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 61271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void FASTCALL 61281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolDestroy(STRING_POOL *pool) 61291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 61301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BLOCK *p = pool->blocks; 61311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (p) { 61321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BLOCK *tem = p->next; 61331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->mem->free_fcn(p); 61341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p = tem; 61351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 61361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p = pool->freeBlocks; 61371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (p) { 61381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BLOCK *tem = p->next; 61391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->mem->free_fcn(p); 61401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci p = tem; 61411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 61421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 61431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 61441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Char * 61451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolAppend(STRING_POOL *pool, const ENCODING *enc, 61461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *ptr, const char *end) 61471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 61481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!pool->ptr && !poolGrow(pool)) 61491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 61501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 61511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); 61521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ptr == end) 61531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 61541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolGrow(pool)) 61551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 61561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 61571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return pool->start; 61581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 61591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 61601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char * FASTCALL 61611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolCopyString(STRING_POOL *pool, const XML_Char *s) 61621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 61631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci do { 61641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(pool, *s)) 61651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 61661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } while (*s++); 61671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s = pool->start; 61681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(pool); 61691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return s; 61701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 61711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 61721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char * 61731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) 61741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 61751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!pool->ptr && !poolGrow(pool)) 61761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 61771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (; n > 0; --n, s++) { 61781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(pool, *s)) 61791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 61801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 61811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s = pool->start; 61821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(pool); 61831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return s; 61841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 61851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 61861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const XML_Char * FASTCALL 61871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolAppendString(STRING_POOL *pool, const XML_Char *s) 61881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 61891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (*s) { 61901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppendChar(pool, *s)) 61911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 61921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci s++; 61931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 61941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return pool->start; 61951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 61961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 61971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Char * 61981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolStoreString(STRING_POOL *pool, const ENCODING *enc, 61991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *ptr, const char *end) 62001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 62011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!poolAppend(pool, enc, ptr, end)) 62021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 62031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pool->ptr == pool->end && !poolGrow(pool)) 62041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 62051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *(pool->ptr)++ = 0; 62061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return pool->start; 62071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 62081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 62091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Bool FASTCALL 62101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccipoolGrow(STRING_POOL *pool) 62111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 62121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pool->freeBlocks) { 62131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pool->start == 0) { 62141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->blocks = pool->freeBlocks; 62151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->freeBlocks = pool->freeBlocks->next; 62161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->blocks->next = NULL; 62171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->start = pool->blocks->s; 62181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->end = pool->start + pool->blocks->size; 62191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->ptr = pool->start; 62201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_TRUE; 62211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 62221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pool->end - pool->start < pool->freeBlocks->size) { 62231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BLOCK *tem = pool->freeBlocks->next; 62241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->freeBlocks->next = pool->blocks; 62251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->blocks = pool->freeBlocks; 62261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->freeBlocks = tem; 62271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memcpy(pool->blocks->s, pool->start, 62281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (pool->end - pool->start) * sizeof(XML_Char)); 62291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->ptr = pool->blocks->s + (pool->ptr - pool->start); 62301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->start = pool->blocks->s; 62311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->end = pool->start + pool->blocks->size; 62321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_TRUE; 62331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 62341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 62351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pool->blocks && pool->start == pool->blocks->s) { 62361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int blockSize = (int)(pool->end - pool->start)*2; 62371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BLOCK *temp = (BLOCK *) 62381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->mem->realloc_fcn(pool->blocks, 62391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (offsetof(BLOCK, s) 62401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci + blockSize * sizeof(XML_Char))); 62411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (temp == NULL) 62421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_FALSE; 62431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->blocks = temp; 62441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->blocks->size = blockSize; 62451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->ptr = pool->blocks->s + (pool->ptr - pool->start); 62461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->start = pool->blocks->s; 62471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->end = pool->start + blockSize; 62481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 62491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 62501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BLOCK *tem; 62511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int blockSize = (int)(pool->end - pool->start); 62521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (blockSize < INIT_BLOCK_SIZE) 62531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blockSize = INIT_BLOCK_SIZE; 62541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 62551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blockSize *= 2; 62561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s) 62571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci + blockSize * sizeof(XML_Char)); 62581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!tem) 62591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_FALSE; 62601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tem->size = blockSize; 62611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tem->next = pool->blocks; 62621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->blocks = tem; 62631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pool->ptr != pool->start) 62641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci memcpy(tem->s, pool->start, 62651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (pool->ptr - pool->start) * sizeof(XML_Char)); 62661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->ptr = tem->s + (pool->ptr - pool->start); 62671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->start = tem->s; 62681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pool->end = tem->s + blockSize; 62691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 62701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return XML_TRUE; 62711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 62721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 62731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int FASTCALL 62741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccinextScaffoldPart(XML_Parser parser) 62751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 62761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD * const dtd = _dtd; /* save one level of indirection */ 62771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CONTENT_SCAFFOLD * me; 62781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int next; 62791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 62801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!dtd->scaffIndex) { 62811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int)); 62821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!dtd->scaffIndex) 62831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return -1; 62841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffIndex[0] = 0; 62851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 62861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 62871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->scaffCount >= dtd->scaffSize) { 62881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CONTENT_SCAFFOLD *temp; 62891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->scaffold) { 62901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci temp = (CONTENT_SCAFFOLD *) 62911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD)); 62921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (temp == NULL) 62931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return -1; 62941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffSize *= 2; 62951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 62961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 62971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS 62981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * sizeof(CONTENT_SCAFFOLD)); 62991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (temp == NULL) 63001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return -1; 63011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS; 63021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 63031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffold = temp; 63041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 63051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next = dtd->scaffCount++; 63061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci me = &dtd->scaffold[next]; 63071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dtd->scaffLevel) { 63081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]]; 63091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (parent->lastchild) { 63101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dtd->scaffold[parent->lastchild].nextsib = next; 63111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 63121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!parent->childcnt) 63131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parent->firstchild = next; 63141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parent->lastchild = next; 63151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parent->childcnt++; 63161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 63171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0; 63181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return next; 63191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 63201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 63211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void 63221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibuild_node(XML_Parser parser, 63231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int src_node, 63241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Content *dest, 63251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Content **contpos, 63261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char **strpos) 63271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 63281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD * const dtd = _dtd; /* save one level of indirection */ 63291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dest->type = dtd->scaffold[src_node].type; 63301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dest->quant = dtd->scaffold[src_node].quant; 63311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dest->type == XML_CTYPE_NAME) { 63321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *src; 63331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dest->name = *strpos; 63341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci src = dtd->scaffold[src_node].name; 63351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (;;) { 63361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *(*strpos)++ = *src; 63371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!*src) 63381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 63391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci src++; 63401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 63411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dest->numchildren = 0; 63421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dest->children = NULL; 63431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 63441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 63451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned int i; 63461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int cn; 63471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dest->numchildren = dtd->scaffold[src_node].childcnt; 63481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dest->children = *contpos; 63491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *contpos += dest->numchildren; 63501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i = 0, cn = dtd->scaffold[src_node].firstchild; 63511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i < dest->numchildren; 63521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i++, cn = dtd->scaffold[cn].nextsib) { 63531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci build_node(parser, cn, &(dest->children[i]), contpos, strpos); 63541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 63551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dest->name = NULL; 63561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 63571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 63581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 63591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic XML_Content * 63601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibuild_model (XML_Parser parser) 63611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 63621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD * const dtd = _dtd; /* save one level of indirection */ 63631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Content *ret; 63641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Content *cpos; 63651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XML_Char * str; 63661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int allocsize = (dtd->scaffCount * sizeof(XML_Content) 63671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci + (dtd->contentStringLen * sizeof(XML_Char))); 63681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 63691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ret = (XML_Content *)MALLOC(allocsize); 63701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ret) 63711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 63721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 63731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci str = (XML_Char *) (&ret[dtd->scaffCount]); 63741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cpos = &ret[1]; 63751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 63761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci build_node(parser, 0, ret, &cpos, &str); 63771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return ret; 63781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 63791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 63801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic ELEMENT_TYPE * 63811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccigetElementType(XML_Parser parser, 63821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ENCODING *enc, 63831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *ptr, 63841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char *end) 63851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 63861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DTD * const dtd = _dtd; /* save one level of indirection */ 63871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end); 63881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ELEMENT_TYPE *ret; 63891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 63901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!name) 63911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 63921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ret = (ELEMENT_TYPE *) lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); 63931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ret) 63941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 63951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ret->name != name) 63961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolDiscard(&dtd->pool); 63971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else { 63981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci poolFinish(&dtd->pool); 63991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!setElementTypePrefix(parser, ret)) 64001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 64011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 64021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return ret; 64031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6404