xmlparse.c revision fc03a94aaccc9ae606ee3438ca21d65a335d43e9
1fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd 2fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis See the file COPYING for copying permission. 31dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis*/ 41dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* Added to look for memcpy */ 6fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include <Python.h> 7fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 8fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include <stddef.h> 9fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include <string.h> /* memset(), memcpy() */ 10fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef COMPILED_FROM_DSP 12fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 13fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include "winconfig.h" 14fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define XMLPARSEAPI(type) type __cdecl 15fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include "expat.h" 16fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#undef XMLPARSEAPI 17fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 18fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#elif defined(MACOS_CLASSIC) 19fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 20fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include "macconfig.h" 21fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include "expat.h" 22fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else 24fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 25fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* Unused - MvL 26fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include <expat_config.h> 27fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/ 281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef __declspec 30fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define XMLPARSEAPI(type) type __cdecl 311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif 321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#include "expat.h" 341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef __declspec 36fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#undef XMLPARSEAPI 371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif 381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* ndef COMPILED_FROM_DSP */ 391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_UNICODE 411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX 421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlConvert XmlUtf16Convert 431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding 441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS 451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlEncode XmlUtf16Encode 461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1)) 471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef unsigned short ICHAR; 481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else 491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX 501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlConvert XmlUtf8Convert 511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding 521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS 531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlEncode XmlUtf8Encode 541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define MUST_CONVERT(enc, s) (!(enc)->isUtf8) 551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef char ICHAR; 561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif 571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifndef XML_NS 601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlInitEncodingNS XmlInitEncoding 621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding 631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#undef XmlGetInternalEncodingNS 641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlGetInternalEncodingNS XmlGetInternalEncoding 651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XmlParseXmlDeclNS XmlParseXmlDecl 661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif 681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 69fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_UNICODE 70fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_UNICODE_WCHAR_T 72fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define XML_T(x) (const wchar_t)x 73fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define XML_L(x) L ## x 74fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#else 75fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define XML_T(x) (const unsigned short)x 76fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define XML_L(x) x 77fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif 78fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else 80fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define XML_T(x) x 82fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define XML_L(x) x 83fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif 851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis/* Round up n to be a multiple of sz, where sz is a power of 2. */ 871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1)) 881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 89fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* Handle the case where memmove() doesn't exist. */ 90fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifndef HAVE_MEMMOVE 91fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef HAVE_BCOPY 92fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define memmove(d,s,l) bcopy((s),(d),(l)) 93fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#else 94fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#error memmove does not exist on this platform, nor is a substitute available 95fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* HAVE_BCOPY */ 96fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* HAVE_MEMMOVE */ 97fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 98fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#include "internal.h" 991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#include "xmltok.h" 1001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#include "xmlrole.h" 1011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef const XML_Char *KEY; 1031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct { 1051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis KEY name; 1061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} NAMED; 1071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct { 1091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis NAMED **v; 1101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis size_t size; 1111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis size_t used; 1121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis size_t usedLim; 113fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Memory_Handling_Suite *mem; 1141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} HASH_TABLE; 1151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct { 1171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis NAMED **p; 1181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis NAMED **end; 1191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} HASH_TABLE_ITER; 1201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ 1221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define INIT_DATA_BUF_SIZE 1024 1231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define INIT_ATTS_SIZE 16 1241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define INIT_BLOCK_SIZE 1024 1251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define INIT_BUFFER_SIZE 1024 1261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define EXPAND_SPARE 24 1281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct binding { 1301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis struct prefix *prefix; 1311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis struct binding *nextTagBinding; 1321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis struct binding *prevPrefixBinding; 1331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const struct attribute_id *attId; 1341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char *uri; 1351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int uriLen; 1361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int uriAlloc; 1371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} BINDING; 1381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct prefix { 1401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *name; 1411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BINDING *binding; 1421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} PREFIX; 1431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct { 1451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *str; 1461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *localPart; 147fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *prefix; 148fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int strLen; 1491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int uriLen; 150fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int prefixLen; 1511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} TAG_NAME; 1521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 153fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* TAG represents an open element. 154fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis The name of the element is stored in both the document and API 155fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis encodings. The memory buffer 'buf' is a separately-allocated 156fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis memory area which stores the name. During the XML_Parse()/ 157fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XMLParseBuffer() when the element is open, the memory for the 'raw' 158fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis version of the name (in the document encoding) is shared with the 159fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis document buffer. If the element is open across calls to 160fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to 161fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis contain the 'raw' name as well. 162fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 163fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis A parser re-uses these structures, maintaining a list of allocated 164fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis TAG objects in a free list. 165fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/ 1661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct tag { 167fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis struct tag *parent; /* parent of this element */ 168fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *rawName; /* tagName in the original encoding */ 1691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int rawNameLength; 170fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis TAG_NAME name; /* tagName in the API encoding */ 171fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis char *buf; /* buffer for name components */ 172fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis char *bufEnd; /* end of the buffer */ 1731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BINDING *bindings; 1741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} TAG; 1751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct { 1771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *name; 1781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *textPtr; 1791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int textLen; 1801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *systemId; 1811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *base; 1821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *publicId; 1831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *notation; 184fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool open; 185fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool is_param; 186fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool is_internal; /* true if declared in internal subset outside PE */ 1871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} ENTITY; 1881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct { 190fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Content_Type type; 191fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Content_Quant quant; 192fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char * name; 193fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int firstchild; 194fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int lastchild; 195fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int childcnt; 196fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int nextsib; 1971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} CONTENT_SCAFFOLD; 1981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 199fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define INIT_SCAFFOLD_ELEMENTS 32 200fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 2011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct block { 2021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis struct block *next; 2031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int size; 2041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char s[1]; 2051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} BLOCK; 2061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 2071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct { 2081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BLOCK *blocks; 2091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BLOCK *freeBlocks; 2101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *end; 2111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char *ptr; 2121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char *start; 213fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Memory_Handling_Suite *mem; 2141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} STRING_POOL; 2151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 2161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis/* The XML_Char before the name is used to determine whether 217fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis an attribute has been specified. */ 2181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct attribute_id { 2191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char *name; 2201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis PREFIX *prefix; 221fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool maybeTokenized; 222fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool xmlns; 2231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} ATTRIBUTE_ID; 2241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 2251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct { 2261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const ATTRIBUTE_ID *id; 227fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool isCdata; 2281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *value; 2291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} DEFAULT_ATTRIBUTE; 2301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 2311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct { 2321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *name; 2331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis PREFIX *prefix; 2341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const ATTRIBUTE_ID *idAtt; 2351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int nDefaultAtts; 2361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int allocDefaultAtts; 2371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis DEFAULT_ATTRIBUTE *defaultAtts; 2381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} ELEMENT_TYPE; 2391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 2401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct { 2411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis HASH_TABLE generalEntities; 2421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis HASH_TABLE elementTypes; 2431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis HASH_TABLE attributeIds; 2441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis HASH_TABLE prefixes; 2451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis STRING_POOL pool; 246fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis STRING_POOL entityValuePool; 247fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* false once a parameter entity reference has been skipped */ 248fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool keepProcessing; 249fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* true once an internal or external PE reference has been encountered; 250fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis this includes the reference to an external subset */ 251fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool hasParamEntityRefs; 252fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool standalone; 2531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 254fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* indicates if external PE has been read */ 255fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool paramEntityRead; 2561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis HASH_TABLE paramEntities; 2571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 2581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis PREFIX defaultPrefix; 2591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* === scaffolding for building content model === */ 260fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool in_eldecl; 2611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis CONTENT_SCAFFOLD *scaffold; 2621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis unsigned contentStringLen; 2631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis unsigned scaffSize; 2641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis unsigned scaffCount; 2651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int scaffLevel; 2661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int *scaffIndex; 2671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} DTD; 2681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 2691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwistypedef struct open_internal_entity { 2701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *internalEventPtr; 2711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *internalEventEndPtr; 2721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis struct open_internal_entity *next; 2731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ENTITY *entity; 2741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} OPEN_INTERNAL_ENTITY; 2751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 276fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwistypedef enum XML_Error PTRCALL Processor(XML_Parser parser, 277fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start, 278fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 279fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **endPtr); 2801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 2811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor prologProcessor; 2821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor prologInitProcessor; 2831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor contentProcessor; 2841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor cdataSectionProcessor; 2851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 2861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor ignoreSectionProcessor; 287fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic Processor externalParEntProcessor; 288fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic Processor externalParEntInitProcessor; 289fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic Processor entityValueProcessor; 290fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic Processor entityValueInitProcessor; 2911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 2921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor epilogProcessor; 2931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor errorProcessor; 2941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor externalEntityInitProcessor; 2951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor externalEntityInitProcessor2; 2961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor externalEntityInitProcessor3; 2971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic Processor externalEntityContentProcessor; 2981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 2991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 3001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwishandleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); 3011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 302fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisprocessXmlDecl(XML_Parser parser, int isGeneralTextEntity, 303fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *, const char *); 3041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 3051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisinitializeEncoding(XML_Parser parser); 3061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 3071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisdoProlog(XML_Parser parser, const ENCODING *enc, const char *s, 308fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, int tok, const char *next, const char **nextPtr); 3091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 3101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisprocessInternalParamEntity(XML_Parser parser, ENTITY *entity); 3111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 3121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisdoContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, 313fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start, const char *end, const char **endPtr); 3141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 315fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdoCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, 316fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, const char **nextPtr); 3171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 3181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 319fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdoIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, 320fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, const char **nextPtr); 3211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 3221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 323fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error 324fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisstoreAtts(XML_Parser parser, const ENCODING *, 325fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *s, TAG_NAME *tagNamePtr, BINDING **bindingsPtr); 326fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error 327fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisaddBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, 328fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *uri, BINDING **bindingsPtr); 3291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic int 3301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisdefineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, 331fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool isCdata, XML_Bool isId, const XML_Char *dfltValue, 332fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Parser parser); 3331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 334fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisstoreAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, 335fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *, const char *, STRING_POOL *); 3361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 337fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisappendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, 338fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *, const char *, STRING_POOL *); 3391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic ATTRIBUTE_ID * 340fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisgetAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, 341fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end); 342fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int 343fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwissetElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); 3441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 345fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisstoreEntityValue(XML_Parser parser, const ENCODING *enc, const char *start, 346fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end); 3471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic int 348fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisreportProcessingInstruction(XML_Parser parser, const ENCODING *enc, 349fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start, const char *end); 3501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic int 351fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisreportComment(XML_Parser parser, const ENCODING *enc, const char *start, 352fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end); 3531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic void 354fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisreportDefault(XML_Parser parser, const ENCODING *enc, const char *start, 355fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end); 3561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 357fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char * getContext(XML_Parser parser); 358fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Bool 359fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwissetContext(XML_Parser parser, const XML_Char *context); 3601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 361fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL normalizePublicId(XML_Char *s); 3621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 363fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic DTD * dtdCreate(const XML_Memory_Handling_Suite *ms); 364fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* do not call if parentParser != NULL */ 365fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms); 366fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void 367fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms); 368fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int 369fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); 370fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int 371fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwiscopyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); 372fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 373fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic NAMED * 374fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwislookup(HASH_TABLE *table, KEY name, size_t createSize); 375fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL 376fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwishashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms); 377fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL hashTableClear(HASH_TABLE *); 378fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL hashTableDestroy(HASH_TABLE *); 379fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL 380fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwishashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); 381fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *); 382fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 383fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL 384fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms); 385fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL poolClear(STRING_POOL *); 386fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL poolDestroy(STRING_POOL *); 387fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Char * 388fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolAppend(STRING_POOL *pool, const ENCODING *enc, 389fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *ptr, const char *end); 390fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Char * 391fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolStoreString(STRING_POOL *pool, const ENCODING *enc, 392fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *ptr, const char *end); 393fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Bool FASTCALL poolGrow(STRING_POOL *pool); 394fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char * FASTCALL 395fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolCopyString(STRING_POOL *pool, const XML_Char *s); 396fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char * 397fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); 398fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char * FASTCALL 399fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolAppendString(STRING_POOL *pool, const XML_Char *s); 400fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 401fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int FASTCALL nextScaffoldPart(XML_Parser parser); 402fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Content * build_model(XML_Parser parser); 403fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic ELEMENT_TYPE * 404fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisgetElementType(XML_Parser parser, const ENCODING *enc, 405fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *ptr, const char *end); 406fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 407fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Parser 408fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisparserCreate(const XML_Char *encodingName, 409fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Memory_Handling_Suite *memsuite, 410fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *nameSep, 411fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD *dtd); 412fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void 413fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisparserInit(XML_Parser parser, const XML_Char *encodingName); 4141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolStart(pool) ((pool)->start) 4161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolEnd(pool) ((pool)->ptr) 4171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolLength(pool) ((pool)->ptr - (pool)->start) 4181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolChop(pool) ((void)--(pool->ptr)) 4191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolLastChar(pool) (((pool)->ptr)[-1]) 4201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolDiscard(pool) ((pool)->ptr = (pool)->start) 4211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolFinish(pool) ((pool)->start = (pool)->ptr) 4221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define poolAppendChar(pool, c) \ 4231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ 4241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ? 0 \ 4251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis : ((*((pool)->ptr)++ = c), 1)) 4261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 427fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstruct XML_ParserStruct { 428fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* The first member must be userData so that the XML_GetUserData 429fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis macro works. */ 4301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis void *m_userData; 4311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis void *m_handlerArg; 4321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis char *m_buffer; 433fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Memory_Handling_Suite m_mem; 4341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* first character to be parsed */ 4351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *m_bufferPtr; 4361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* past last character to be parsed */ 4371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis char *m_bufferEnd; 4381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* allocated end of buffer */ 4391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *m_bufferLim; 4401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis long m_parseEndByteIndex; 4411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *m_parseEndPtr; 4421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char *m_dataBuf; 4431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char *m_dataBufEnd; 4441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_StartElementHandler m_startElementHandler; 4451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_EndElementHandler m_endElementHandler; 4461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_CharacterDataHandler m_characterDataHandler; 4471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_ProcessingInstructionHandler m_processingInstructionHandler; 4481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_CommentHandler m_commentHandler; 4491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_StartCdataSectionHandler m_startCdataSectionHandler; 4501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_EndCdataSectionHandler m_endCdataSectionHandler; 4511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_DefaultHandler m_defaultHandler; 4521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler; 4531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler; 4541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler; 4551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_NotationDeclHandler m_notationDeclHandler; 4561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler; 4571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler; 4581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_NotStandaloneHandler m_notStandaloneHandler; 4591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_ExternalEntityRefHandler m_externalEntityRefHandler; 460fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Parser m_externalEntityRefHandlerArg; 461fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_SkippedEntityHandler m_skippedEntityHandler; 4621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_UnknownEncodingHandler m_unknownEncodingHandler; 4631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_ElementDeclHandler m_elementDeclHandler; 4641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_AttlistDeclHandler m_attlistDeclHandler; 4651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_EntityDeclHandler m_entityDeclHandler; 4661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_XmlDeclHandler m_xmlDeclHandler; 4671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const ENCODING *m_encoding; 4681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis INIT_ENCODING m_initEncoding; 4691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const ENCODING *m_internalEncoding; 4701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *m_protocolEncodingName; 471fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool m_ns; 472fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool m_ns_triplets; 4731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis void *m_unknownEncodingMem; 4741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis void *m_unknownEncodingData; 4751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis void *m_unknownEncodingHandlerData; 4761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis void (*m_unknownEncodingRelease)(void *); 4771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis PROLOG_STATE m_prologState; 4781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis Processor *m_processor; 4791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis enum XML_Error m_errorCode; 4801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *m_eventPtr; 4811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *m_eventEndPtr; 4821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *m_positionPtr; 4831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis OPEN_INTERNAL_ENTITY *m_openInternalEntities; 484fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool m_defaultExpandInternalEntities; 4851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int m_tagLevel; 4861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ENTITY *m_declEntity; 4871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *m_doctypeName; 4881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *m_doctypeSysid; 4891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *m_doctypePubid; 4901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *m_declAttributeType; 4911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *m_declNotationName; 4921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *m_declNotationPublicId; 4931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ELEMENT_TYPE *m_declElementType; 4941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ATTRIBUTE_ID *m_declAttributeId; 495fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool m_declAttributeIsCdata; 496fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool m_declAttributeIsId; 497fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD *m_dtd; 4981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *m_curBase; 4991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis TAG *m_tagStack; 5001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis TAG *m_freeTagList; 5011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BINDING *m_inheritedBindings; 5021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BINDING *m_freeBindingList; 5031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int m_attsSize; 5041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int m_nSpecifiedAtts; 5051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int m_idAttIndex; 5061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ATTRIBUTE *m_atts; 5071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis POSITION m_position; 5081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis STRING_POOL m_tempPool; 5091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis STRING_POOL m_temp2Pool; 5101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis char *m_groupConnector; 5111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis unsigned m_groupSize; 5121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char m_namespaceSeparator; 513fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Parser m_parentParser; 5141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 515fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool m_isParamEntity; 516fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool m_useForeignDTD; 5171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis enum XML_ParamEntityParsing m_paramEntityParsing; 5181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif 519fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}; 520fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 521fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define MALLOC(s) (parser->m_mem.malloc_fcn((s))) 522fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s))) 523fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define FREE(p) (parser->m_mem.free_fcn((p))) 524fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 525fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define userData (parser->m_userData) 526fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define handlerArg (parser->m_handlerArg) 527fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define startElementHandler (parser->m_startElementHandler) 528fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define endElementHandler (parser->m_endElementHandler) 529fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define characterDataHandler (parser->m_characterDataHandler) 530fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define processingInstructionHandler \ 531fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (parser->m_processingInstructionHandler) 532fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define commentHandler (parser->m_commentHandler) 533fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define startCdataSectionHandler \ 534fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (parser->m_startCdataSectionHandler) 535fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define endCdataSectionHandler (parser->m_endCdataSectionHandler) 536fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define defaultHandler (parser->m_defaultHandler) 537fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler) 538fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler) 539fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define unparsedEntityDeclHandler \ 540fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (parser->m_unparsedEntityDeclHandler) 541fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define notationDeclHandler (parser->m_notationDeclHandler) 542fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define startNamespaceDeclHandler \ 543fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (parser->m_startNamespaceDeclHandler) 544fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler) 545fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define notStandaloneHandler (parser->m_notStandaloneHandler) 546fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define externalEntityRefHandler \ 547fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (parser->m_externalEntityRefHandler) 548fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define externalEntityRefHandlerArg \ 549fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (parser->m_externalEntityRefHandlerArg) 550fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define internalEntityRefHandler \ 551fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (parser->m_internalEntityRefHandler) 552fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define skippedEntityHandler (parser->m_skippedEntityHandler) 553fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define unknownEncodingHandler (parser->m_unknownEncodingHandler) 554fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define elementDeclHandler (parser->m_elementDeclHandler) 555fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define attlistDeclHandler (parser->m_attlistDeclHandler) 556fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define entityDeclHandler (parser->m_entityDeclHandler) 557fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define xmlDeclHandler (parser->m_xmlDeclHandler) 558fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define encoding (parser->m_encoding) 559fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define initEncoding (parser->m_initEncoding) 560fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define internalEncoding (parser->m_internalEncoding) 561fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define unknownEncodingMem (parser->m_unknownEncodingMem) 562fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define unknownEncodingData (parser->m_unknownEncodingData) 5631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define unknownEncodingHandlerData \ 564fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (parser->m_unknownEncodingHandlerData) 565fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define unknownEncodingRelease (parser->m_unknownEncodingRelease) 566fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define protocolEncodingName (parser->m_protocolEncodingName) 567fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define ns (parser->m_ns) 568fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define ns_triplets (parser->m_ns_triplets) 569fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define prologState (parser->m_prologState) 570fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define processor (parser->m_processor) 571fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define errorCode (parser->m_errorCode) 572fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define eventPtr (parser->m_eventPtr) 573fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define eventEndPtr (parser->m_eventEndPtr) 574fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define positionPtr (parser->m_positionPtr) 575fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define position (parser->m_position) 576fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define openInternalEntities (parser->m_openInternalEntities) 577fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define defaultExpandInternalEntities \ 578fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (parser->m_defaultExpandInternalEntities) 579fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define tagLevel (parser->m_tagLevel) 580fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define buffer (parser->m_buffer) 581fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define bufferPtr (parser->m_bufferPtr) 582fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define bufferEnd (parser->m_bufferEnd) 583fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define parseEndByteIndex (parser->m_parseEndByteIndex) 584fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define parseEndPtr (parser->m_parseEndPtr) 585fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define bufferLim (parser->m_bufferLim) 586fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define dataBuf (parser->m_dataBuf) 587fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define dataBufEnd (parser->m_dataBufEnd) 588fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define _dtd (parser->m_dtd) 589fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define curBase (parser->m_curBase) 590fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declEntity (parser->m_declEntity) 591fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define doctypeName (parser->m_doctypeName) 592fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define doctypeSysid (parser->m_doctypeSysid) 593fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define doctypePubid (parser->m_doctypePubid) 594fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declAttributeType (parser->m_declAttributeType) 595fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declNotationName (parser->m_declNotationName) 596fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declNotationPublicId (parser->m_declNotationPublicId) 597fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declElementType (parser->m_declElementType) 598fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declAttributeId (parser->m_declAttributeId) 599fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declAttributeIsCdata (parser->m_declAttributeIsCdata) 600fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define declAttributeIsId (parser->m_declAttributeIsId) 601fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define freeTagList (parser->m_freeTagList) 602fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define freeBindingList (parser->m_freeBindingList) 603fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define inheritedBindings (parser->m_inheritedBindings) 604fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define tagStack (parser->m_tagStack) 605fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define atts (parser->m_atts) 606fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define attsSize (parser->m_attsSize) 607fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define nSpecifiedAtts (parser->m_nSpecifiedAtts) 608fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define idAttIndex (parser->m_idAttIndex) 609fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define tempPool (parser->m_tempPool) 610fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define temp2Pool (parser->m_temp2Pool) 611fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define groupConnector (parser->m_groupConnector) 612fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define groupSize (parser->m_groupSize) 613fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define namespaceSeparator (parser->m_namespaceSeparator) 614fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define parentParser (parser->m_parentParser) 6151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 616fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define isParamEntity (parser->m_isParamEntity) 617fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define useForeignDTD (parser->m_useForeignDTD) 618fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define paramEntityParsing (parser->m_paramEntityParsing) 6191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 6201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 621fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define parsing \ 622fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (parentParser \ 623fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ? \ 624fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (isParamEntity \ 625fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ? \ 626fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (processor != externalParEntInitProcessor) \ 627fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis : \ 628fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (processor != externalEntityInitProcessor)) \ 629fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis : \ 630fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (processor != prologInitProcessor)) 6311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 632fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_Parser 633fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ParserCreate(const XML_Char *encodingName) 6341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 6351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ParserCreate_MM(encodingName, NULL, NULL); 6361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 6371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 638fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_Parser 639fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) 6401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 6411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char tmp[2]; 6421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *tmp = nsSep; 6431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ParserCreate_MM(encodingName, NULL, tmp); 6441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 6451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 646fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char implicitContext[] = { 647fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 'x', 'm', 'l', '=', 'h', 't', 't', 'p', ':', '/', '/', 648fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 'w', 'w', 'w', '.', 'w', '3', '.', 'o', 'r', 'g', '/', 649fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 'X', 'M', 'L', '/', '1', '9', '9', '8', '/', 650fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 'n', 'a', 'm', 'e', 's', 'p', 'a', 'c', 'e', '\0' 651fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis}; 652fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 6531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisXML_Parser 6541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisXML_ParserCreate_MM(const XML_Char *encodingName, 655fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Memory_Handling_Suite *memsuite, 656fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *nameSep) 657fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 658fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Parser parser = parserCreate(encodingName, memsuite, nameSep, NULL); 659fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (parser != NULL && ns) { 660fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* implicit context only set for root parser, since child 661fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis parsers (i.e. external entity parsers) will inherit it 662fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 663fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!setContext(parser, implicitContext)) { 664fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_ParserFree(parser); 665fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 666fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 667fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 668fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return parser; 669fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 6701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 671fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Parser 672fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisparserCreate(const XML_Char *encodingName, 673fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Memory_Handling_Suite *memsuite, 674fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *nameSep, 675fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD *dtd) 676fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 677fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Parser parser; 6781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 6791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (memsuite) { 6801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Memory_Handling_Suite *mtemp; 681fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis parser = (XML_Parser) 682fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis memsuite->malloc_fcn(sizeof(struct XML_ParserStruct)); 683fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (parser != NULL) { 684fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); 685fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis mtemp->malloc_fcn = memsuite->malloc_fcn; 686fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis mtemp->realloc_fcn = memsuite->realloc_fcn; 687fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis mtemp->free_fcn = memsuite->free_fcn; 688fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 6891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 6901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 6911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Memory_Handling_Suite *mtemp; 692fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct)); 693fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (parser != NULL) { 694fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); 695fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis mtemp->malloc_fcn = malloc; 696fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis mtemp->realloc_fcn = realloc; 697fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis mtemp->free_fcn = free; 698fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 6991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 7001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 7011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!parser) 7021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return parser; 703fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 704fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis buffer = NULL; 705fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bufferLim = NULL; 706fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 7071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis attsSize = INIT_ATTS_SIZE; 708fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE)); 709fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (atts == NULL) { 710fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis FREE(parser); 711fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 712fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 713fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); 714fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dataBuf == NULL) { 715fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis FREE(atts); 716fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis FREE(parser); 717fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 718fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 719fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; 720fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 721fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd) 722fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis _dtd = dtd; 723fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 724fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis _dtd = dtdCreate(&parser->m_mem); 725fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (_dtd == NULL) { 726fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis FREE(dataBuf); 727fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis FREE(atts); 728fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis FREE(parser); 729fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 730fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 731fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 732fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 733fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis freeBindingList = NULL; 734fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis freeTagList = NULL; 735fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 7361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis groupSize = 0; 737fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis groupConnector = NULL; 738fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 739fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis unknownEncodingHandler = NULL; 740fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis unknownEncodingHandlerData = NULL; 741fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 7421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis namespaceSeparator = '!'; 743fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ns = XML_FALSE; 744fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ns_triplets = XML_FALSE; 745fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 746fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolInit(&tempPool, &(parser->m_mem)); 747fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolInit(&temp2Pool, &(parser->m_mem)); 748fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis parserInit(parser, encodingName); 749fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 750fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (encodingName && !protocolEncodingName) { 7511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_ParserFree(parser); 752fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 7531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 7541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 7551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nameSep) { 756fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ns = XML_TRUE; 7571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis internalEncoding = XmlGetInternalEncodingNS(); 7581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis namespaceSeparator = *nameSep; 7591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 7601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 7611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis internalEncoding = XmlGetInternalEncoding(); 7621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 7631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 7641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return parser; 765fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 766fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 767fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void 768fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisparserInit(XML_Parser parser, const XML_Char *encodingName) 769fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 770fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processor = prologInitProcessor; 771fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XmlPrologStateInit(&prologState); 772fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis protocolEncodingName = (encodingName != NULL 773fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ? poolCopyString(&tempPool, encodingName) 774fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis : NULL); 775fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis curBase = NULL; 776fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XmlInitEncoding(&initEncoding, &encoding, 0); 777fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis userData = NULL; 778fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handlerArg = NULL; 779fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis startElementHandler = NULL; 780fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis endElementHandler = NULL; 781fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characterDataHandler = NULL; 782fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processingInstructionHandler = NULL; 783fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis commentHandler = NULL; 784fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis startCdataSectionHandler = NULL; 785fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis endCdataSectionHandler = NULL; 786fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis defaultHandler = NULL; 787fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis startDoctypeDeclHandler = NULL; 788fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis endDoctypeDeclHandler = NULL; 789fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis unparsedEntityDeclHandler = NULL; 790fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis notationDeclHandler = NULL; 791fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis startNamespaceDeclHandler = NULL; 792fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis endNamespaceDeclHandler = NULL; 793fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis notStandaloneHandler = NULL; 794fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis externalEntityRefHandler = NULL; 795fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis externalEntityRefHandlerArg = parser; 796fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis skippedEntityHandler = NULL; 797fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis elementDeclHandler = NULL; 798fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis attlistDeclHandler = NULL; 799fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entityDeclHandler = NULL; 800fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis xmlDeclHandler = NULL; 801fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bufferPtr = buffer; 802fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bufferEnd = buffer; 803fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis parseEndByteIndex = 0; 804fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis parseEndPtr = NULL; 805fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declElementType = NULL; 806fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeId = NULL; 807fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity = NULL; 808fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doctypeName = NULL; 809fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doctypeSysid = NULL; 810fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doctypePubid = NULL; 811fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeType = NULL; 812fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declNotationName = NULL; 813fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declNotationPublicId = NULL; 814fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeIsCdata = XML_FALSE; 815fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeIsId = XML_FALSE; 816fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis memset(&position, 0, sizeof(POSITION)); 817fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis errorCode = XML_ERROR_NONE; 818fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = NULL; 819fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventEndPtr = NULL; 820fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis positionPtr = NULL; 821fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis openInternalEntities = 0; 822fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis defaultExpandInternalEntities = XML_TRUE; 823fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tagLevel = 0; 824fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tagStack = NULL; 825fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis inheritedBindings = NULL; 826fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis nSpecifiedAtts = 0; 827fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis unknownEncodingMem = NULL; 828fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis unknownEncodingRelease = NULL; 829fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis unknownEncodingData = NULL; 830fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis parentParser = NULL; 831fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 832fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis isParamEntity = XML_FALSE; 833fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis useForeignDTD = XML_FALSE; 834fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; 835fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif 836fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 837fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 838fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* moves list of bindings to freeBindingList */ 839fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL 840fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwismoveToFreeBindingList(XML_Parser parser, BINDING *bindings) 841fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 842fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis while (bindings) { 843fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis BINDING *b = bindings; 844fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bindings = bindings->nextTagBinding; 845fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis b->nextTagBinding = freeBindingList; 846fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis freeBindingList = b; 847fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 848fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 849fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 850fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_Bool 851fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ParserReset(XML_Parser parser, const XML_Char *encodingName) 852fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 853fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis TAG *tStk; 854fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (parentParser) 855fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_FALSE; 856fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* move tagStack to freeTagList */ 857fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tStk = tagStack; 858fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis while (tStk) { 859fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis TAG *tag = tStk; 860fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tStk = tStk->parent; 861fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->parent = freeTagList; 862fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis moveToFreeBindingList(parser, tag->bindings); 863fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->bindings = NULL; 864fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis freeTagList = tag; 865fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 866fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis moveToFreeBindingList(parser, inheritedBindings); 867fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (unknownEncodingMem) 868fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis FREE(unknownEncodingMem); 869fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (unknownEncodingRelease) 870fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis unknownEncodingRelease(unknownEncodingData); 871fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolClear(&tempPool); 872fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolClear(&temp2Pool); 873fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis parserInit(parser, encodingName); 874fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtdReset(_dtd, &parser->m_mem); 875fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return setContext(parser, implicitContext); 876fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 8771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 878fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisenum XML_Status 879fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) 8801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 881fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* Block after XML_Parse()/XML_ParseBuffer() has been called. 882fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XXX There's no way for the caller to determine which of the 883fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XXX possible error cases caused the XML_STATUS_ERROR return. 884fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 885fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (parsing) 886fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_ERROR; 887fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (encodingName == NULL) 888fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis protocolEncodingName = NULL; 8891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 8901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis protocolEncodingName = poolCopyString(&tempPool, encodingName); 8911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!protocolEncodingName) 892fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_ERROR; 8931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 894fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_OK; 8951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 8961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 897fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_Parser 898fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ExternalEntityParserCreate(XML_Parser oldParser, 899fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *context, 900fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *encodingName) 9011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 9021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Parser parser = oldParser; 903fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD *newDtd = NULL; 904fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD *oldDtd = _dtd; 9051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_StartElementHandler oldStartElementHandler = startElementHandler; 9061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_EndElementHandler oldEndElementHandler = endElementHandler; 9071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler; 908fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_ProcessingInstructionHandler oldProcessingInstructionHandler 909fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis = processingInstructionHandler; 9101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_CommentHandler oldCommentHandler = commentHandler; 911fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_StartCdataSectionHandler oldStartCdataSectionHandler 912fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis = startCdataSectionHandler; 913fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_EndCdataSectionHandler oldEndCdataSectionHandler 914fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis = endCdataSectionHandler; 9151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_DefaultHandler oldDefaultHandler = defaultHandler; 916fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler 917fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis = unparsedEntityDeclHandler; 9181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler; 919fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler 920fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis = startNamespaceDeclHandler; 921fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler 922fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis = endNamespaceDeclHandler; 9231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler; 924fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_ExternalEntityRefHandler oldExternalEntityRefHandler 925fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis = externalEntityRefHandler; 926fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler; 927fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_UnknownEncodingHandler oldUnknownEncodingHandler 928fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis = unknownEncodingHandler; 9291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler; 9301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler; 9311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler; 9321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler; 9331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ELEMENT_TYPE * oldDeclElementType = declElementType; 9341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 9351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis void *oldUserData = userData; 9361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis void *oldHandlerArg = handlerArg; 937fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities; 938fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg; 9391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 940fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing; 941fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int oldInEntityValue = prologState.inEntityValue; 9421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif 943fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool oldns_triplets = ns_triplets; 944fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 945fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 946fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!context) 947fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newDtd = oldDtd; 948fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */ 9491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 950fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* Note that the magical uses of the pre-processor to make field 951fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis access look more like C++ require that `parser' be overwritten 952fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis here. This makes this function more painful to follow than it 953fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis would be otherwise. 954fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 9551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (ns) { 9561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char tmp[2]; 9571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *tmp = namespaceSeparator; 958fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd); 9591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 9601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 961fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd); 9621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 9631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 9641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!parser) 965fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 9661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 9671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis startElementHandler = oldStartElementHandler; 9681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis endElementHandler = oldEndElementHandler; 9691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis characterDataHandler = oldCharacterDataHandler; 9701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis processingInstructionHandler = oldProcessingInstructionHandler; 9711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis commentHandler = oldCommentHandler; 9721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis startCdataSectionHandler = oldStartCdataSectionHandler; 9731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis endCdataSectionHandler = oldEndCdataSectionHandler; 9741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis defaultHandler = oldDefaultHandler; 9751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler; 9761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis notationDeclHandler = oldNotationDeclHandler; 9771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis startNamespaceDeclHandler = oldStartNamespaceDeclHandler; 9781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis endNamespaceDeclHandler = oldEndNamespaceDeclHandler; 9791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis notStandaloneHandler = oldNotStandaloneHandler; 9801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis externalEntityRefHandler = oldExternalEntityRefHandler; 981fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis skippedEntityHandler = oldSkippedEntityHandler; 9821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis unknownEncodingHandler = oldUnknownEncodingHandler; 9831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis elementDeclHandler = oldElementDeclHandler; 9841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis attlistDeclHandler = oldAttlistDeclHandler; 9851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis entityDeclHandler = oldEntityDeclHandler; 9861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis xmlDeclHandler = oldXmlDeclHandler; 9871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis declElementType = oldDeclElementType; 9881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis userData = oldUserData; 9891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (oldUserData == oldHandlerArg) 9901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis handlerArg = userData; 9911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 9921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis handlerArg = parser; 9931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (oldExternalEntityRefHandlerArg != oldParser) 9941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; 9951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis defaultExpandInternalEntities = oldDefaultExpandInternalEntities; 9961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ns_triplets = oldns_triplets; 997fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis parentParser = oldParser; 9981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 9991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis paramEntityParsing = oldParamEntityParsing; 1000fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis prologState.inEntityValue = oldInEntityValue; 10011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (context) { 10021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 1003fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!dtdCopy(_dtd, oldDtd, &parser->m_mem) 1004fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis || !setContext(parser, context)) { 10051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_ParserFree(parser); 1006fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 10071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 10081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis processor = externalEntityInitProcessor; 10091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 10101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 10111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 1012fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* The DTD instance referenced by _dtd is shared between the document's 1013fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis root parser and external PE parsers, therefore one does not need to 1014fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis call setContext. In addition, one also *must* not call setContext, 1015fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis because this would overwrite existing prefix->binding pointers in 1016fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis _dtd with ones that get destroyed with the external PE parser. 1017fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis This would leave those prefixes with dangling pointers. 1018fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 1019fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis isParamEntity = XML_TRUE; 10201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XmlPrologStateInitExternalEntity(&prologState); 1021fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processor = externalParEntInitProcessor; 10221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 10231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 10241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return parser; 10251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 10261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1027fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL 1028fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdestroyBindings(BINDING *bindings, XML_Parser parser) 10291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 10301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 10311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BINDING *b = bindings; 10321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!b) 10331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 10341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis bindings = b->nextTagBinding; 10351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis FREE(b->uri); 10361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis FREE(b); 10371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 10381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 10391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1040fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1041fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ParserFree(XML_Parser parser) 10421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 10431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 10441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis TAG *p; 1045fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (tagStack == NULL) { 1046fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (freeTagList == NULL) 1047fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 10481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis tagStack = freeTagList; 1049fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis freeTagList = NULL; 10501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 10511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis p = tagStack; 10521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis tagStack = tagStack->parent; 10531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis FREE(p->buf); 10541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis destroyBindings(p->bindings, parser); 10551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis FREE(p); 10561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 10571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis destroyBindings(freeBindingList, parser); 10581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis destroyBindings(inheritedBindings, parser); 10591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolDestroy(&tempPool); 10601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolDestroy(&temp2Pool); 10611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 1062fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* external parameter entity parsers share the DTD structure 1063fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis parser->m_dtd with the root parser, so we must not destroy it 1064fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 1065fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!isParamEntity && _dtd) 1066fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#else 1067fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (_dtd) 10681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 1069fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem); 10701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis FREE((void *)atts); 10711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (groupConnector) 10721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis FREE(groupConnector); 10731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (buffer) 10741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis FREE(buffer); 10751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis FREE(dataBuf); 10761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (unknownEncodingMem) 10771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis FREE(unknownEncodingMem); 10781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (unknownEncodingRelease) 10791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis unknownEncodingRelease(unknownEncodingData); 10801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis FREE(parser); 10811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 10821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1083fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1084fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_UseParserAsHandlerArg(XML_Parser parser) 10851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 10861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis handlerArg = parser; 10871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 10881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1089fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisenum XML_Error 1090fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) 1091fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 1092fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 1093fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* block after XML_Parse()/XML_ParseBuffer() has been called */ 1094fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (parsing) 1095fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING; 1096fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis useForeignDTD = useDTD; 1097fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 1098fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#else 1099fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_FEATURE_REQUIRES_XML_DTD; 1100fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif 1101fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 1102fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 11031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisvoid 1104fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetReturnNSTriplet(XML_Parser parser, int do_nst) 1105fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 1106fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* block after XML_Parse()/XML_ParseBuffer() has been called */ 1107fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (parsing) 1108fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return; 1109fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ns_triplets = do_nst ? XML_TRUE : XML_FALSE; 11101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 11111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1112fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1113fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetUserData(XML_Parser parser, void *p) 11141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 11151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (handlerArg == userData) 11161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis handlerArg = userData = p; 11171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 11181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis userData = p; 11191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 11201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1121fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisenum XML_Status 1122fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetBase(XML_Parser parser, const XML_Char *p) 11231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 11241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (p) { 1125fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p = poolCopyString(&_dtd->pool, p); 11261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!p) 1127fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_ERROR; 11281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis curBase = p; 11291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 11301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 1131fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis curBase = NULL; 1132fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_OK; 11331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 11341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1135fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisconst XML_Char * 1136fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetBase(XML_Parser parser) 11371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 11381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return curBase; 11391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 11401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1141fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisint 1142fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetSpecifiedAttributeCount(XML_Parser parser) 11431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 11441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return nSpecifiedAtts; 11451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 11461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1147fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisint 1148fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetIdAttributeIndex(XML_Parser parser) 11491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 11501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return idAttIndex; 11511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 11521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1153fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1154fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetElementHandler(XML_Parser parser, 1155fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_StartElementHandler start, 1156fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_EndElementHandler end) 11571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 11581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis startElementHandler = start; 11591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis endElementHandler = end; 11601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 11611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1162fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1163fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetStartElementHandler(XML_Parser parser, 1164fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_StartElementHandler start) { 11651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis startElementHandler = start; 11661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 11671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1168fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1169fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetEndElementHandler(XML_Parser parser, 1170fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_EndElementHandler end) { 11711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis endElementHandler = end; 11721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 11731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1174fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1175fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetCharacterDataHandler(XML_Parser parser, 1176fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_CharacterDataHandler handler) 11771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 11781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis characterDataHandler = handler; 11791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 11801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1181fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1182fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetProcessingInstructionHandler(XML_Parser parser, 1183fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_ProcessingInstructionHandler handler) 11841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 11851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis processingInstructionHandler = handler; 11861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 11871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1188fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1189fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetCommentHandler(XML_Parser parser, 1190fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_CommentHandler handler) 11911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 11921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis commentHandler = handler; 11931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 11941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1195fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1196fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetCdataSectionHandler(XML_Parser parser, 1197fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_StartCdataSectionHandler start, 1198fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_EndCdataSectionHandler end) 11991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 12001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis startCdataSectionHandler = start; 12011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis endCdataSectionHandler = end; 12021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 12031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1204fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1205fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetStartCdataSectionHandler(XML_Parser parser, 1206fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_StartCdataSectionHandler start) { 12071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis startCdataSectionHandler = start; 12081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 12091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1210fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1211fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetEndCdataSectionHandler(XML_Parser parser, 1212fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_EndCdataSectionHandler end) { 12131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis endCdataSectionHandler = end; 12141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 12151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1216fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1217fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetDefaultHandler(XML_Parser parser, 1218fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_DefaultHandler handler) 12191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 12201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis defaultHandler = handler; 1221fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis defaultExpandInternalEntities = XML_FALSE; 12221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 12231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1224fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1225fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetDefaultHandlerExpand(XML_Parser parser, 1226fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_DefaultHandler handler) 12271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 12281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis defaultHandler = handler; 1229fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis defaultExpandInternalEntities = XML_TRUE; 12301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 12311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1232fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1233fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetDoctypeDeclHandler(XML_Parser parser, 1234fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_StartDoctypeDeclHandler start, 1235fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_EndDoctypeDeclHandler end) 12361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 12371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis startDoctypeDeclHandler = start; 12381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis endDoctypeDeclHandler = end; 12391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 12401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1241fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1242fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetStartDoctypeDeclHandler(XML_Parser parser, 1243fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_StartDoctypeDeclHandler start) { 12441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis startDoctypeDeclHandler = start; 12451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 12461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1247fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1248fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetEndDoctypeDeclHandler(XML_Parser parser, 1249fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_EndDoctypeDeclHandler end) { 12501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis endDoctypeDeclHandler = end; 12511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 12521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1253fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1254fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetUnparsedEntityDeclHandler(XML_Parser parser, 1255fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_UnparsedEntityDeclHandler handler) 12561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 12571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis unparsedEntityDeclHandler = handler; 12581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 12591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1260fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1261fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetNotationDeclHandler(XML_Parser parser, 1262fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_NotationDeclHandler handler) 12631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 12641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis notationDeclHandler = handler; 12651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 12661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1267fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1268fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetNamespaceDeclHandler(XML_Parser parser, 1269fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_StartNamespaceDeclHandler start, 1270fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_EndNamespaceDeclHandler end) 12711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 12721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis startNamespaceDeclHandler = start; 12731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis endNamespaceDeclHandler = end; 12741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 12751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1276fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1277fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetStartNamespaceDeclHandler(XML_Parser parser, 1278fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_StartNamespaceDeclHandler start) { 12791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis startNamespaceDeclHandler = start; 12801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 12811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1282fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1283fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetEndNamespaceDeclHandler(XML_Parser parser, 1284fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_EndNamespaceDeclHandler end) { 12851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis endNamespaceDeclHandler = end; 12861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 12871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1288fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1289fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetNotStandaloneHandler(XML_Parser parser, 1290fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_NotStandaloneHandler handler) 12911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 12921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis notStandaloneHandler = handler; 12931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 12941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1295fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1296fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetExternalEntityRefHandler(XML_Parser parser, 1297fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_ExternalEntityRefHandler handler) 12981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 12991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis externalEntityRefHandler = handler; 13001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 13011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1302fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1303fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) 13041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 13051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (arg) 1306fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis externalEntityRefHandlerArg = (XML_Parser)arg; 13071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 13081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis externalEntityRefHandlerArg = parser; 13091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 13101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1311fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1312fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetSkippedEntityHandler(XML_Parser parser, 1313fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_SkippedEntityHandler handler) 1314fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 1315fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis skippedEntityHandler = handler; 1316fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 1317fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 1318fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1319fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetUnknownEncodingHandler(XML_Parser parser, 1320fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_UnknownEncodingHandler handler, 1321fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis void *data) 13221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 13231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis unknownEncodingHandler = handler; 13241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis unknownEncodingHandlerData = data; 13251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 13261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1327fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1328fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetElementDeclHandler(XML_Parser parser, 1329fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_ElementDeclHandler eldecl) 13301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 13311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis elementDeclHandler = eldecl; 13321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 13331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1334fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1335fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetAttlistDeclHandler(XML_Parser parser, 1336fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_AttlistDeclHandler attdecl) 13371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 13381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis attlistDeclHandler = attdecl; 13391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 13401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1341fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1342fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetEntityDeclHandler(XML_Parser parser, 1343fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_EntityDeclHandler handler) 13441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 13451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis entityDeclHandler = handler; 13461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 13471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1348fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1349fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetXmlDeclHandler(XML_Parser parser, 1350fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_XmlDeclHandler handler) { 13511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis xmlDeclHandler = handler; 13521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 13531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1354fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisint 1355fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_SetParamEntityParsing(XML_Parser parser, 1356fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_ParamEntityParsing peParsing) 13571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 1358fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* block after XML_Parse()/XML_ParseBuffer() has been called */ 1359fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (parsing) 1360fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return 0; 13611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 1362fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis paramEntityParsing = peParsing; 13631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 1; 13641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else 1365fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return peParsing == XML_PARAM_ENTITY_PARSING_NEVER; 13661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif 13671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 13681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1369fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisenum XML_Status 1370fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_Parse(XML_Parser parser, const char *s, int len, int isFinal) 13711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 13721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (len == 0) { 13731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!isFinal) 1374fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_OK; 13751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis positionPtr = bufferPtr; 13761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis errorCode = processor(parser, bufferPtr, parseEndPtr = bufferEnd, 0); 13771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (errorCode == XML_ERROR_NONE) 1378fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_OK; 13791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPtr = eventPtr; 13801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis processor = errorProcessor; 1381fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_ERROR; 13821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 13831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifndef XML_CONTEXT_BYTES 13841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else if (bufferPtr == bufferEnd) { 13851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *end; 13861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int nLeftOver; 13871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis parseEndByteIndex += len; 13881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis positionPtr = s; 13891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (isFinal) { 13901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis errorCode = processor(parser, s, parseEndPtr = s + len, 0); 13911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (errorCode == XML_ERROR_NONE) 1392fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_OK; 13931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPtr = eventPtr; 13941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis processor = errorProcessor; 1395fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_ERROR; 13961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 13971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis errorCode = processor(parser, s, parseEndPtr = s + len, &end); 13981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (errorCode != XML_ERROR_NONE) { 13991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPtr = eventPtr; 14001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis processor = errorProcessor; 1401fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_ERROR; 14021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 14031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XmlUpdatePosition(encoding, positionPtr, end, &position); 1404fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis positionPtr = end; 14051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis nLeftOver = s + len - end; 14061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nLeftOver) { 1407fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (buffer == NULL || nLeftOver > bufferLim - buffer) { 1408fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* FIXME avoid integer overflow */ 1409fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis char *temp; 1410fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis temp = (buffer == NULL 1411fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ? (char *)MALLOC(len * 2) 1412fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis : (char *)REALLOC(buffer, len * 2)); 1413fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (temp == NULL) { 1414fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis errorCode = XML_ERROR_NO_MEMORY; 1415fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_ERROR; 1416fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 1417fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis buffer = temp; 1418fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!buffer) { 1419fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis errorCode = XML_ERROR_NO_MEMORY; 1420fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = eventEndPtr = NULL; 1421fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processor = errorProcessor; 1422fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_ERROR; 1423fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 1424fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bufferLim = buffer + len * 2; 14251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 14261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis memcpy(buffer, end, nLeftOver); 14271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis bufferPtr = buffer; 14281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis bufferEnd = buffer + nLeftOver; 14291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 1430fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_OK; 14311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 14321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* not defined XML_CONTEXT_BYTES */ 14331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 1434fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis void *buff = XML_GetBuffer(parser, len); 1435fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (buff == NULL) 1436fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_ERROR; 1437fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 1438fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis memcpy(buff, s, len); 1439fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ParseBuffer(parser, len, isFinal); 1440fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 14411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 14421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 14431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1444fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisenum XML_Status 1445fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ParseBuffer(XML_Parser parser, int len, int isFinal) 14461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 14471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *start = bufferPtr; 14481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis positionPtr = start; 14491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis bufferEnd += len; 14501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis parseEndByteIndex += len; 14511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis errorCode = processor(parser, start, parseEndPtr = bufferEnd, 1452fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis isFinal ? (const char **)NULL : &bufferPtr); 14531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (errorCode == XML_ERROR_NONE) { 1454fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!isFinal) { 14551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); 1456fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis positionPtr = bufferPtr; 1457fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 1458fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_OK; 14591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 14601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 14611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPtr = eventPtr; 14621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis processor = errorProcessor; 1463fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_STATUS_ERROR; 14641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 14651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 14661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1467fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid * 1468fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetBuffer(XML_Parser parser, int len) 14691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 14701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (len > bufferLim - bufferEnd) { 14711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* FIXME avoid integer overflow */ 14721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int neededSize = len + (bufferEnd - bufferPtr); 14731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_CONTEXT_BYTES 14741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int keep = bufferPtr - buffer; 14751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 14761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (keep > XML_CONTEXT_BYTES) 14771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis keep = XML_CONTEXT_BYTES; 14781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis neededSize += keep; 14791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* defined XML_CONTEXT_BYTES */ 14801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (neededSize <= bufferLim - buffer) { 14811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_CONTEXT_BYTES 14821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (keep < bufferPtr - buffer) { 1483fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int offset = (bufferPtr - buffer) - keep; 1484fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep); 1485fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bufferEnd -= offset; 1486fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bufferPtr -= offset; 14871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 14881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else 14891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis memmove(buffer, bufferPtr, bufferEnd - bufferPtr); 14901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis bufferEnd = buffer + (bufferEnd - bufferPtr); 14911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis bufferPtr = buffer; 14921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* not defined XML_CONTEXT_BYTES */ 14931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 14941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 14951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis char *newBuf; 14961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int bufferSize = bufferLim - bufferPtr; 14971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (bufferSize == 0) 1498fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bufferSize = INIT_BUFFER_SIZE; 14991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis do { 1500fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bufferSize *= 2; 15011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } while (bufferSize < neededSize); 1502fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newBuf = (char *)MALLOC(bufferSize); 15031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (newBuf == 0) { 1504fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis errorCode = XML_ERROR_NO_MEMORY; 1505fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 15061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 15071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis bufferLim = newBuf + bufferSize; 15081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_CONTEXT_BYTES 15091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (bufferPtr) { 1510fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int keep = bufferPtr - buffer; 1511fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (keep > XML_CONTEXT_BYTES) 1512fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis keep = XML_CONTEXT_BYTES; 1513fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep); 1514fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis FREE(buffer); 1515fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis buffer = newBuf; 1516fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bufferEnd = buffer + (bufferEnd - bufferPtr) + keep; 1517fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bufferPtr = buffer + keep; 15181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 15191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 1520fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bufferEnd = newBuf + (bufferEnd - bufferPtr); 1521fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bufferPtr = buffer = newBuf; 15221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 15231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else 15241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (bufferPtr) { 1525fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); 1526fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis FREE(buffer); 15271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 15281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis bufferEnd = newBuf + (bufferEnd - bufferPtr); 15291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis bufferPtr = buffer = newBuf; 15301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* not defined XML_CONTEXT_BYTES */ 15311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 15321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 15331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return bufferEnd; 15341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 15351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1536fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisenum XML_Error 1537fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetErrorCode(XML_Parser parser) 15381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 15391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return errorCode; 15401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 15411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1542fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwislong 1543fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetCurrentByteIndex(XML_Parser parser) 15441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 15451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (eventPtr) 15461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return parseEndByteIndex - (parseEndPtr - eventPtr); 15471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return -1; 15481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 15491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1550fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisint 1551fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetCurrentByteCount(XML_Parser parser) 15521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 15531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (eventEndPtr && eventPtr) 15541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return eventEndPtr - eventPtr; 15551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 15561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 15571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1558fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisconst char * 1559fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetInputContext(XML_Parser parser, int *offset, int *size) 15601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 15611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_CONTEXT_BYTES 15621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (eventPtr && buffer) { 15631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *offset = eventPtr - buffer; 15641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *size = bufferEnd - buffer; 15651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return buffer; 15661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 15671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* defined XML_CONTEXT_BYTES */ 15681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return (char *) 0; 15691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 15701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1571fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisint 1572fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetCurrentLineNumber(XML_Parser parser) 15731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 15741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (eventPtr) { 15751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); 15761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis positionPtr = eventPtr; 15771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 15781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return position.lineNumber + 1; 15791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 15801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1581fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisint 1582fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetCurrentColumnNumber(XML_Parser parser) 15831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 15841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (eventPtr) { 15851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); 15861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis positionPtr = eventPtr; 15871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 15881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return position.columnNumber; 15891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 15901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1591fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1592fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_FreeContentModel(XML_Parser parser, XML_Content *model) 1593fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 1594fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis FREE(model); 1595fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 1596fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 1597fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid * 1598fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_MemMalloc(XML_Parser parser, size_t size) 1599fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 1600fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return MALLOC(size); 1601fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 1602fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 1603fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid * 1604fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_MemRealloc(XML_Parser parser, void *ptr, size_t size) 1605fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 1606fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return REALLOC(ptr, size); 1607fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 1608fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 1609fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1610fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_MemFree(XML_Parser parser, void *ptr) 1611fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 1612fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis FREE(ptr); 1613fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 1614fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 1615fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisvoid 1616fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_DefaultCurrent(XML_Parser parser) 16171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 16181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (defaultHandler) { 16191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (openInternalEntities) 16201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis reportDefault(parser, 1621fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis internalEncoding, 1622fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis openInternalEntities->internalEventPtr, 1623fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis openInternalEntities->internalEventEndPtr); 16241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 16251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis reportDefault(parser, encoding, eventPtr, eventEndPtr); 16261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 16271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 16281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1629fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisconst XML_LChar * 1630fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ErrorString(enum XML_Error code) 16311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 16321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis static const XML_LChar *message[] = { 16331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 0, 1634fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("out of memory"), 1635fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("syntax error"), 1636fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("no element found"), 1637fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("not well-formed (invalid token)"), 1638fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("unclosed token"), 1639fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("partial character"), 1640fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("mismatched tag"), 1641fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("duplicate attribute"), 1642fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("junk after document element"), 1643fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("illegal parameter entity reference"), 1644fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("undefined entity"), 1645fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("recursive entity reference"), 1646fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("asynchronous entity"), 1647fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("reference to invalid character number"), 1648fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("reference to binary entity"), 1649fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("reference to external entity in attribute"), 1650fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("xml declaration not at start of external entity"), 1651fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("unknown encoding"), 1652fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("encoding specified in XML declaration is incorrect"), 1653fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("unclosed CDATA section"), 1654fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("error in processing external entity reference"), 1655fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("document is not standalone"), 1656fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("unexpected parser state - please send a bug report"), 1657fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("entity declared in parameter entity"), 1658fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("requested feature requires XML_DTD support in Expat"), 1659fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_L("cannot change setting once parsing has begun") 16601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis }; 16611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (code > 0 && code < sizeof(message)/sizeof(message[0])) 16621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return message[code]; 1663fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 16641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 16651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 16661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisconst XML_LChar * 16671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisXML_ExpatVersion(void) { 1668fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 1669fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* V1 is used to string-ize the version number. However, it would 1670fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis string-ize the actual version macro *names* unless we get them 1671fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis substituted before being passed to V1. CPP is defined to expand 1672fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis a macro, then rescan for more expansions. Thus, we use V2 to expand 1673fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis the version macros, then CPP will expand the resulting V1() macro 1674fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis with the correct numerals. */ 1675fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* ### I'm assuming cpp is portable in this respect... */ 1676fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 1677fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c) 1678fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#define V2(a,b,c) XML_L("expat_")V1(a,b,c) 1679fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 1680fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION); 1681fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 1682fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#undef V1 1683fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#undef V2 16841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 16851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 16861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisXML_Expat_Version 1687fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_ExpatVersionInfo(void) 1688fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 16891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Expat_Version version; 16901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 16911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis version.major = XML_MAJOR_VERSION; 16921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis version.minor = XML_MINOR_VERSION; 16931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis version.micro = XML_MICRO_VERSION; 16941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 16951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return version; 16961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 16971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1698fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisconst XML_Feature * 1699fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisXML_GetFeatureList(void) 17001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 1701fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis static XML_Feature features[] = { 1702fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)")}, 1703fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)")}, 1704fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_UNICODE 1705fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis {XML_FEATURE_UNICODE, XML_L("XML_UNICODE")}, 1706fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif 1707fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_UNICODE_WCHAR_T 1708fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T")}, 1709fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif 1710fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 1711fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis {XML_FEATURE_DTD, XML_L("XML_DTD")}, 1712fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif 1713fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_CONTEXT_BYTES 1714fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), 1715fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_CONTEXT_BYTES}, 1716fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif 1717fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_MIN_SIZE 1718fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE")}, 1719fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif 1720fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis {XML_FEATURE_END, NULL} 1721fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis }; 1722fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 1723fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis features[0].value = sizeof(XML_Char); 1724fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis features[1].value = sizeof(XML_LChar); 1725fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return features; 17261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 17271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1728fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* Initially tag->rawName always points into the parse buffer; 1729fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for those TAG instances opened while the current parse buffer was 1730fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processed, and not yet closed, we need to store tag->rawName in a more 1731fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis permanent location, since the parse buffer is about to be discarded. 1732fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/ 1733fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Bool 1734fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisstoreRawNames(XML_Parser parser) 1735fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 1736fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis TAG *tag = tagStack; 1737fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis while (tag) { 1738fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int bufSize; 1739fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1); 1740fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis char *rawNameBuf = tag->buf + nameLen; 1741fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* Stop if already stored. Since tagStack is a stack, we can stop 1742fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis at the first entry that has already been copied; everything 1743fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis below it in the stack is already been accounted for in a 1744fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis previous call to this function. 1745fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 1746fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (tag->rawName == rawNameBuf) 1747fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 1748fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* For re-use purposes we need to ensure that the 1749fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis size of tag->buf is a multiple of sizeof(XML_Char). 1750fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 1751fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)); 1752fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (bufSize > tag->bufEnd - tag->buf) { 1753fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis char *temp = (char *)REALLOC(tag->buf, bufSize); 1754fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (temp == NULL) 1755fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_FALSE; 1756fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* if tag->name.str points to tag->buf (only when namespace 1757fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processing is off) then we have to update it 1758fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 1759fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (tag->name.str == (XML_Char *)tag->buf) 1760fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->name.str = (XML_Char *)temp; 1761fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* if tag->name.localPart is set (when namespace processing is on) 1762fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis then update it as well, since it will always point into tag->buf 1763fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 1764fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (tag->name.localPart) 1765fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->name.localPart = (XML_Char *)temp + (tag->name.localPart - 1766fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (XML_Char *)tag->buf); 1767fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->buf = temp; 1768fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->bufEnd = temp + bufSize; 1769fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis rawNameBuf = temp + nameLen; 1770fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 1771fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis memcpy(rawNameBuf, tag->rawName, tag->rawNameLength); 1772fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->rawName = rawNameBuf; 1773fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag = tag->parent; 1774fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 1775fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_TRUE; 1776fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 1777fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 1778fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 1779fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwiscontentProcessor(XML_Parser parser, 1780fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start, 1781fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 1782fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **endPtr) 1783fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 1784fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result = 1785fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doContent(parser, 0, encoding, start, end, endPtr); 1786fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result != XML_ERROR_NONE) 1787fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 1788fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!storeRawNames(parser)) 1789fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 1790fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 1791fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 1792fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 1793fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 1794fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisexternalEntityInitProcessor(XML_Parser parser, 1795fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start, 1796fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 1797fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **endPtr) 17981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 17991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis enum XML_Error result = initializeEncoding(parser); 18001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (result != XML_ERROR_NONE) 18011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return result; 18021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis processor = externalEntityInitProcessor2; 18031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return externalEntityInitProcessor2(parser, start, end, endPtr); 18041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 18051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1806fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 1807fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisexternalEntityInitProcessor2(XML_Parser parser, 1808fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start, 1809fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 1810fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **endPtr) 18111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 1812fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *next = start; /* XmlContentTok doesn't always set the last arg */ 18131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int tok = XmlContentTok(encoding, start, end, &next); 18141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis switch (tok) { 18151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_BOM: 1816fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* If we are at the end of the buffer, this would cause the next stage, 1817fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis i.e. externalEntityInitProcessor3, to pass control directly to 1818fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doContent (by detecting XML_TOK_NONE) without processing any xml text 1819fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent. 1820fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 1821fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (next == end && endPtr) { 1822fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *endPtr = next; 1823fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 1824fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 18251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis start = next; 18261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 18271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL: 18281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (endPtr) { 18291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *endPtr = start; 18301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 18311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 18321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPtr = start; 18331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_UNCLOSED_TOKEN; 18341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL_CHAR: 18351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (endPtr) { 18361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *endPtr = start; 18371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 18381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 18391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPtr = start; 18401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_PARTIAL_CHAR; 18411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 18421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis processor = externalEntityInitProcessor3; 18431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return externalEntityInitProcessor3(parser, start, end, endPtr); 18441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 18451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1846fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 1847fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisexternalEntityInitProcessor3(XML_Parser parser, 1848fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start, 1849fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 1850fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **endPtr) 18511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 1852fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *next = start; /* XmlContentTok doesn't always set the last arg */ 18531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int tok = XmlContentTok(encoding, start, end, &next); 18541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis switch (tok) { 18551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_XML_DECL: 18561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis { 18571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis enum XML_Error result = processXmlDecl(parser, 1, start, next); 18581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (result != XML_ERROR_NONE) 1859fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 18601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis start = next; 18611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 18621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 18631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL: 18641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (endPtr) { 18651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *endPtr = start; 18661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 18671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 18681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPtr = start; 18691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_UNCLOSED_TOKEN; 18701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL_CHAR: 18711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (endPtr) { 18721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *endPtr = start; 18731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 18741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 18751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPtr = start; 18761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_PARTIAL_CHAR; 18771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 18781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis processor = externalEntityContentProcessor; 18791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis tagLevel = 1; 1880fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return externalEntityContentProcessor(parser, start, end, endPtr); 18811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 18821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 1883fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 1884fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisexternalEntityContentProcessor(XML_Parser parser, 1885fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start, 1886fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 1887fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **endPtr) 18881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 1889fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result = 1890fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doContent(parser, 1, encoding, start, end, endPtr); 1891fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result != XML_ERROR_NONE) 1892fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 1893fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!storeRawNames(parser)) 1894fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 1895fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 18961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 18971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 18981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 18991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisdoContent(XML_Parser parser, 1900fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int startTagLevel, 1901fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const ENCODING *enc, 1902fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *s, 1903fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 1904fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **nextPtr) 19051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 1906fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD * const dtd = _dtd; /* save one level of indirection */ 19071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char **eventPP; 19081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char **eventEndPP; 19091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (enc == encoding) { 19101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPP = &eventPtr; 19111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPP = &eventEndPtr; 19121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 19131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 19141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPP = &(openInternalEntities->internalEventPtr); 19151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPP = &(openInternalEntities->internalEventEndPtr); 19161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 19171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = s; 19181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 19191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *next = s; /* XmlContentTok doesn't always set the last arg */ 19201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int tok = XmlContentTok(enc, s, end, &next); 19211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventEndPP = next; 19221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis switch (tok) { 19231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_TRAILING_CR: 19241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nextPtr) { 1925fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = s; 1926fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 19271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 19281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventEndPP = end; 19291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (characterDataHandler) { 1930fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char c = 0xA; 1931fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characterDataHandler(handlerArg, &c, 1); 19321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 19331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else if (defaultHandler) 1934fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, end); 19351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (startTagLevel == 0) 1936fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_ELEMENTS; 19371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (tagLevel != startTagLevel) 1938fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_ASYNC_ENTITY; 19391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 19401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_NONE: 19411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nextPtr) { 1942fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = s; 1943fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 19441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 19451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (startTagLevel > 0) { 1946fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (tagLevel != startTagLevel) 1947fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_ASYNC_ENTITY; 1948fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 19491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 19501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NO_ELEMENTS; 19511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_INVALID: 19521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = next; 19531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_INVALID_TOKEN; 19541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL: 19551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nextPtr) { 1956fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = s; 1957fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 19581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 19591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_UNCLOSED_TOKEN; 19601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL_CHAR: 19611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nextPtr) { 1962fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = s; 1963fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 19641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 19651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_PARTIAL_CHAR; 19661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_ENTITY_REF: 19671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis { 1968fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *name; 1969fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ENTITY *entity; 1970fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, 1971fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s + enc->minBytesPerChar, 1972fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next - enc->minBytesPerChar); 1973fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (ch) { 1974fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (characterDataHandler) 1975fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characterDataHandler(handlerArg, &ch, 1); 1976fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (defaultHandler) 1977fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 1978fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 1979fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 1980fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis name = poolStoreString(&dtd->pool, enc, 1981fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s + enc->minBytesPerChar, 1982fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next - enc->minBytesPerChar); 1983fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!name) 1984fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 1985fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); 1986fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&dtd->pool); 1987fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* First, determine if a check for an existing declaration is needed; 1988fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if yes, check that the entity exists, and that it is internal, 1989fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis otherwise call the skipped entity or default handler. 1990fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 1991fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!dtd->hasParamEntityRefs || dtd->standalone) { 1992fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!entity) 1993fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_UNDEFINED_ENTITY; 1994fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (!entity->is_internal) 1995fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_ENTITY_DECLARED_IN_PE; 1996fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 1997fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (!entity) { 1998fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (skippedEntityHandler) 1999fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis skippedEntityHandler(handlerArg, name, 0); 2000fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (defaultHandler) 2001fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 2002fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 2003fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2004fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (entity->open) 2005fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_RECURSIVE_ENTITY_REF; 2006fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (entity->notation) 2007fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_BINARY_ENTITY_REF; 2008fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (entity->textPtr) { 2009fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result; 2010fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis OPEN_INTERNAL_ENTITY openEntity; 2011fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!defaultExpandInternalEntities) { 2012fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (skippedEntityHandler) 2013fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis skippedEntityHandler(handlerArg, entity->name, 0); 2014fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (defaultHandler) 2015fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 2016fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 2017fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2018fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_TRUE; 2019fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis openEntity.next = openInternalEntities; 2020fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis openInternalEntities = &openEntity; 2021fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis openEntity.entity = entity; 2022fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis openEntity.internalEventPtr = NULL; 2023fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis openEntity.internalEventEndPtr = NULL; 2024fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = doContent(parser, 2025fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tagLevel, 2026fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis internalEncoding, 2027fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (char *)entity->textPtr, 2028fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (char *)(entity->textPtr + entity->textLen), 2029fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 0); 2030fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_FALSE; 2031fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis openInternalEntities = openEntity.next; 2032fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result) 2033fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 2034fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2035fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (externalEntityRefHandler) { 2036fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *context; 2037fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_TRUE; 2038fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis context = getContext(parser); 2039fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_FALSE; 2040fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!context) 2041fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 2042fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!externalEntityRefHandler((XML_Parser)externalEntityRefHandlerArg, 2043fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis context, 2044fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->base, 2045fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->systemId, 2046fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->publicId)) 2047fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_EXTERNAL_ENTITY_HANDLING; 2048fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&tempPool); 2049fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2050fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (defaultHandler) 2051fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 2052fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 20531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 20541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_START_TAG_NO_ATTS: 2055fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* fall through */ 2056fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_START_TAG_WITH_ATTS: 20571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis { 2058fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis TAG *tag; 2059fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result; 2060fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char *toPtr; 2061fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (freeTagList) { 2062fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag = freeTagList; 2063fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis freeTagList = freeTagList->parent; 2064fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2065fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 2066fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag = (TAG *)MALLOC(sizeof(TAG)); 2067fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!tag) 2068fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 2069fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE); 2070fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!tag->buf) { 2071fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis FREE(tag); 2072fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 2073fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2074fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; 2075fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2076fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->bindings = NULL; 2077fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->parent = tagStack; 2078fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tagStack = tag; 2079fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->name.localPart = NULL; 2080fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->name.prefix = NULL; 2081fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->rawName = s + enc->minBytesPerChar; 2082fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->rawNameLength = XmlNameLength(enc, tag->rawName); 2083fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ++tagLevel; 2084fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis { 2085fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *rawNameEnd = tag->rawName + tag->rawNameLength; 2086fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *fromPtr = tag->rawName; 2087fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis toPtr = (XML_Char *)tag->buf; 2088fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (;;) { 2089fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int bufSize; 2090fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int convLen; 2091fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XmlConvert(enc, 2092fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &fromPtr, rawNameEnd, 2093fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); 2094fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis convLen = toPtr - (XML_Char *)tag->buf; 2095fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (fromPtr == rawNameEnd) { 2096fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->name.strLen = convLen; 2097fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 2098fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2099fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bufSize = (tag->bufEnd - tag->buf) << 1; 2100fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis { 2101fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis char *temp = (char *)REALLOC(tag->buf, bufSize); 2102fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (temp == NULL) 2103fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 2104fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->buf = temp; 2105fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->bufEnd = temp + bufSize; 2106fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis toPtr = (XML_Char *)temp + convLen; 2107fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2108fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2109fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2110fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->name.str = (XML_Char *)tag->buf; 2111fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *toPtr = XML_T('\0'); 2112fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!startElementHandler && (tok == XML_TOK_START_TAG_NO_ATTS)) { 2113fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (defaultHandler) 2114fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 2115fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 2116fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2117fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); 2118fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result) 2119fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 2120fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (startElementHandler) 2121fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis startElementHandler(handlerArg, tag->name.str, 2122fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (const XML_Char **)atts); 2123fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (defaultHandler) 2124fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 2125fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolClear(&tempPool); 2126fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 21271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 2128fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_EMPTY_ELEMENT_NO_ATTS: 2129fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!startElementHandler && !endElementHandler) { 2130fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (defaultHandler) 2131fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 2132fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (tagLevel == 0) 2133fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return epilogProcessor(parser, next, end, nextPtr); 2134fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 21351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 21361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* fall through */ 2137fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: 2138fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis { 2139fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *rawName = s + enc->minBytesPerChar; 2140fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result; 2141fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis BINDING *bindings = NULL; 2142fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool noElmHandlers = XML_TRUE; 2143fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis TAG_NAME name; 2144fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis name.str = poolStoreString(&tempPool, enc, rawName, 2145fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis rawName + XmlNameLength(enc, rawName)); 2146fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!name.str) 2147fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 2148fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&tempPool); 2149fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (startElementHandler || 2150fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (tok == XML_TOK_EMPTY_ELEMENT_WITH_ATTS)) { 2151fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = storeAtts(parser, enc, s, &name, &bindings); 2152fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result) 2153fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 2154fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&tempPool); 2155fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2156fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (startElementHandler) { 2157fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis startElementHandler(handlerArg, name.str, (const XML_Char **)atts); 2158fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis noElmHandlers = XML_FALSE; 2159fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2160fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (endElementHandler) { 2161fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (startElementHandler) 2162fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventPP = *eventEndPP; 2163fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis endElementHandler(handlerArg, name.str); 2164fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis noElmHandlers = XML_FALSE; 2165fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2166fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (noElmHandlers && defaultHandler) 2167fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 2168fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolClear(&tempPool); 2169fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis while (bindings) { 2170fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis BINDING *b = bindings; 2171fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (endNamespaceDeclHandler) 2172fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis endNamespaceDeclHandler(handlerArg, b->prefix->name); 2173fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis bindings = bindings->nextTagBinding; 2174fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis b->nextTagBinding = freeBindingList; 2175fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis freeBindingList = b; 2176fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis b->prefix->binding = b->prevPrefixBinding; 2177fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 21781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 21791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (tagLevel == 0) 2180fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return epilogProcessor(parser, next, end, nextPtr); 21811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 21821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_END_TAG: 21831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (tagLevel == startTagLevel) 21841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_ASYNC_ENTITY; 21851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 2186fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int len; 2187fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *rawName; 2188fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis TAG *tag = tagStack; 2189fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tagStack = tag->parent; 2190fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->parent = freeTagList; 2191fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis freeTagList = tag; 2192fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis rawName = s + enc->minBytesPerChar*2; 2193fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis len = XmlNameLength(enc, rawName); 2194fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (len != tag->rawNameLength 2195fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis || memcmp(tag->rawName, rawName, len) != 0) { 2196fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventPP = rawName; 2197fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_TAG_MISMATCH; 2198fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2199fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis --tagLevel; 2200fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (endElementHandler) { 2201fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *localPart; 2202fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *prefix; 2203fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char *uri; 2204fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis localPart = tag->name.localPart; 2205fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (ns && localPart) { 2206fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* localPart and prefix may have been overwritten in 2207fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->name.str, since this points to the binding->uri 2208fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis buffer which gets re-used; so we have to add them again 2209fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 2210fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis uri = (XML_Char *)tag->name.str + tag->name.uriLen; 2211fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* don't need to check for space - already done in storeAtts() */ 2212fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis while (*localPart) *uri++ = *localPart++; 2213fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis prefix = (XML_Char *)tag->name.prefix; 2214fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (ns_triplets && prefix) { 2215fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *uri++ = namespaceSeparator; 2216fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis while (*prefix) *uri++ = *prefix++; 2217fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2218fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *uri = XML_T('\0'); 2219fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2220fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis endElementHandler(handlerArg, tag->name.str); 2221fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2222fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (defaultHandler) 2223fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 2224fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis while (tag->bindings) { 2225fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis BINDING *b = tag->bindings; 2226fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (endNamespaceDeclHandler) 2227fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis endNamespaceDeclHandler(handlerArg, b->prefix->name); 2228fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tag->bindings = tag->bindings->nextTagBinding; 2229fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis b->nextTagBinding = freeBindingList; 2230fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis freeBindingList = b; 2231fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis b->prefix->binding = b->prevPrefixBinding; 2232fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2233fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (tagLevel == 0) 2234fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return epilogProcessor(parser, next, end, nextPtr); 22351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 22361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 22371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_CHAR_REF: 22381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis { 2239fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int n = XmlCharRefNumber(enc, s); 2240fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (n < 0) 2241fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_BAD_CHAR_REF; 2242fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (characterDataHandler) { 2243fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char buf[XML_ENCODE_MAX]; 2244fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf)); 2245fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2246fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (defaultHandler) 2247fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 22481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 22491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 22501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_XML_DECL: 22511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_MISPLACED_XML_PI; 22521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_DATA_NEWLINE: 22531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (characterDataHandler) { 2254fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char c = 0xA; 2255fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characterDataHandler(handlerArg, &c, 1); 22561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 22571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else if (defaultHandler) 2258fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 22591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 22601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_CDATA_SECT_OPEN: 22611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis { 2262fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result; 2263fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (startCdataSectionHandler) 2264fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis startCdataSectionHandler(handlerArg); 22651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#if 0 2266fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* Suppose you doing a transformation on a document that involves 2267fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis changing only the character data. You set up a defaultHandler 2268fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis and a characterDataHandler. The defaultHandler simply copies 2269fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characters through. The characterDataHandler does the 2270fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis transformation and writes the characters out escaping them as 2271fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis necessary. This case will fail to work if we leave out the 2272fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis following two lines (because & and < inside CDATA sections will 2273fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis be incorrectly escaped). 2274fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 2275fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis However, now we have a start/endCdataSectionHandler, so it seems 2276fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis easier to let the user deal with this. 2277fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 2278fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (characterDataHandler) 2279fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characterDataHandler(handlerArg, dataBuf, 0); 22801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif 2281fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (defaultHandler) 2282fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 2283fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = doCdataSection(parser, enc, &next, end, nextPtr); 2284fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!next) { 2285fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processor = cdataSectionProcessor; 2286fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 2287fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 22881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 22891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 22901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_TRAILING_RSQB: 22911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nextPtr) { 2292fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = s; 2293fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 22941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 22951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (characterDataHandler) { 2296fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (MUST_CONVERT(enc, s)) { 2297fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ICHAR *dataPtr = (ICHAR *)dataBuf; 2298fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); 2299fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characterDataHandler(handlerArg, dataBuf, 2300fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dataPtr - (ICHAR *)dataBuf); 2301fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2302fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else 2303fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characterDataHandler(handlerArg, 2304fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (XML_Char *)s, 2305fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (XML_Char *)end - (XML_Char *)s); 23061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 23071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else if (defaultHandler) 2308fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, end); 23091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (startTagLevel == 0) { 23101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = end; 2311fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_ELEMENTS; 23121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 23131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (tagLevel != startTagLevel) { 2314fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventPP = end; 2315fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_ASYNC_ENTITY; 23161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 23171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 23181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_DATA_CHARS: 23191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (characterDataHandler) { 2320fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (MUST_CONVERT(enc, s)) { 2321fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (;;) { 2322fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ICHAR *dataPtr = (ICHAR *)dataBuf; 2323fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); 2324fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventEndPP = s; 2325fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characterDataHandler(handlerArg, dataBuf, 2326fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dataPtr - (ICHAR *)dataBuf); 2327fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (s == next) 2328fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 2329fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventPP = s; 2330fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2331fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2332fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else 2333fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characterDataHandler(handlerArg, 2334fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (XML_Char *)s, 2335fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (XML_Char *)next - (XML_Char *)s); 23361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 23371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else if (defaultHandler) 2338fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 23391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 23401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PI: 23411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!reportProcessingInstruction(parser, enc, s, next)) 2342fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 23431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 23441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_COMMENT: 23451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!reportComment(parser, enc, s, next)) 2346fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 23471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 23481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis default: 23491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (defaultHandler) 2350fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 23511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 23521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 23531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = s = next; 23541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 23551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* not reached */ 23561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 23571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 23581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis/* If tagNamePtr is non-null, build a real list of attributes, 2359fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis otherwise just check the attributes for well-formedness. 2360fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/ 2361fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error 2362fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisstoreAtts(XML_Parser parser, const ENCODING *enc, 2363fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *attStr, TAG_NAME *tagNamePtr, 2364fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis BINDING **bindingsPtr) 23651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 2366fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD * const dtd = _dtd; /* save one level of indirection */ 2367fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ELEMENT_TYPE *elementType = NULL; 23681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int nDefaultAtts = 0; 2369fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char **appAtts; /* the attribute list for the application */ 23701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int attIndex = 0; 2371fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int prefixLen; 23721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int i; 23731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int n; 2374fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char *uri; 23751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int nPrefixes = 0; 23761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BINDING *binding; 23771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *localPart; 23781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 23791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* lookup the element type name */ 23801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (tagNamePtr) { 2381fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, tagNamePtr->str,0); 23821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!elementType) { 2383fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); 2384fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!name) 2385fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 2386fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, name, 2387fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis sizeof(ELEMENT_TYPE)); 23881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!elementType) 23891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NO_MEMORY; 23901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (ns && !setElementTypePrefix(parser, elementType)) 23911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NO_MEMORY; 23921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 23931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis nDefaultAtts = elementType->nDefaultAtts; 23941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 23951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* get the attributes from the tokenizer */ 23961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis n = XmlGetAttributes(enc, attStr, attsSize, atts); 23971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (n + nDefaultAtts > attsSize) { 23981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int oldAttsSize = attsSize; 2399fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ATTRIBUTE *temp; 24001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; 2401fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); 2402fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (temp == NULL) 24031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NO_MEMORY; 2404fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis atts = temp; 24051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (n > oldAttsSize) 24061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XmlGetAttributes(enc, attStr, n, atts); 24071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 24081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis appAtts = (const XML_Char **)atts; 24091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (i = 0; i < n; i++) { 24101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* add the name and value to the attribute list */ 24111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name, 2412fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis atts[i].name 2413fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis + XmlNameLength(enc, atts[i].name)); 24141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!attId) 24151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NO_MEMORY; 24161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* detect duplicate attributes */ 24171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if ((attId->name)[-1]) { 24181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (enc == encoding) 2419fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = atts[i].name; 24201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_DUPLICATE_ATTRIBUTE; 24211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 24221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis (attId->name)[-1] = 1; 24231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis appAtts[attIndex++] = attId->name; 24241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!atts[i].normalized) { 24251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis enum XML_Error result; 2426fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool isCdata = XML_TRUE; 24271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 24281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* figure out whether declared as other than CDATA */ 24291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (attId->maybeTokenized) { 2430fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int j; 2431fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (j = 0; j < nDefaultAtts; j++) { 2432fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (attId == elementType->defaultAtts[j].id) { 2433fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis isCdata = elementType->defaultAtts[j].isCdata; 2434fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 2435fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2436fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 24371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 24381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 24391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* normalize the attribute value */ 24401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis result = storeAttributeValue(parser, enc, isCdata, 2441fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis atts[i].valuePtr, atts[i].valueEnd, 2442fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &tempPool); 24431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (result) 2444fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 24451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (tagNamePtr) { 2446fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis appAtts[attIndex] = poolStart(&tempPool); 2447fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&tempPool); 24481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 24491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 2450fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&tempPool); 24511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 24521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else if (tagNamePtr) { 24531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* the value did not need normalizing */ 2454fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr, 2455fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis atts[i].valueEnd); 24561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (appAtts[attIndex] == 0) 2457fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 24581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolFinish(&tempPool); 24591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 24601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* handle prefixed attribute names */ 24611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (attId->prefix && tagNamePtr) { 24621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (attId->xmlns) { 2463fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* deal with namespace declarations here */ 2464fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result = addBinding(parser, attId->prefix, attId, 2465fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis appAtts[attIndex], bindingsPtr); 2466fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result) 2467fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 24681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis --attIndex; 24691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 24701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 2471fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* deal with other prefixed names later */ 24721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis attIndex++; 24731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis nPrefixes++; 24741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis (attId->name)[-1] = 2; 24751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 24761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 24771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 24781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis attIndex++; 24791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 24801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (tagNamePtr) { 24811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int j; 24821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis nSpecifiedAtts = attIndex; 24831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (elementType->idAtt && (elementType->idAtt->name)[-1]) { 24841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (i = 0; i < attIndex; i += 2) 2485fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (appAtts[i] == elementType->idAtt->name) { 2486fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis idAttIndex = i; 2487fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 2488fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 24891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 24901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 24911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis idAttIndex = -1; 24921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* do attribute defaulting */ 24931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (j = 0; j < nDefaultAtts; j++) { 24941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + j; 24951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!(da->id->name)[-1] && da->value) { 24961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (da->id->prefix) { 24971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (da->id->xmlns) { 2498fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result = addBinding(parser, da->id->prefix, da->id, 2499fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis da->value, bindingsPtr); 2500fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result) 2501fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 2502fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 25031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 2504fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (da->id->name)[-1] = 2; 2505fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis nPrefixes++; 2506fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis appAtts[attIndex++] = da->id->name; 2507fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis appAtts[attIndex++] = da->value; 2508fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2509fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2510fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 2511fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (da->id->name)[-1] = 1; 2512fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis appAtts[attIndex++] = da->id->name; 2513fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis appAtts[attIndex++] = da->value; 2514fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 25151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 25161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 25171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis appAtts[attIndex] = 0; 25181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 25191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis i = 0; 25201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nPrefixes) { 25211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* expand prefixed attribute names */ 25221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (; i < attIndex; i += 2) { 25231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (appAtts[i][-1] == 2) { 25241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ATTRIBUTE_ID *id; 25251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ((XML_Char *)(appAtts[i]))[-1] = 0; 2526fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, appAtts[i], 0); 2527fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (id->prefix->binding) { 2528fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int j; 2529fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const BINDING *b = id->prefix->binding; 2530fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *s = appAtts[i]; 2531fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (j = 0; j < b->uriLen; j++) { 2532fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendChar(&tempPool, b->uri[j])) 2533fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 2534fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2535fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis while (*s++ != XML_T(':')) 2536fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ; 2537fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis do { 2538fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendChar(&tempPool, *s)) 2539fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 2540fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } while (*s++); 2541fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (ns_triplets) { 2542fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tempPool.ptr[-1] = namespaceSeparator; 2543fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s = b->prefix->name; 2544fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis do { 2545fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendChar(&tempPool, *s)) 2546fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 2547fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } while (*s++); 2548fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2549fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 2550fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis appAtts[i] = poolStart(&tempPool); 2551fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&tempPool); 2552fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2553fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!--nPrefixes) 2554fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 25551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 25561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 2557fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ((XML_Char *)(appAtts[i]))[-1] = 0; 25581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 25591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 25601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* clear the flags that say whether attributes were specified */ 25611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (; i < attIndex; i += 2) 25621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ((XML_Char *)(appAtts[i]))[-1] = 0; 25631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!tagNamePtr) 25641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 25651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding) 25661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis binding->attId->name[-1] = 0; 25671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* expand the element type name */ 25681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (elementType->prefix) { 25691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis binding = elementType->prefix->binding; 25701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!binding) 25711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 25721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis localPart = tagNamePtr->str; 25731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis while (*localPart++ != XML_T(':')) 25741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ; 25751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 2576fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (dtd->defaultPrefix.binding) { 2577fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis binding = dtd->defaultPrefix.binding; 25781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis localPart = tagNamePtr->str; 25791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 25801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 25811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 2582fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis prefixLen = 0; 2583fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (ns && ns_triplets && binding->prefix->name) { 2584fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (; binding->prefix->name[prefixLen++];) 2585fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ; 2586fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 25871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis tagNamePtr->localPart = localPart; 25881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis tagNamePtr->uriLen = binding->uriLen; 2589fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tagNamePtr->prefix = binding->prefix->name; 2590fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tagNamePtr->prefixLen = prefixLen; 25911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (i = 0; localPart[i++];) 25921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ; 2593fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis n = i + binding->uriLen + prefixLen; 25941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (n > binding->uriAlloc) { 25951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis TAG *p; 2596fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char)); 25971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!uri) 25981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NO_MEMORY; 25991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis binding->uriAlloc = n + EXPAND_SPARE; 26001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char)); 26011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (p = tagStack; p; p = p->parent) 26021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (p->name.str == binding->uri) 2603fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->name.str = uri; 26041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis FREE(binding->uri); 26051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis binding->uri = uri; 26061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 2607fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis uri = binding->uri + binding->uriLen; 2608fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis memcpy(uri, localPart, i * sizeof(XML_Char)); 2609fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (prefixLen) { 2610fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis uri = uri + (i - 1); 2611fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (namespaceSeparator) { *(uri) = namespaceSeparator; } 2612fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char)); 2613fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 26141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis tagNamePtr->str = binding->uri; 26151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 26161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 26171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 2618fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* addBinding() overwrites the value of prefix->binding without checking. 2619fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis Therefore one must keep track of the old value outside of addBinding(). 2620fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/ 2621fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error 2622fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisaddBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, 2623fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *uri, BINDING **bindingsPtr) 26241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 26251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BINDING *b; 26261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int len; 2627fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 2628fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* empty string is only valid when there is no prefix per XML NS 1.0 */ 2629fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (*uri == XML_T('\0') && prefix->name) 2630fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_SYNTAX; 2631fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 26321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (len = 0; uri[len]; len++) 26331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ; 26341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (namespaceSeparator) 26351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis len++; 26361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (freeBindingList) { 26371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis b = freeBindingList; 26381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (len > b->uriAlloc) { 2639fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char *temp = (XML_Char *)REALLOC(b->uri, 2640fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis sizeof(XML_Char) * (len + EXPAND_SPARE)); 2641fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (temp == NULL) 2642fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 2643fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis b->uri = temp; 26441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis b->uriAlloc = len + EXPAND_SPARE; 26451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 26461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis freeBindingList = b->nextTagBinding; 26471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 26481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 2649fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis b = (BINDING *)MALLOC(sizeof(BINDING)); 26501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!b) 2651fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 2652fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE)); 26531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!b->uri) { 26541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis FREE(b); 2655fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 26561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 26571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis b->uriAlloc = len + EXPAND_SPARE; 26581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 26591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis b->uriLen = len; 26601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis memcpy(b->uri, uri, len * sizeof(XML_Char)); 26611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (namespaceSeparator) 26621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis b->uri[len - 1] = namespaceSeparator; 26631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis b->prefix = prefix; 26641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis b->attId = attId; 26651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis b->prevPrefixBinding = prefix->binding; 2666fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix) 2667fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis prefix->binding = NULL; 26681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 26691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis prefix->binding = b; 26701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis b->nextTagBinding = *bindingsPtr; 26711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *bindingsPtr = b; 26721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (startNamespaceDeclHandler) 26731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis startNamespaceDeclHandler(handlerArg, prefix->name, 2674fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis prefix->binding ? uri : 0); 2675fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 26761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 26771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 26781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis/* The idea here is to avoid using stack for each CDATA section when 2679fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis the whole file is parsed with one call. 2680fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/ 2681fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 2682fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwiscdataSectionProcessor(XML_Parser parser, 2683fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start, 2684fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 2685fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **endPtr) 26861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 2687fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result = doCdataSection(parser, encoding, &start, 2688fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis end, endPtr); 26891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (start) { 2690fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (parentParser) { /* we are parsing an external entity */ 2691fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processor = externalEntityContentProcessor; 2692fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return externalEntityContentProcessor(parser, start, end, endPtr); 2693fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2694fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 2695fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processor = contentProcessor; 2696fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return contentProcessor(parser, start, end, endPtr); 2697fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 26981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 26991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return result; 27001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 27011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 27021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis/* startPtr gets set to non-null is the section is closed, and to null if 2703fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis the section is not yet closed. 2704fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/ 2705fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error 2706fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdoCdataSection(XML_Parser parser, 2707fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const ENCODING *enc, 2708fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **startPtr, 2709fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 2710fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **nextPtr) 27111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 27121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *s = *startPtr; 27131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char **eventPP; 27141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char **eventEndPP; 27151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (enc == encoding) { 27161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPP = &eventPtr; 27171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = s; 27181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPP = &eventEndPtr; 27191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 27201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 27211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPP = &(openInternalEntities->internalEventPtr); 27221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPP = &(openInternalEntities->internalEventEndPtr); 27231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 27241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = s; 2725fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *startPtr = NULL; 27261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 27271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *next; 27281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int tok = XmlCdataSectionTok(enc, s, end, &next); 27291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventEndPP = next; 27301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis switch (tok) { 27311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_CDATA_SECT_CLOSE: 27321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (endCdataSectionHandler) 2733fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis endCdataSectionHandler(handlerArg); 27341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#if 0 27351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* see comment under XML_TOK_CDATA_SECT_OPEN */ 27361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else if (characterDataHandler) 2737fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characterDataHandler(handlerArg, dataBuf, 0); 27381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif 27391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else if (defaultHandler) 2740fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 27411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *startPtr = next; 27421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 27431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_DATA_NEWLINE: 27441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (characterDataHandler) { 2745fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char c = 0xA; 2746fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characterDataHandler(handlerArg, &c, 1); 27471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 27481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else if (defaultHandler) 2749fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 27501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 27511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_DATA_CHARS: 27521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (characterDataHandler) { 2753fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (MUST_CONVERT(enc, s)) { 2754fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (;;) { 2755fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ICHAR *dataPtr = (ICHAR *)dataBuf; 2756fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); 2757fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventEndPP = next; 2758fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characterDataHandler(handlerArg, dataBuf, 2759fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dataPtr - (ICHAR *)dataBuf); 2760fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (s == next) 2761fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 2762fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventPP = s; 2763fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2764fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 2765fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else 2766fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis characterDataHandler(handlerArg, 2767fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (XML_Char *)s, 2768fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (XML_Char *)next - (XML_Char *)s); 27691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 27701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else if (defaultHandler) 2771fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 27721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 27731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_INVALID: 27741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = next; 27751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_INVALID_TOKEN; 27761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL_CHAR: 27771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nextPtr) { 2778fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = s; 2779fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 27801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 27811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_PARTIAL_CHAR; 27821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL: 27831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_NONE: 27841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nextPtr) { 2785fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = s; 2786fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 27871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 27881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_UNCLOSED_CDATA_SECTION; 27891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis default: 27901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = next; 27911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_UNEXPECTED_STATE; 27921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 27931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = s = next; 27941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 27951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* not reached */ 27961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 27971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 27981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 27991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 28001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis/* The idea here is to avoid using stack for each IGNORE section when 2801fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis the whole file is parsed with one call. 2802fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/ 2803fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 2804fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisignoreSectionProcessor(XML_Parser parser, 2805fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start, 2806fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 2807fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **endPtr) 28081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 2809fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result = doIgnoreSection(parser, encoding, &start, 2810fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis end, endPtr); 28111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (start) { 28121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis processor = prologProcessor; 28131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return prologProcessor(parser, start, end, endPtr); 28141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 28151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return result; 28161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 28171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 2818fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* startPtr gets set to non-null is the section is closed, and to null 2819fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if the section is not yet closed. 2820fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/ 2821fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error 2822fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdoIgnoreSection(XML_Parser parser, 2823fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const ENCODING *enc, 2824fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **startPtr, 2825fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 2826fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **nextPtr) 28271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 28281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *next; 28291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int tok; 28301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *s = *startPtr; 28311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char **eventPP; 28321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char **eventEndPP; 28331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (enc == encoding) { 28341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPP = &eventPtr; 28351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = s; 28361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPP = &eventEndPtr; 28371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 28381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 28391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPP = &(openInternalEntities->internalEventPtr); 28401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPP = &(openInternalEntities->internalEventEndPtr); 28411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 28421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = s; 2843fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *startPtr = NULL; 28441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis tok = XmlIgnoreSectionTok(enc, s, end, &next); 28451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventEndPP = next; 28461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis switch (tok) { 28471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_IGNORE_SECT: 28481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (defaultHandler) 28491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis reportDefault(parser, enc, s, next); 28501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *startPtr = next; 28511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 28521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_INVALID: 28531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = next; 28541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_INVALID_TOKEN; 28551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL_CHAR: 28561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nextPtr) { 28571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *nextPtr = s; 28581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 28591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 28601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_PARTIAL_CHAR; 28611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL: 28621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_NONE: 28631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nextPtr) { 28641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *nextPtr = s; 28651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 28661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 28671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */ 28681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis default: 28691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = next; 28701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_UNEXPECTED_STATE; 28711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 28721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* not reached */ 28731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 28741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 28751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 28761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 28771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 28781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisinitializeEncoding(XML_Parser parser) 28791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 28801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *s; 28811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_UNICODE 28821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis char encodingBuf[128]; 28831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!protocolEncodingName) 2884fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s = NULL; 28851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 28861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int i; 28871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (i = 0; protocolEncodingName[i]; i++) { 28881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (i == sizeof(encodingBuf) - 1 2889fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis || (protocolEncodingName[i] & ~0x7f) != 0) { 2890fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis encodingBuf[0] = '\0'; 2891fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 28921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 28931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis encodingBuf[i] = (char)protocolEncodingName[i]; 28941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 28951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis encodingBuf[i] = '\0'; 28961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis s = encodingBuf; 28971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 28981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else 28991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis s = protocolEncodingName; 29001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif 29011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s)) 29021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 29031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return handleUnknownEncoding(parser, protocolEncodingName); 29041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 29051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 29061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 29071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisprocessXmlDecl(XML_Parser parser, int isGeneralTextEntity, 2908fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *s, const char *next) 29091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 2910fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *encodingName = NULL; 2911fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *storedEncName = NULL; 2912fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const ENCODING *newEncoding = NULL; 2913fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *version = NULL; 29141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *versionend; 2915fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *storedversion = NULL; 29161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int standalone = -1; 29171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!(ns 29181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ? XmlParseXmlDeclNS 2919fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis : XmlParseXmlDecl)(isGeneralTextEntity, 2920fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis encoding, 2921fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s, 2922fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next, 2923fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &eventPtr, 2924fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &version, 2925fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &versionend, 2926fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &encodingName, 2927fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &newEncoding, 2928fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &standalone)) 29291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_SYNTAX; 29301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!isGeneralTextEntity && standalone == 1) { 2931fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis _dtd->standalone = XML_TRUE; 29321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 29331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) 29341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; 29351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 29361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 29371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (xmlDeclHandler) { 2938fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (encodingName != NULL) { 29391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis storedEncName = poolStoreString(&temp2Pool, 2940fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis encoding, 2941fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis encodingName, 2942fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis encodingName 2943fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis + XmlNameLength(encoding, encodingName)); 2944fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!storedEncName) 2945fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 29461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolFinish(&temp2Pool); 29471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 29481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (version) { 29491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis storedversion = poolStoreString(&temp2Pool, 2950fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis encoding, 2951fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis version, 2952fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis versionend - encoding->minBytesPerChar); 2953fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!storedversion) 2954fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 29551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 29561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone); 29571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 29581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else if (defaultHandler) 29591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis reportDefault(parser, encoding, s, next); 2960fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (protocolEncodingName == NULL) { 29611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (newEncoding) { 29621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) { 2963fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = encodingName; 2964fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_INCORRECT_ENCODING; 29651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 29661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis encoding = newEncoding; 29671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 29681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else if (encodingName) { 29691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis enum XML_Error result; 2970fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!storedEncName) { 2971fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis storedEncName = poolStoreString( 2972fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &temp2Pool, encoding, encodingName, 2973fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis encodingName + XmlNameLength(encoding, encodingName)); 2974fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!storedEncName) 2975fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 29761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 29771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis result = handleUnknownEncoding(parser, storedEncName); 2978fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolClear(&temp2Pool); 29791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (result == XML_ERROR_UNKNOWN_ENCODING) 2980fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = encodingName; 29811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return result; 29821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 29831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 29841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 29851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (storedEncName || storedversion) 29861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolClear(&temp2Pool); 29871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 29881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 29891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 29901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 29911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 29921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwishandleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) 29931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 29941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (unknownEncodingHandler) { 29951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Encoding info; 29961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int i; 29971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (i = 0; i < 256; i++) 29981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis info.map[i] = -1; 2999fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis info.convert = NULL; 3000fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis info.data = NULL; 3001fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis info.release = NULL; 3002fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, 3003fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &info)) { 30041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ENCODING *enc; 30051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding()); 30061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!unknownEncodingMem) { 3007fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (info.release) 3008fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis info.release(info.data); 3009fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 30101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 30111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis enc = (ns 3012fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ? XmlInitUnknownEncodingNS 3013fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis : XmlInitUnknownEncoding)(unknownEncodingMem, 3014fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis info.map, 3015fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis info.convert, 3016fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis info.data); 30171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (enc) { 3018fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis unknownEncodingData = info.data; 3019fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis unknownEncodingRelease = info.release; 3020fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis encoding = enc; 3021fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 30221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 30231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 3024fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (info.release != NULL) 3025fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis info.release(info.data); 3026fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3027fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_UNKNOWN_ENCODING; 3028fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 3029fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 3030fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 3031fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisprologInitProcessor(XML_Parser parser, 3032fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *s, 3033fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 3034fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **nextPtr) 3035fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 3036fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result = initializeEncoding(parser); 3037fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result != XML_ERROR_NONE) 3038fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 3039fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processor = prologProcessor; 3040fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return prologProcessor(parser, s, end, nextPtr); 3041fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 3042fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 3043fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 3044fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 3045fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 3046fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisexternalParEntInitProcessor(XML_Parser parser, 3047fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *s, 3048fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 3049fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **nextPtr) 3050fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 3051fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result = initializeEncoding(parser); 3052fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result != XML_ERROR_NONE) 3053fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 3054fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 3055fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* we know now that XML_Parse(Buffer) has been called, 3056fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis so we consider the external parameter entity read */ 3057fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis _dtd->paramEntityRead = XML_TRUE; 3058fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 3059fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (prologState.inEntityValue) { 3060fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processor = entityValueInitProcessor; 3061fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return entityValueInitProcessor(parser, s, end, nextPtr); 3062fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3063fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 3064fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processor = externalParEntProcessor; 3065fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return externalParEntProcessor(parser, s, end, nextPtr); 3066fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3067fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 3068fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 3069fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 3070fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisentityValueInitProcessor(XML_Parser parser, 3071fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *s, 3072fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 3073fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **nextPtr) 3074fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 3075fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start = s; 3076fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *next = s; 3077fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int tok; 3078fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 3079fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (;;) { 3080fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tok = XmlPrologTok(encoding, start, end, &next); 3081fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (tok <= 0) { 3082fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (nextPtr != 0 && tok != XML_TOK_INVALID) { 3083fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = s; 3084fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 3085fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3086fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis switch (tok) { 3087fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_INVALID: 3088fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_INVALID_TOKEN; 3089fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_PARTIAL: 3090fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_UNCLOSED_TOKEN; 3091fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_PARTIAL_CHAR: 3092fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_PARTIAL_CHAR; 3093fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_NONE: /* start == end */ 3094fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis default: 3095fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 3096fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3097fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return storeEntityValue(parser, encoding, s, end); 3098fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3099fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (tok == XML_TOK_XML_DECL) { 3100fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result = processXmlDecl(parser, 0, start, next); 3101fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result != XML_ERROR_NONE) 3102fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 3103fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (nextPtr) *nextPtr = next; 3104fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* stop scanning for text declaration - we found one */ 3105fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processor = entityValueProcessor; 3106fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return entityValueProcessor(parser, next, end, nextPtr); 3107fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3108fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* If we are at the end of the buffer, this would cause XmlPrologTok to 3109fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_TOK_NONE on the next call, which would then cause the 3110fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis function to exit with *nextPtr set to s - that is what we want for other 3111fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tokens, but not for the BOM - we would rather like to skip it; 3112fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis then, when this routine is entered the next time, XmlPrologTok will 3113fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_TOK_INVALID, since the BOM is still in the buffer 3114fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 3115fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (tok == XML_TOK_BOM && next == end && nextPtr) { 3116fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = next; 3117fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 3118fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3119fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis start = next; 3120fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3121fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 3122fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 3123fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 3124fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisexternalParEntProcessor(XML_Parser parser, 3125fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *s, 3126fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 3127fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **nextPtr) 3128fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 3129fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start = s; 3130fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *next = s; 3131fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int tok; 3132fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 3133fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tok = XmlPrologTok(encoding, start, end, &next); 3134fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (tok <= 0) { 3135fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (nextPtr != 0 && tok != XML_TOK_INVALID) { 3136fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = s; 3137fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 3138fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3139fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis switch (tok) { 3140fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_INVALID: 3141fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_INVALID_TOKEN; 3142fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_PARTIAL: 3143fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_UNCLOSED_TOKEN; 3144fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_PARTIAL_CHAR: 3145fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_PARTIAL_CHAR; 3146fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_NONE: /* start == end */ 3147fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis default: 3148fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 3149fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 31501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 3151fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM. 3152fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis However, when parsing an external subset, doProlog will not accept a BOM 3153fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis as valid, and report a syntax error, so we have to skip the BOM 3154fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 3155fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (tok == XML_TOK_BOM) { 3156fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s = next; 3157fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tok = XmlPrologTok(encoding, s, end, &next); 3158fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3159fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 3160fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processor = prologProcessor; 3161fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return doProlog(parser, encoding, s, end, tok, next, nextPtr); 31621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 31631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 3164fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 3165fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisentityValueProcessor(XML_Parser parser, 3166fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *s, 3167fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 3168fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **nextPtr) 31691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 3170fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start = s; 3171fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *next = s; 3172fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const ENCODING *enc = encoding; 3173fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int tok; 3174fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 3175fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (;;) { 3176fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tok = XmlPrologTok(enc, start, end, &next); 3177fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (tok <= 0) { 3178fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (nextPtr != 0 && tok != XML_TOK_INVALID) { 3179fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = s; 3180fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 3181fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3182fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis switch (tok) { 3183fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_INVALID: 3184fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_INVALID_TOKEN; 3185fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_PARTIAL: 3186fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_UNCLOSED_TOKEN; 3187fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_PARTIAL_CHAR: 3188fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_PARTIAL_CHAR; 3189fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_TOK_NONE: /* start == end */ 3190fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis default: 3191fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 3192fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3193fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return storeEntityValue(parser, enc, s, end); 3194fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3195fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis start = next; 3196fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 31971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 31981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 3199fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */ 3200fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 3201fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 32021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisprologProcessor(XML_Parser parser, 3203fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *s, 3204fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 3205fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **nextPtr) 32061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 3207fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *next = s; 32081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int tok = XmlPrologTok(encoding, s, end, &next); 32091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return doProlog(parser, encoding, s, end, tok, next, nextPtr); 32101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 32111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 32121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 32131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisdoProlog(XML_Parser parser, 3214fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const ENCODING *enc, 3215fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *s, 3216fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 3217fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int tok, 3218fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *next, 3219fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **nextPtr) 32201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 32211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 32221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis static const XML_Char externalSubsetName[] = { '#' , '\0' }; 32231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 3224fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis static const XML_Char atypeCDATA[] = { 'C', 'D', 'A', 'T', 'A', '\0' }; 3225fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis static const XML_Char atypeID[] = { 'I', 'D', '\0' }; 3226fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis static const XML_Char atypeIDREF[] = { 'I', 'D', 'R', 'E', 'F', '\0' }; 3227fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis static const XML_Char atypeIDREFS[] = { 'I', 'D', 'R', 'E', 'F', 'S', '\0' }; 3228fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis static const XML_Char atypeENTITY[] = { 'E', 'N', 'T', 'I', 'T', 'Y', '\0' }; 3229fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis static const XML_Char atypeENTITIES[] = 3230fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis { 'E', 'N', 'T', 'I', 'T', 'I', 'E', 'S', '\0' }; 3231fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis static const XML_Char atypeNMTOKEN[] = { 3232fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 'N', 'M', 'T', 'O', 'K', 'E', 'N', '\0' }; 3233fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis static const XML_Char atypeNMTOKENS[] = { 3234fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 'N', 'M', 'T', 'O', 'K', 'E', 'N', 'S', '\0' }; 3235fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis static const XML_Char notationPrefix[] = { 3236fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N', '(', '\0' }; 3237fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis static const XML_Char enumValueSep[] = { '|', '\0' }; 3238fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis static const XML_Char enumValueStart[] = { '(', '\0' }; 3239fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 3240fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD * const dtd = _dtd; /* save one level of indirection */ 32411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 32421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char **eventPP; 32431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char **eventEndPP; 32441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis enum XML_Content_Quant quant; 32451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 32461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (enc == encoding) { 32471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPP = &eventPtr; 32481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPP = &eventEndPtr; 32491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 32501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 32511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPP = &(openInternalEntities->internalEventPtr); 32521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPP = &(openInternalEntities->internalEventEndPtr); 32531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 32541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 32551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int role; 3256fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool handleDefault = XML_TRUE; 32571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = s; 32581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventEndPP = next; 32591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (tok <= 0) { 32601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nextPtr != 0 && tok != XML_TOK_INVALID) { 3261fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = s; 3262fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 32631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 32641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis switch (tok) { 32651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_INVALID: 3266fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventPP = next; 3267fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_INVALID_TOKEN; 32681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL: 3269fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_UNCLOSED_TOKEN; 32701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL_CHAR: 3271fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_PARTIAL_CHAR; 32721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_NONE: 32731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 3274fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (enc != encoding) 3275fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 3276fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (isParamEntity) { 3277fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc) 3278fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis == XML_ROLE_ERROR) 3279fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_SYNTAX; 3280fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 3281fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 32821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 3283fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_ELEMENTS; 32841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis default: 3285fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tok = -tok; 3286fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next = end; 3287fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 32881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 32891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 32901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis role = XmlTokenRole(&prologState, tok, s, next, enc); 32911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis switch (role) { 32921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_XML_DECL: 32931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis { 3294fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result = processXmlDecl(parser, 0, s, next); 3295fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result != XML_ERROR_NONE) 3296fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 3297fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enc = encoding; 3298fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 32991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 33001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 33011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_DOCTYPE_NAME: 33021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (startDoctypeDeclHandler) { 3303fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doctypeName = poolStoreString(&tempPool, enc, s, next); 3304fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!doctypeName) 3305fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3306fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&tempPool); 3307fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doctypePubid = NULL; 3308fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 33091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 3310fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doctypeSysid = NULL; /* always initialize to NULL */ 33111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 33121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_DOCTYPE_INTERNAL_SUBSET: 33131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (startDoctypeDeclHandler) { 3314fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid, 3315fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doctypePubid, 1); 3316fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doctypeName = NULL; 3317fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolClear(&tempPool); 3318fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 33191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 33201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 33211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 33221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_TEXT_DECL: 33231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis { 3324fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result = processXmlDecl(parser, 1, s, next); 3325fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result != XML_ERROR_NONE) 3326fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 3327fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enc = encoding; 3328fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 33291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 33301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 33311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 33321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_DOCTYPE_PUBLIC_ID: 3333fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 3334fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis useForeignDTD = XML_FALSE; 3335fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */ 3336fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->hasParamEntityRefs = XML_TRUE; 33371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (startDoctypeDeclHandler) { 3338fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doctypePubid = poolStoreString(&tempPool, enc, 3339fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s + enc->minBytesPerChar, 3340fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next - enc->minBytesPerChar); 3341fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!doctypePubid) 3342fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3343fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&tempPool); 3344fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 33451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 33461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 3347fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity = (ENTITY *)lookup(&dtd->paramEntities, 3348fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis externalSubsetName, 3349fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis sizeof(ENTITY)); 33501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!declEntity) 3351fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 33521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 33531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* fall through */ 33541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ENTITY_PUBLIC_ID: 33551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!XmlIsPublicId(enc, s, next, eventPP)) 3356fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_SYNTAX; 3357fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->keepProcessing && declEntity) { 3358fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char *tem = poolStoreString(&dtd->pool, 3359fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enc, 3360fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s + enc->minBytesPerChar, 3361fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next - enc->minBytesPerChar); 3362fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!tem) 3363fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3364fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis normalizePublicId(tem); 3365fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->publicId = tem; 3366fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&dtd->pool); 3367fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (entityDeclHandler) 3368fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 33691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 33701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 33711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_DOCTYPE_CLOSE: 33721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (doctypeName) { 3373fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis startDoctypeDeclHandler(handlerArg, doctypeName, 3374fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doctypeSysid, doctypePubid, 0); 3375fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolClear(&tempPool); 3376fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 33771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 3378fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* doctypeSysid will be non-NULL in the case of a previous 3379fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler 3380fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis was not set, indicating an external subset 3381fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 33821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 3383fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (doctypeSysid || useForeignDTD) { 3384fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->hasParamEntityRefs = XML_TRUE; /* when docTypeSysid == NULL */ 3385fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (paramEntityParsing && externalEntityRefHandler) { 3386fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, 3387fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis externalSubsetName, 3388fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis sizeof(ENTITY)); 3389fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!entity) 3390fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3391fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (useForeignDTD) 3392fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->base = curBase; 3393fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->paramEntityRead = XML_FALSE; 3394fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!externalEntityRefHandler(externalEntityRefHandlerArg, 3395fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 0, 3396fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->base, 3397fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->systemId, 3398fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->publicId)) 3399fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_EXTERNAL_ENTITY_HANDLING; 3400fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->paramEntityRead && 3401fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis !dtd->standalone && 3402fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis notStandaloneHandler && 3403fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis !notStandaloneHandler(handlerArg)) 3404fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NOT_STANDALONE; 3405fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* end of DTD - no need to update dtd->keepProcessing */ 3406fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3407fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis useForeignDTD = XML_FALSE; 3408fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 34091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 3410fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (endDoctypeDeclHandler) { 3411fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis endDoctypeDeclHandler(handlerArg); 3412fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 34131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 34141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 34151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_INSTANCE_START: 3416fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 3417fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* if there is no DOCTYPE declaration then now is the 3418fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis last chance to read the foreign DTD 3419fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 3420fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (useForeignDTD) { 3421fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->hasParamEntityRefs = XML_TRUE; 3422fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (paramEntityParsing && externalEntityRefHandler) { 3423fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, 3424fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis externalSubsetName, 3425fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis sizeof(ENTITY)); 3426fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!entity) 3427fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3428fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->base = curBase; 3429fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->paramEntityRead = XML_FALSE; 3430fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!externalEntityRefHandler(externalEntityRefHandlerArg, 3431fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 0, 3432fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->base, 3433fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->systemId, 3434fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->publicId)) 3435fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_EXTERNAL_ENTITY_HANDLING; 3436fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->paramEntityRead && 3437fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis !dtd->standalone && 3438fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis notStandaloneHandler && 3439fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis !notStandaloneHandler(handlerArg)) 3440fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NOT_STANDALONE; 3441fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* end of DTD - no need to update dtd->keepProcessing */ 3442fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3443fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3444fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */ 34451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis processor = contentProcessor; 34461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return contentProcessor(parser, s, end, nextPtr); 34471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ATTLIST_ELEMENT_NAME: 34481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis declElementType = getElementType(parser, enc, s, next); 34491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!declElementType) 3450fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3451fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto checkAttListDeclHandler; 34521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ATTRIBUTE_NAME: 34531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis declAttributeId = getAttributeId(parser, enc, s, next); 34541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!declAttributeId) 3455fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3456fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeIsCdata = XML_FALSE; 3457fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeType = NULL; 3458fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeIsId = XML_FALSE; 3459fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto checkAttListDeclHandler; 34601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ATTRIBUTE_TYPE_CDATA: 3461fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeIsCdata = XML_TRUE; 3462fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeType = atypeCDATA; 3463fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto checkAttListDeclHandler; 34641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ATTRIBUTE_TYPE_ID: 3465fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeIsId = XML_TRUE; 3466fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeType = atypeID; 3467fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto checkAttListDeclHandler; 34681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ATTRIBUTE_TYPE_IDREF: 3469fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeType = atypeIDREF; 3470fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto checkAttListDeclHandler; 34711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ATTRIBUTE_TYPE_IDREFS: 3472fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeType = atypeIDREFS; 3473fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto checkAttListDeclHandler; 34741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ATTRIBUTE_TYPE_ENTITY: 3475fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeType = atypeENTITY; 3476fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto checkAttListDeclHandler; 34771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES: 3478fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeType = atypeENTITIES; 3479fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto checkAttListDeclHandler; 34801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN: 3481fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeType = atypeNMTOKEN; 3482fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto checkAttListDeclHandler; 34831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS: 3484fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeType = atypeNMTOKENS; 3485fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis checkAttListDeclHandler: 3486fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->keepProcessing && attlistDeclHandler) 3487fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 34881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 34891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ATTRIBUTE_ENUM_VALUE: 34901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ATTRIBUTE_NOTATION_VALUE: 3491fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->keepProcessing && attlistDeclHandler) { 3492fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *prefix; 3493fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (declAttributeType) { 3494fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis prefix = enumValueSep; 3495fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3496fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 3497fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE 3498fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ? notationPrefix 3499fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis : enumValueStart); 3500fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3501fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendString(&tempPool, prefix)) 3502fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3503fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppend(&tempPool, enc, s, next)) 3504fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3505fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeType = tempPool.start; 3506fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 35071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 35081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 35091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: 35101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: 3511fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->keepProcessing) { 3512fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!defineAttribute(declElementType, declAttributeId, 3513fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeIsCdata, declAttributeIsId, 0, 3514fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis parser)) 3515fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3516fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (attlistDeclHandler && declAttributeType) { 3517fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (*declAttributeType == XML_T('(') 3518fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis || (*declAttributeType == XML_T('N') 3519fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis && declAttributeType[1] == XML_T('O'))) { 3520fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* Enumerated or Notation type */ 3521fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendChar(&tempPool, XML_T(')')) 3522fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis || !poolAppendChar(&tempPool, XML_T('\0'))) 3523fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3524fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeType = tempPool.start; 3525fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&tempPool); 3526fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3527fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventEndPP = s; 3528fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis attlistDeclHandler(handlerArg, declElementType->name, 3529fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeId->name, declAttributeType, 3530fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE); 3531fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolClear(&tempPool); 3532fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 3533fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 35341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 35351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 35361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: 35371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_FIXED_ATTRIBUTE_VALUE: 3538fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->keepProcessing) { 3539fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *attVal; 3540fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result 3541fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis = storeAttributeValue(parser, enc, declAttributeIsCdata, 3542fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s + enc->minBytesPerChar, 3543fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next - enc->minBytesPerChar, 3544fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &dtd->pool); 3545fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result) 3546fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 3547fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis attVal = poolStart(&dtd->pool); 3548fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&dtd->pool); 3549fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* ID attributes aren't allowed to have a default */ 3550fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!defineAttribute(declElementType, declAttributeId, 3551fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeIsCdata, XML_FALSE, attVal, parser)) 3552fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3553fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (attlistDeclHandler && declAttributeType) { 3554fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (*declAttributeType == XML_T('(') 3555fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis || (*declAttributeType == XML_T('N') 3556fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis && declAttributeType[1] == XML_T('O'))) { 3557fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* Enumerated or Notation type */ 3558fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendChar(&tempPool, XML_T(')')) 3559fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis || !poolAppendChar(&tempPool, XML_T('\0'))) 3560fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3561fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeType = tempPool.start; 3562fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&tempPool); 3563fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3564fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventEndPP = s; 3565fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis attlistDeclHandler(handlerArg, declElementType->name, 3566fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declAttributeId->name, declAttributeType, 3567fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis attVal, 3568fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis role == XML_ROLE_FIXED_ATTRIBUTE_VALUE); 3569fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolClear(&tempPool); 3570fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 3571fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 35721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 3573fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 35741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ENTITY_VALUE: 3575fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->keepProcessing) { 3576fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result = storeEntityValue(parser, enc, 3577fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s + enc->minBytesPerChar, 3578fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next - enc->minBytesPerChar); 3579fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (declEntity) { 3580fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->textPtr = poolStart(&dtd->entityValuePool); 3581fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->textLen = poolLength(&dtd->entityValuePool); 3582fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&dtd->entityValuePool); 3583fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (entityDeclHandler) { 3584fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventEndPP = s; 3585fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entityDeclHandler(handlerArg, 3586fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->name, 3587fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->is_param, 3588fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->textPtr, 3589fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->textLen, 3590fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis curBase, 0, 0, 0); 3591fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 3592fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3593fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3594fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else 3595fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&dtd->entityValuePool); 3596fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result != XML_ERROR_NONE) 3597fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 35981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 35991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 36001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_DOCTYPE_SYSTEM_ID: 3601fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 3602fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis useForeignDTD = XML_FALSE; 3603fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */ 3604fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->hasParamEntityRefs = XML_TRUE; 36051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (startDoctypeDeclHandler) { 3606fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doctypeSysid = poolStoreString(&tempPool, enc, 3607fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s + enc->minBytesPerChar, 3608fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next - enc->minBytesPerChar); 3609fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (doctypeSysid == NULL) 3610fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3611fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&tempPool); 3612fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 36131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 36141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 3615fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else 3616fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* use externalSubsetName to make doctypeSysid non-NULL 3617fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for the case where no startDoctypeDeclHandler is set */ 3618fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis doctypeSysid = externalSubsetName; 3619fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */ 3620fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!dtd->standalone 3621fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 3622fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis && !paramEntityParsing 36231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 3624fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis && notStandaloneHandler 3625fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis && !notStandaloneHandler(handlerArg)) 3626fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NOT_STANDALONE; 36271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifndef XML_DTD 36281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 36291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else /* XML_DTD */ 36301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!declEntity) { 3631fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity = (ENTITY *)lookup(&dtd->paramEntities, 3632fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis externalSubsetName, 3633fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis sizeof(ENTITY)); 3634fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!declEntity) 3635fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3636fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->publicId = NULL; 36371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 36381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* fall through */ 36391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 36401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ENTITY_SYSTEM_ID: 3641fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->keepProcessing && declEntity) { 3642fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->systemId = poolStoreString(&dtd->pool, enc, 3643fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s + enc->minBytesPerChar, 3644fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next - enc->minBytesPerChar); 3645fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!declEntity->systemId) 3646fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3647fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->base = curBase; 3648fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&dtd->pool); 3649fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (entityDeclHandler) 3650fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 36511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 36521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 36531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ENTITY_COMPLETE: 3654fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->keepProcessing && declEntity && entityDeclHandler) { 3655fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventEndPP = s; 3656fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entityDeclHandler(handlerArg, 3657fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->name, 3658fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->is_param, 3659fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 0,0, 3660fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->base, 3661fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->systemId, 3662fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->publicId, 3663fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 0); 3664fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 36651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 36661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 36671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ENTITY_NOTATION_NAME: 3668fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->keepProcessing && declEntity) { 3669fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->notation = poolStoreString(&dtd->pool, enc, s, next); 3670fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!declEntity->notation) 3671fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3672fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&dtd->pool); 3673fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (unparsedEntityDeclHandler) { 3674fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventEndPP = s; 3675fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis unparsedEntityDeclHandler(handlerArg, 3676fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->name, 3677fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->base, 3678fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->systemId, 3679fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->publicId, 3680fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->notation); 3681fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 3682fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3683fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (entityDeclHandler) { 3684fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventEndPP = s; 3685fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entityDeclHandler(handlerArg, 3686fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->name, 3687fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 0,0,0, 3688fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->base, 3689fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->systemId, 3690fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->publicId, 3691fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->notation); 3692fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 3693fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 36941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 36951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 36961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_GENERAL_ENTITY_NAME: 36971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis { 3698fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (XmlPredefinedEntityName(enc, s, next)) { 3699fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity = NULL; 3700fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 3701fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3702fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->keepProcessing) { 3703fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); 3704fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!name) 3705fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3706fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity = (ENTITY *)lookup(&dtd->generalEntities, name, 3707fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis sizeof(ENTITY)); 3708fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!declEntity) 3709fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3710fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (declEntity->name != name) { 3711fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&dtd->pool); 3712fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity = NULL; 3713fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3714fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 3715fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&dtd->pool); 3716fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->publicId = NULL; 3717fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->is_param = XML_FALSE; 3718fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* if we have a parent parser or are reading an internal parameter 3719fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity, then the entity declaration is not considered "internal" 3720fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 3721fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->is_internal = !(parentParser || openInternalEntities); 3722fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (entityDeclHandler) 3723fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 3724fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3725fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3726fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 3727fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&dtd->pool); 3728fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity = NULL; 3729fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 37301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 37311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 37321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_PARAM_ENTITY_NAME: 37331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 3734fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->keepProcessing) { 3735fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); 3736fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!name) 3737fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3738fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity = (ENTITY *)lookup(&dtd->paramEntities, 3739fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis name, sizeof(ENTITY)); 3740fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!declEntity) 3741fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3742fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (declEntity->name != name) { 3743fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&dtd->pool); 3744fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity = NULL; 3745fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3746fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 3747fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&dtd->pool); 3748fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->publicId = NULL; 3749fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->is_param = XML_TRUE; 3750fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* if we have a parent parser or are reading an internal parameter 3751fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity, then the entity declaration is not considered "internal" 3752fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 3753fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity->is_internal = !(parentParser || openInternalEntities); 3754fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (entityDeclHandler) 3755fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 3756fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3757fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3758fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 3759fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&dtd->pool); 3760fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity = NULL; 37611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 37621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#else /* not XML_DTD */ 3763fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declEntity = NULL; 3764fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */ 37651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 37661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_NOTATION_NAME: 3767fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declNotationPublicId = NULL; 3768fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declNotationName = NULL; 37691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (notationDeclHandler) { 3770fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declNotationName = poolStoreString(&tempPool, enc, s, next); 3771fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!declNotationName) 3772fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3773fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&tempPool); 3774fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 37751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 37761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 37771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_NOTATION_PUBLIC_ID: 37781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!XmlIsPublicId(enc, s, next, eventPP)) 3779fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_SYNTAX; 3780fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (declNotationName) { /* means notationDeclHandler != NULL */ 3781fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char *tem = poolStoreString(&tempPool, 3782fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enc, 3783fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s + enc->minBytesPerChar, 3784fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next - enc->minBytesPerChar); 3785fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!tem) 3786fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3787fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis normalizePublicId(tem); 3788fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declNotationPublicId = tem; 3789fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&tempPool); 3790fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 37911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 37921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 37931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_NOTATION_SYSTEM_ID: 37941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (declNotationName && notationDeclHandler) { 3795fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *systemId 3796fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis = poolStoreString(&tempPool, enc, 3797fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s + enc->minBytesPerChar, 3798fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next - enc->minBytesPerChar); 3799fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!systemId) 3800fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3801fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventEndPP = s; 3802fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis notationDeclHandler(handlerArg, 3803fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declNotationName, 3804fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis curBase, 3805fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis systemId, 3806fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declNotationPublicId); 3807fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 38081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 38091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolClear(&tempPool); 38101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 38111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_NOTATION_NO_SYSTEM_ID: 38121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (declNotationPublicId && notationDeclHandler) { 3813fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventEndPP = s; 3814fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis notationDeclHandler(handlerArg, 3815fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declNotationName, 3816fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis curBase, 3817fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 0, 3818fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declNotationPublicId); 3819fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 38201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 38211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolClear(&tempPool); 38221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 38231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ERROR: 38241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis switch (tok) { 38251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARAM_ENTITY_REF: 3826fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_PARAM_ENTITY_REF; 38271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_XML_DECL: 3828fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_MISPLACED_XML_PI; 38291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis default: 3830fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_SYNTAX; 38311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 38321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 38331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_IGNORE_SECT: 38341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis { 3835fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result; 3836fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (defaultHandler) 3837fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 3838fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 3839fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = doIgnoreSection(parser, enc, &next, end, nextPtr); 3840fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!next) { 3841fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis processor = ignoreSectionProcessor; 3842fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 3843fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 38441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 38451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 38461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 38471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_GROUP_OPEN: 38481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (prologState.level >= groupSize) { 3849fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (groupSize) { 3850fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis char *temp = (char *)REALLOC(groupConnector, groupSize *= 2); 3851fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (temp == NULL) 3852fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3853fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis groupConnector = temp; 3854fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->scaffIndex) { 3855fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int *temp = (int *)REALLOC(dtd->scaffIndex, 3856fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis groupSize * sizeof(int)); 3857fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (temp == NULL) 3858fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3859fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffIndex = temp; 3860fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3861fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3862fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 3863fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis groupConnector = (char *)MALLOC(groupSize = 32); 3864fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!groupConnector) 3865fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3866fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 38671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 38681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis groupConnector[prologState.level] = 0; 3869fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->in_eldecl) { 3870fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int myindex = nextScaffoldPart(parser); 3871fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (myindex < 0) 3872fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3873fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffIndex[dtd->scaffLevel] = myindex; 3874fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffLevel++; 3875fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffold[myindex].type = XML_CTYPE_SEQ; 3876fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (elementDeclHandler) 3877fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 38781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 38791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 38801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_GROUP_SEQUENCE: 38811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (groupConnector[prologState.level] == '|') 3882fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_SYNTAX; 38831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis groupConnector[prologState.level] = ','; 3884fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->in_eldecl && elementDeclHandler) 3885fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 38861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 38871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_GROUP_CHOICE: 38881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (groupConnector[prologState.level] == ',') 3889fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_SYNTAX; 3890fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->in_eldecl 3891fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis && !groupConnector[prologState.level] 3892fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type 3893fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis != XML_CTYPE_MIXED) 3894fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ) { 3895fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type 3896fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis = XML_CTYPE_CHOICE; 3897fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (elementDeclHandler) 3898fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 38991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 39001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis groupConnector[prologState.level] = '|'; 39011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 39021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_PARAM_ENTITY_REF: 39031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 39041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_INNER_PARAM_ENTITY_REF: 3905fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* PE references in internal subset are 3906fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis not allowed within declarations */ 3907fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (prologState.documentEntity && 3908fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis role == XML_ROLE_INNER_PARAM_ENTITY_REF) 3909fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_PARAM_ENTITY_REF; 3910fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->hasParamEntityRefs = XML_TRUE; 3911fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!paramEntityParsing) 3912fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->keepProcessing = dtd->standalone; 3913fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 3914fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *name; 3915fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ENTITY *entity; 3916fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis name = poolStoreString(&dtd->pool, enc, 3917fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s + enc->minBytesPerChar, 3918fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next - enc->minBytesPerChar); 3919fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!name) 3920fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3921fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); 3922fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&dtd->pool); 3923fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* first, determine if a check for an existing declaration is needed; 3924fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if yes, check that the entity exists, and that it is internal, 3925fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis otherwise call the skipped entity handler 3926fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 3927fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (prologState.documentEntity && 3928fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (dtd->standalone 3929fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ? !openInternalEntities 3930fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis : !dtd->hasParamEntityRefs)) { 3931fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!entity) 3932fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_UNDEFINED_ENTITY; 3933fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (!entity->is_internal) 3934fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_ENTITY_DECLARED_IN_PE; 3935fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3936fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (!entity) { 3937fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->keepProcessing = dtd->standalone; 3938fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* cannot report skipped entities in declarations */ 3939fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) { 3940fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis skippedEntityHandler(handlerArg, name, 1); 3941fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 3942fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3943fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 3944fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3945fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (entity->open) 3946fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_RECURSIVE_ENTITY_REF; 3947fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (entity->textPtr) { 3948fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result; 3949fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = processInternalParamEntity(parser, entity); 3950fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result != XML_ERROR_NONE) 3951fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 3952fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 3953fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 3954fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3955fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (externalEntityRefHandler) { 3956fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->paramEntityRead = XML_FALSE; 3957fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_TRUE; 3958fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!externalEntityRefHandler(externalEntityRefHandlerArg, 3959fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 0, 3960fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->base, 3961fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->systemId, 3962fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->publicId)) { 3963fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_FALSE; 3964fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_EXTERNAL_ENTITY_HANDLING; 3965fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3966fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_FALSE; 3967fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 3968fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!dtd->paramEntityRead) { 3969fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->keepProcessing = dtd->standalone; 3970fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 3971fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3972fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 3973fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 3974fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->keepProcessing = dtd->standalone; 3975fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 3976fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 39771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 39781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 3979fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!dtd->standalone && 3980fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis notStandaloneHandler && 3981fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis !notStandaloneHandler(handlerArg)) 3982fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NOT_STANDALONE; 39831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 39841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 3985fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* Element declaration stuff */ 39861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 39871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_ELEMENT_NAME: 39881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (elementDeclHandler) { 3989fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis declElementType = getElementType(parser, enc, s, next); 3990fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!declElementType) 3991fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 3992fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffLevel = 0; 3993fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffCount = 0; 3994fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->in_eldecl = XML_TRUE; 3995fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 39961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 39971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 39981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 39991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_CONTENT_ANY: 40001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_CONTENT_EMPTY: 4001fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->in_eldecl) { 4002fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (elementDeclHandler) { 4003fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content)); 4004fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!content) 4005fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 4006fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis content->quant = XML_CQUANT_NONE; 4007fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis content->name = NULL; 4008fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis content->numchildren = 0; 4009fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis content->children = NULL; 4010fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis content->type = ((role == XML_ROLE_CONTENT_ANY) ? 4011fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_CTYPE_ANY : 4012fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_CTYPE_EMPTY); 4013fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventEndPP = s; 4014fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis elementDeclHandler(handlerArg, declElementType->name, content); 4015fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 4016fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4017fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->in_eldecl = XML_FALSE; 40181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 40191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 4020fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 40211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_CONTENT_PCDATA: 4022fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->in_eldecl) { 4023fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type 4024fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis = XML_CTYPE_MIXED; 4025fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (elementDeclHandler) 4026fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 40271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 40281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 40291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 40301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_CONTENT_ELEMENT: 40311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis quant = XML_CQUANT_NONE; 40321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis goto elementContent; 40331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_CONTENT_ELEMENT_OPT: 40341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis quant = XML_CQUANT_OPT; 40351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis goto elementContent; 40361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_CONTENT_ELEMENT_REP: 40371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis quant = XML_CQUANT_REP; 40381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis goto elementContent; 40391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_CONTENT_ELEMENT_PLUS: 40401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis quant = XML_CQUANT_PLUS; 40411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis elementContent: 4042fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->in_eldecl) { 4043fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ELEMENT_TYPE *el; 4044fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *name; 4045fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int nameLen; 4046fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *nxt = (quant == XML_CQUANT_NONE 4047fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ? next 4048fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis : next - enc->minBytesPerChar); 4049fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int myindex = nextScaffoldPart(parser); 4050fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (myindex < 0) 4051fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 4052fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffold[myindex].type = XML_CTYPE_NAME; 4053fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffold[myindex].quant = quant; 4054fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis el = getElementType(parser, enc, s, nxt); 4055fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!el) 4056fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 4057fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis name = el->name; 4058fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffold[myindex].name = name; 4059fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis nameLen = 0; 4060fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (; name[nameLen++]; ); 4061fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->contentStringLen += nameLen; 4062fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (elementDeclHandler) 4063fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 4064fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 40651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 40661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 40671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_GROUP_CLOSE: 40681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis quant = XML_CQUANT_NONE; 40691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis goto closeGroup; 40701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_GROUP_CLOSE_OPT: 40711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis quant = XML_CQUANT_OPT; 40721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis goto closeGroup; 40731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_GROUP_CLOSE_REP: 40741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis quant = XML_CQUANT_REP; 40751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis goto closeGroup; 40761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_ROLE_GROUP_CLOSE_PLUS: 40771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis quant = XML_CQUANT_PLUS; 40781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis closeGroup: 4079fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->in_eldecl) { 4080fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (elementDeclHandler) 4081fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 4082fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffLevel--; 4083fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant; 4084fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->scaffLevel == 0) { 4085fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!handleDefault) { 4086fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Content *model = build_model(parser); 4087fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!model) 4088fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 4089fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *eventEndPP = s; 4090fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis elementDeclHandler(handlerArg, declElementType->name, model); 4091fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4092fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->in_eldecl = XML_FALSE; 4093fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->contentStringLen = 0; 4094fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 40951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 40961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 40971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* End element declaration stuff */ 40981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4099fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_ROLE_PI: 4100fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!reportProcessingInstruction(parser, enc, s, next)) 4101fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 4102fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 41031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 4104fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_ROLE_COMMENT: 4105fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!reportComment(parser, enc, s, next)) 4106fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 4107fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 4108fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 4109fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_ROLE_NONE: 41101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis switch (tok) { 41111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_BOM: 4112fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 4113fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 41141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 4115fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 4116fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_ROLE_DOCTYPE_NONE: 4117fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (startDoctypeDeclHandler) 4118fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 4119fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 4120fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_ROLE_ENTITY_NONE: 4121fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->keepProcessing && entityDeclHandler) 4122fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 4123fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 4124fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_ROLE_NOTATION_NONE: 4125fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (notationDeclHandler) 4126fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 4127fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 4128fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_ROLE_ATTLIST_NONE: 4129fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->keepProcessing && attlistDeclHandler) 4130fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 4131fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 4132fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis case XML_ROLE_ELEMENT_NONE: 4133fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (elementDeclHandler) 4134fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis handleDefault = XML_FALSE; 4135fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 4136fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } /* end of big switch */ 4137fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 4138fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (handleDefault && defaultHandler) 4139fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, s, next); 4140fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 41411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis s = next; 41421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis tok = XmlPrologTok(enc, s, end, &next); 41431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 41441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* not reached */ 41451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 41461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4147fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 4148fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisepilogProcessor(XML_Parser parser, 4149fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *s, 4150fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 4151fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **nextPtr) 41521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 41531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis processor = epilogProcessor; 41541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPtr = s; 41551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 4156fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *next = NULL; 41571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int tok = XmlPrologTok(encoding, s, end, &next); 41581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPtr = next; 41591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis switch (tok) { 4160fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* report partial linebreak - it might be the last token */ 41611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case -XML_TOK_PROLOG_S: 41621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (defaultHandler) { 4163fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventEndPtr = next; 4164fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, encoding, s, next); 41651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 4166fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (nextPtr) 4167fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = next; 4168fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 41691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_NONE: 41701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nextPtr) 4171fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = s; 41721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 41731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PROLOG_S: 41741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (defaultHandler) 4175fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, encoding, s, next); 41761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 41771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PI: 41781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!reportProcessingInstruction(parser, encoding, s, next)) 4179fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 41801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 41811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_COMMENT: 41821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!reportComment(parser, encoding, s, next)) 4183fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 41841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 41851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_INVALID: 41861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPtr = next; 41871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_INVALID_TOKEN; 41881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL: 41891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nextPtr) { 4190fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = s; 4191fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 41921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 41931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_UNCLOSED_TOKEN; 41941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL_CHAR: 41951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (nextPtr) { 4196fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *nextPtr = s; 4197fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NONE; 41981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 41991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_PARTIAL_CHAR; 42001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis default: 42011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; 42021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 42031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPtr = s = next; 42041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 42051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 42061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 42071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 42081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 42091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 42101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisprocessInternalParamEntity(XML_Parser parser, ENTITY *entity) 42111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 42121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *s, *end, *next; 42131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int tok; 42141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis enum XML_Error result; 42151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis OPEN_INTERNAL_ENTITY openEntity; 4216fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_TRUE; 42171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis openEntity.next = openInternalEntities; 42181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis openInternalEntities = &openEntity; 42191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis openEntity.entity = entity; 4220fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis openEntity.internalEventPtr = NULL; 4221fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis openEntity.internalEventEndPtr = NULL; 42221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis s = (char *)entity->textPtr; 42231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis end = (char *)(entity->textPtr + entity->textLen); 42241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis tok = XmlPrologTok(internalEncoding, s, end, &next); 42251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis result = doProlog(parser, internalEncoding, s, end, tok, next, 0); 4226fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_FALSE; 42271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis openInternalEntities = openEntity.next; 42281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return result; 42291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 42301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 42311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 42321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4233fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error PTRCALL 4234fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwiserrorProcessor(XML_Parser parser, 4235fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *s, 4236fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end, 4237fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char **nextPtr) 42381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 42391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return errorCode; 42401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 42411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 42421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 4243fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisstoreAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, 4244fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *ptr, const char *end, 4245fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis STRING_POOL *pool) 42461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 4247fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, 4248fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis end, pool); 42491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (result) 42501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return result; 42511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) 42521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolChop(pool); 42531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(pool, XML_T('\0'))) 42541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NO_MEMORY; 42551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 42561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 42571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 42581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic enum XML_Error 4259fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisappendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, 4260fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *ptr, const char *end, 4261fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis STRING_POOL *pool) 42621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 4263fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD * const dtd = _dtd; /* save one level of indirection */ 42641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 42651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *next; 42661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int tok = XmlAttributeValueTok(enc, ptr, end, &next); 42671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis switch (tok) { 42681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_NONE: 42691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_NONE; 42701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_INVALID: 42711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (enc == encoding) 4272fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = next; 42731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_INVALID_TOKEN; 42741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL: 42751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (enc == encoding) 4276fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = ptr; 42771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_INVALID_TOKEN; 42781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_CHAR_REF: 42791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis { 4280fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char buf[XML_ENCODE_MAX]; 4281fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int i; 4282fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int n = XmlCharRefNumber(enc, ptr); 4283fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (n < 0) { 4284fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (enc == encoding) 4285fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = ptr; 4286fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_BAD_CHAR_REF; 4287fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4288fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!isCdata 4289fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis && n == 0x20 /* space */ 4290fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) 4291fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 4292fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis n = XmlEncode(n, (ICHAR *)buf); 4293fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!n) { 4294fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (enc == encoding) 4295fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = ptr; 4296fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_BAD_CHAR_REF; 4297fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4298fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (i = 0; i < n; i++) { 4299fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendChar(pool, buf[i])) 4300fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 4301fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 43021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 43031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 43041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_DATA_CHARS: 43051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppend(pool, enc, ptr, next)) 4306fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 43071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 43081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_TRAILING_CR: 43091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis next = ptr + enc->minBytesPerChar; 43101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* fall through */ 43111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_ATTRIBUTE_VALUE_S: 43121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_DATA_NEWLINE: 43131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) 4314fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 43151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(pool, 0x20)) 4316fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 43171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 43181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_ENTITY_REF: 43191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis { 4320fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *name; 4321fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ENTITY *entity; 4322fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis char checkEntityDecl; 4323fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, 4324fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ptr + enc->minBytesPerChar, 4325fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next - enc->minBytesPerChar); 4326fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (ch) { 4327fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendChar(pool, ch)) 4328fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 4329fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 4330fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4331fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis name = poolStoreString(&temp2Pool, enc, 4332fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ptr + enc->minBytesPerChar, 4333fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next - enc->minBytesPerChar); 4334fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!name) 4335fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 4336fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); 4337fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&temp2Pool); 4338fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* first, determine if a check for an existing declaration is needed; 4339fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if yes, check that the entity exists, and that it is internal, 4340fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis otherwise call the default handler (if called from content) 4341fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 4342fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (pool == &dtd->pool) /* are we called from prolog? */ 4343fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis checkEntityDecl = 4344fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 4345fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis prologState.documentEntity && 4346fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */ 4347fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (dtd->standalone 4348fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ? !openInternalEntities 4349fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis : !dtd->hasParamEntityRefs); 4350fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else /* if (pool == &tempPool): we are called from content */ 4351fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone; 4352fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (checkEntityDecl) { 4353fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!entity) 4354fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_UNDEFINED_ENTITY; 4355fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (!entity->is_internal) 4356fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_ENTITY_DECLARED_IN_PE; 4357fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4358fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (!entity) { 4359fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* cannot report skipped entity here - see comments on 4360fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis skippedEntityHandler 4361fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (skippedEntityHandler) 4362fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis skippedEntityHandler(handlerArg, name, 0); 4363fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 4364fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if ((pool == &tempPool) && defaultHandler) 4365fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis reportDefault(parser, enc, ptr, next); 4366fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 4367fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4368fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (entity->open) { 4369fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (enc == encoding) 4370fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = ptr; 4371fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_RECURSIVE_ENTITY_REF; 4372fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4373fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (entity->notation) { 4374fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (enc == encoding) 4375fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = ptr; 4376fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_BINARY_ENTITY_REF; 4377fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4378fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!entity->textPtr) { 4379fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (enc == encoding) 4380fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = ptr; 4381fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; 4382fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4383fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 4384fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result; 4385fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *textEnd = entity->textPtr + entity->textLen; 4386fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_TRUE; 4387fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = appendAttributeValue(parser, internalEncoding, isCdata, 4388fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (char *)entity->textPtr, 4389fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (char *)textEnd, pool); 4390fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_FALSE; 4391fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result) 4392fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 4393fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 43941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 43951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 43961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis default: 43971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (enc == encoding) 4398fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = ptr; 43991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return XML_ERROR_UNEXPECTED_STATE; 44001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 44011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ptr = next; 44021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 44031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* not reached */ 44041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 44051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4406fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic enum XML_Error 4407fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisstoreEntityValue(XML_Parser parser, 4408fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const ENCODING *enc, 4409fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *entityTextPtr, 4410fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *entityTextEnd) 44111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 4412fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD * const dtd = _dtd; /* save one level of indirection */ 4413fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis STRING_POOL *pool = &(dtd->entityValuePool); 4414fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis enum XML_Error result = XML_ERROR_NONE; 4415fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 4416fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int oldInEntityValue = prologState.inEntityValue; 4417fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis prologState.inEntityValue = 1; 4418fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */ 4419fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* never return Null for the value argument in EntityDeclHandler, 4420fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis since this would indicate an external entity; therefore we 4421fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis have to make sure that entityValuePool.start is not null */ 4422fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!pool->blocks) { 4423fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolGrow(pool)) 4424fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_ERROR_NO_MEMORY; 4425fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4426fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 44271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 44281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *next; 44291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next); 44301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis switch (tok) { 44311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARAM_ENTITY_REF: 44321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 4433fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (isParamEntity || enc != encoding) { 4434fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *name; 4435fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ENTITY *entity; 4436fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis name = poolStoreString(&tempPool, enc, 4437fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entityTextPtr + enc->minBytesPerChar, 4438fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next - enc->minBytesPerChar); 4439fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!name) { 4440fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = XML_ERROR_NO_MEMORY; 4441fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 4442fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4443fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); 4444fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&tempPool); 4445fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!entity) { 4446fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ 4447fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* cannot report skipped entity here - see comments on 4448fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis skippedEntityHandler 4449fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (skippedEntityHandler) 4450fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis skippedEntityHandler(handlerArg, name, 0); 4451fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis */ 4452fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->keepProcessing = dtd->standalone; 4453fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 4454fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4455fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (entity->open) { 4456fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (enc == encoding) 4457fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = entityTextPtr; 4458fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = XML_ERROR_RECURSIVE_ENTITY_REF; 4459fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 4460fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4461fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (entity->systemId) { 4462fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (externalEntityRefHandler) { 4463fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->paramEntityRead = XML_FALSE; 4464fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_TRUE; 4465fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!externalEntityRefHandler(externalEntityRefHandlerArg, 4466fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 0, 4467fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->base, 4468fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->systemId, 4469fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->publicId)) { 4470fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_FALSE; 4471fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = XML_ERROR_EXTERNAL_ENTITY_HANDLING; 4472fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 4473fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4474fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_FALSE; 4475fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!dtd->paramEntityRead) 4476fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->keepProcessing = dtd->standalone; 4477fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4478fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else 4479fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->keepProcessing = dtd->standalone; 4480fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4481fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 4482fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_TRUE; 4483fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = storeEntityValue(parser, 4484fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis internalEncoding, 4485fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (char *)entity->textPtr, 4486fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (char *)(entity->textPtr 4487fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis + entity->textLen)); 4488fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis entity->open = XML_FALSE; 4489fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (result) 4490fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 4491fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4492fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 44931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 44941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 4495fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis /* in the internal subset, PE references are not legal 4496fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis within markup declarations, e.g entity values in this case */ 44971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPtr = entityTextPtr; 4498fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = XML_ERROR_PARAM_ENTITY_REF; 4499fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 45001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_NONE: 4501fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = XML_ERROR_NONE; 4502fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 45031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_ENTITY_REF: 45041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_DATA_CHARS: 4505fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppend(pool, enc, entityTextPtr, next)) { 4506fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = XML_ERROR_NO_MEMORY; 4507fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 4508fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 45091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 45101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_TRAILING_CR: 45111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis next = entityTextPtr + enc->minBytesPerChar; 45121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* fall through */ 45131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_DATA_NEWLINE: 4514fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (pool->end == pool->ptr && !poolGrow(pool)) { 4515fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = XML_ERROR_NO_MEMORY; 4516fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 4517fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 45181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *(pool->ptr)++ = 0xA; 45191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 45201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_CHAR_REF: 45211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis { 4522fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char buf[XML_ENCODE_MAX]; 4523fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int i; 4524fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int n = XmlCharRefNumber(enc, entityTextPtr); 4525fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (n < 0) { 4526fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (enc == encoding) 4527fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = entityTextPtr; 4528fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = XML_ERROR_BAD_CHAR_REF; 4529fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 4530fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4531fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis n = XmlEncode(n, (ICHAR *)buf); 4532fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!n) { 4533fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (enc == encoding) 4534fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = entityTextPtr; 4535fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = XML_ERROR_BAD_CHAR_REF; 4536fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 4537fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4538fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (i = 0; i < n; i++) { 4539fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (pool->end == pool->ptr && !poolGrow(pool)) { 4540fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = XML_ERROR_NO_MEMORY; 4541fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 4542fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4543fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *(pool->ptr)++ = buf[i]; 4544fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 45451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 45461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 45471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_PARTIAL: 45481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (enc == encoding) 4549fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = entityTextPtr; 4550fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = XML_ERROR_INVALID_TOKEN; 4551fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 45521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case XML_TOK_INVALID: 45531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (enc == encoding) 4554fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = next; 4555fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = XML_ERROR_INVALID_TOKEN; 4556fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 45571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis default: 45581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (enc == encoding) 4559fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis eventPtr = entityTextPtr; 4560fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis result = XML_ERROR_UNEXPECTED_STATE; 4561fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis goto endEntityValue; 45621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 45631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis entityTextPtr = next; 45641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 4565fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisendEntityValue: 4566fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 4567fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis prologState.inEntityValue = oldInEntityValue; 4568fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */ 4569fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return result; 45701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 45711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4572fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL 45731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisnormalizeLines(XML_Char *s) 45741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 45751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char *p; 45761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;; s++) { 45771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (*s == XML_T('\0')) 45781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return; 45791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (*s == 0xD) 45801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 45811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 45821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis p = s; 45831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis do { 45841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (*s == 0xD) { 45851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *p++ = 0xA; 45861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (*++s == 0xA) 45871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis s++; 45881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 45891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 45901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *p++ = *s++; 45911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } while (*s); 45921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *p = XML_T('\0'); 45931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 45941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 45951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic int 4596fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisreportProcessingInstruction(XML_Parser parser, const ENCODING *enc, 4597fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start, const char *end) 45981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 45991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *target; 46001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char *data; 46011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char *tem; 46021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!processingInstructionHandler) { 46031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (defaultHandler) 46041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis reportDefault(parser, enc, start, end); 46051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 1; 46061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 46071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis start += enc->minBytesPerChar * 2; 46081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis tem = start + XmlNameLength(enc, start); 46091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis target = poolStoreString(&tempPool, enc, start, tem); 46101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!target) 46111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 46121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolFinish(&tempPool); 46131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis data = poolStoreString(&tempPool, enc, 4614fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XmlSkipS(enc, tem), 4615fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis end - enc->minBytesPerChar*2); 46161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!data) 46171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 46181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis normalizeLines(data); 46191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis processingInstructionHandler(handlerArg, target, data); 46201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolClear(&tempPool); 46211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 1; 46221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 46231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 46241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic int 4625fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisreportComment(XML_Parser parser, const ENCODING *enc, 4626fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start, const char *end) 46271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 46281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char *data; 46291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!commentHandler) { 46301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (defaultHandler) 46311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis reportDefault(parser, enc, start, end); 46321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 1; 46331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 46341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis data = poolStoreString(&tempPool, 46351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis enc, 4636fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis start + enc->minBytesPerChar * 4, 4637fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis end - enc->minBytesPerChar * 3); 46381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!data) 46391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 46401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis normalizeLines(data); 46411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis commentHandler(handlerArg, data); 46421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolClear(&tempPool); 46431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 1; 46441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 46451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 46461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic void 4647fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisreportDefault(XML_Parser parser, const ENCODING *enc, 4648fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *s, const char *end) 46491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 46501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (MUST_CONVERT(enc, s)) { 46511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char **eventPP; 46521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const char **eventEndPP; 46531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (enc == encoding) { 46541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPP = &eventPtr; 46551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPP = &eventEndPtr; 46561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 46571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 46581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventPP = &(openInternalEntities->internalEventPtr); 46591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis eventEndPP = &(openInternalEntities->internalEventEndPtr); 46601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 46611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis do { 46621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ICHAR *dataPtr = (ICHAR *)dataBuf; 46631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); 46641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventEndPP = s; 46651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis defaultHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); 46661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *eventPP = s; 46671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } while (s != end); 46681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 46691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 46701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis defaultHandler(handlerArg, (XML_Char *)s, (XML_Char *)end - (XML_Char *)s); 46711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 46721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 46731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 46741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic int 4675fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdefineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, 4676fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool isId, const XML_Char *value, XML_Parser parser) 46771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 46781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis DEFAULT_ATTRIBUTE *att; 46791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (value || isId) { 46801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* The handling of default attributes gets messed up if we have 46811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis a default which duplicates a non-default. */ 46821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int i; 46831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (i = 0; i < type->nDefaultAtts; i++) 46841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (attId == type->defaultAtts[i].id) 4685fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return 1; 46861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (isId && !type->idAtt && !attId->xmlns) 46871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis type->idAtt = attId; 46881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 46891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (type->nDefaultAtts == type->allocDefaultAtts) { 46901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (type->allocDefaultAtts == 0) { 46911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis type->allocDefaultAtts = 8; 4692fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts 4693fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis * sizeof(DEFAULT_ATTRIBUTE)); 4694fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!type->defaultAtts) 4695fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return 0; 46961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 46971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 4698fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DEFAULT_ATTRIBUTE *temp; 4699fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int count = type->allocDefaultAtts * 2; 4700fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis temp = (DEFAULT_ATTRIBUTE *) 4701fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE))); 4702fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (temp == NULL) 4703fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return 0; 4704fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis type->allocDefaultAtts = count; 4705fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis type->defaultAtts = temp; 47061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 47071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 47081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis att = type->defaultAtts + type->nDefaultAtts; 47091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis att->id = attId; 47101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis att->value = value; 47111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis att->isCdata = isCdata; 47121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!isCdata) 4713fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis attId->maybeTokenized = XML_TRUE; 47141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis type->nDefaultAtts += 1; 47151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 1; 47161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 47171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4718fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int 4719fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwissetElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) 47201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 4721fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD * const dtd = _dtd; /* save one level of indirection */ 47221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *name; 47231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (name = elementType->name; *name; name++) { 47241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (*name == XML_T(':')) { 47251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis PREFIX *prefix; 47261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *s; 47271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (s = elementType->name; s != name; s++) { 4728fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendChar(&dtd->pool, *s)) 4729fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return 0; 47301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 4731fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendChar(&dtd->pool, XML_T('\0'))) 4732fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return 0; 4733fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), 4734fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis sizeof(PREFIX)); 47351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!prefix) 4736fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return 0; 4737fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (prefix->name == poolStart(&dtd->pool)) 4738fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&dtd->pool); 47391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 4740fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&dtd->pool); 47411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis elementType->prefix = prefix; 47421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 47431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 47441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 47451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 1; 47461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 47471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 47481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic ATTRIBUTE_ID * 4749fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisgetAttributeId(XML_Parser parser, const ENCODING *enc, 4750fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *start, const char *end) 47511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 4752fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD * const dtd = _dtd; /* save one level of indirection */ 47531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ATTRIBUTE_ID *id; 47541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *name; 4755fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendChar(&dtd->pool, XML_T('\0'))) 4756fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 4757fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis name = poolStoreString(&dtd->pool, enc, start, end); 47581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!name) 4759fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 47601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ++name; 4761fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); 47621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!id) 4763fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 47641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (id->name != name) 4765fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&dtd->pool); 47661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 4767fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&dtd->pool); 47681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!ns) 47691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ; 4770fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (name[0] == XML_T('x') 4771fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis && name[1] == XML_T('m') 4772fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis && name[2] == XML_T('l') 4773fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis && name[3] == XML_T('n') 4774fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis && name[4] == XML_T('s') 4775fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis && (name[5] == XML_T('\0') || name[5] == XML_T(':'))) { 4776fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (name[5] == XML_T('\0')) 4777fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis id->prefix = &dtd->defaultPrefix; 47781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 4779fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis id->prefix = (PREFIX *)lookup(&dtd->prefixes, name + 6, sizeof(PREFIX)); 4780fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis id->xmlns = XML_TRUE; 47811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 47821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 47831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int i; 47841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (i = 0; name[i]; i++) { 4785fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (name[i] == XML_T(':')) { 4786fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int j; 4787fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (j = 0; j < i; j++) { 4788fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendChar(&dtd->pool, name[j])) 4789fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 4790fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4791fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendChar(&dtd->pool, XML_T('\0'))) 4792fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 4793fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis id->prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), 4794fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis sizeof(PREFIX)); 4795fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (id->prefix->name == poolStart(&dtd->pool)) 4796fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&dtd->pool); 4797fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else 4798fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&dtd->pool); 4799fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 4800fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 48011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 48021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 48031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 48041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return id; 48051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 48061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 48071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define CONTEXT_SEP XML_T('\f') 48081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4809fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char * 4810fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisgetContext(XML_Parser parser) 48111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 4812fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD * const dtd = _dtd; /* save one level of indirection */ 48131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis HASH_TABLE_ITER iter; 4814fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Bool needSep = XML_FALSE; 48151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4816fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->defaultPrefix.binding) { 48171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int i; 48181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int len; 48191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(&tempPool, XML_T('='))) 4820fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 4821fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis len = dtd->defaultPrefix.binding->uriLen; 48221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (namespaceSeparator != XML_T('\0')) 48231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis len--; 48241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (i = 0; i < len; i++) 4825fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i])) 4826fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 4827fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis needSep = XML_TRUE; 48281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 48291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4830fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis hashTableIterInit(&iter, &(dtd->prefixes)); 48311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 48321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int i; 48331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int len; 48341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *s; 48351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter); 48361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!prefix) 48371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 48381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!prefix->binding) 48391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis continue; 48401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) 4841fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 48421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (s = prefix->name; *s; s++) 48431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(&tempPool, *s)) 4844fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 48451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(&tempPool, XML_T('='))) 4846fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 48471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis len = prefix->binding->uriLen; 48481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (namespaceSeparator != XML_T('\0')) 48491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis len--; 48501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (i = 0; i < len; i++) 48511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(&tempPool, prefix->binding->uri[i])) 4852fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 4853fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis needSep = XML_TRUE; 48541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 48551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 48561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4857fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis hashTableIterInit(&iter, &(dtd->generalEntities)); 48581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 48591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *s; 48601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ENTITY *e = (ENTITY *)hashTableIterNext(&iter); 48611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!e) 48621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 48631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!e->open) 48641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis continue; 48651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) 4866fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 48671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (s = e->name; *s; s++) 48681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(&tempPool, *s)) 48691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 4870fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis needSep = XML_TRUE; 48711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 48721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 48731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(&tempPool, XML_T('\0'))) 4874fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 48751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return tempPool.start; 48761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 48771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4878fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Bool 4879fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwissetContext(XML_Parser parser, const XML_Char *context) 48801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 4881fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD * const dtd = _dtd; /* save one level of indirection */ 48821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *s = context; 48831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 48841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis while (*context != XML_T('\0')) { 48851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (*s == CONTEXT_SEP || *s == XML_T('\0')) { 48861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ENTITY *e; 48871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(&tempPool, XML_T('\0'))) 4888fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_FALSE; 4889fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis e = (ENTITY *)lookup(&dtd->generalEntities, poolStart(&tempPool), 0); 48901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (e) 4891fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis e->open = XML_TRUE; 48921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (*s != XML_T('\0')) 4893fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis s++; 48941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis context = s; 48951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolDiscard(&tempPool); 48961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 4897fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else if (*s == XML_T('=')) { 48981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis PREFIX *prefix; 48991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (poolLength(&tempPool) == 0) 4900fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis prefix = &dtd->defaultPrefix; 49011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 4902fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!poolAppendChar(&tempPool, XML_T('\0'))) 4903fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_FALSE; 4904fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&tempPool), 4905fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis sizeof(PREFIX)); 4906fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!prefix) 4907fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_FALSE; 49081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (prefix->name == poolStart(&tempPool)) { 4909fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis prefix->name = poolCopyString(&dtd->pool, prefix->name); 4910fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!prefix->name) 4911fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_FALSE; 4912fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 4913fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&tempPool); 49141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 4915fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (context = s + 1; 4916fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *context != CONTEXT_SEP && *context != XML_T('\0'); 4917fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis context++) 49181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(&tempPool, *context)) 4919fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_FALSE; 49201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(&tempPool, XML_T('\0'))) 4921fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_FALSE; 4922fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (addBinding(parser, prefix, 0, poolStart(&tempPool), 4923fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &inheritedBindings) != XML_ERROR_NONE) 4924fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_FALSE; 49251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolDiscard(&tempPool); 49261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (*context != XML_T('\0')) 4927fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ++context; 49281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis s = context; 49291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 49301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 49311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(&tempPool, *s)) 4932fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_FALSE; 49331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis s++; 49341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 49351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 4936fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_TRUE; 49371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 49381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4939fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL 4940fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisnormalizePublicId(XML_Char *publicId) 49411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 49421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char *p = publicId; 49431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Char *s; 49441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (s = publicId; *s; s++) { 49451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis switch (*s) { 49461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case 0x20: 49471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case 0xD: 49481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis case 0xA: 49491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (p != publicId && p[-1] != 0x20) 4950fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis *p++ = 0x20; 49511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 49521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis default: 49531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *p++ = *s; 49541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 49551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 49561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (p != publicId && p[-1] == 0x20) 49571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis --p; 49581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *p = XML_T('\0'); 49591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 49601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4961fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic DTD * 4962fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdtdCreate(const XML_Memory_Handling_Suite *ms) 49631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 4964fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD)); 4965fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (p == NULL) 4966fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return p; 49671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolInit(&(p->pool), ms); 4968fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 4969fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolInit(&(p->entityValuePool), ms); 4970fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */ 49711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableInit(&(p->generalEntities), ms); 49721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableInit(&(p->elementTypes), ms); 49731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableInit(&(p->attributeIds), ms); 49741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableInit(&(p->prefixes), ms); 49751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 4976fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->paramEntityRead = XML_FALSE; 49771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableInit(&(p->paramEntities), ms); 49781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 4979fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->defaultPrefix.name = NULL; 4980fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->defaultPrefix.binding = NULL; 49811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4982fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->in_eldecl = XML_FALSE; 4983fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->scaffIndex = NULL; 4984fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->scaffold = NULL; 49851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis p->scaffLevel = 0; 49861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis p->scaffSize = 0; 49871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis p->scaffCount = 0; 4988fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->contentStringLen = 0; 49891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4990fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->keepProcessing = XML_TRUE; 4991fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->hasParamEntityRefs = XML_FALSE; 4992fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->standalone = XML_FALSE; 4993fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return p; 49941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 49951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 4996fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void 4997fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) 4998fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 4999fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis HASH_TABLE_ITER iter; 5000fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis hashTableIterInit(&iter, &(p->elementTypes)); 5001fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (;;) { 5002fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); 5003fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!e) 5004fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 5005fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (e->allocDefaultAtts != 0) 5006fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ms->free_fcn(e->defaultAtts); 5007fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 5008fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis hashTableClear(&(p->generalEntities)); 50091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 5010fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->paramEntityRead = XML_FALSE; 5011fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis hashTableClear(&(p->paramEntities)); 5012fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */ 5013fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis hashTableClear(&(p->elementTypes)); 5014fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis hashTableClear(&(p->attributeIds)); 5015fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis hashTableClear(&(p->prefixes)); 5016fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolClear(&(p->pool)); 5017fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 5018fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolClear(&(p->entityValuePool)); 5019fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */ 5020fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->defaultPrefix.name = NULL; 5021fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->defaultPrefix.binding = NULL; 50221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5023fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->in_eldecl = XML_FALSE; 5024fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (p->scaffIndex) { 5025fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ms->free_fcn(p->scaffIndex); 5026fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->scaffIndex = NULL; 5027fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 5028fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (p->scaffold) { 5029fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ms->free_fcn(p->scaffold); 5030fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->scaffold = NULL; 5031fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 5032fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->scaffLevel = 0; 5033fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->scaffSize = 0; 5034fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->scaffCount = 0; 5035fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->contentStringLen = 0; 50361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5037fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->keepProcessing = XML_TRUE; 5038fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->hasParamEntityRefs = XML_FALSE; 5039fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->standalone = XML_FALSE; 5040fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 50411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5042fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void 5043fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) 50441dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 50451dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis HASH_TABLE_ITER iter; 50461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableIterInit(&iter, &(p->elementTypes)); 50471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 50481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); 50491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!e) 50501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 50511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (e->allocDefaultAtts != 0) 5052fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ms->free_fcn(e->defaultAtts); 50531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 50541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableDestroy(&(p->generalEntities)); 50551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 50561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableDestroy(&(p->paramEntities)); 50571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 50581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableDestroy(&(p->elementTypes)); 50591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableDestroy(&(p->attributeIds)); 50601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableDestroy(&(p->prefixes)); 50611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolDestroy(&(p->pool)); 5062fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#ifdef XML_DTD 5063fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDestroy(&(p->entityValuePool)); 5064fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis#endif /* XML_DTD */ 5065fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (isDocEntity) { 5066fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (p->scaffIndex) 5067fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ms->free_fcn(p->scaffIndex); 5068fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (p->scaffold) 5069fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ms->free_fcn(p->scaffold); 5070fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 5071fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ms->free_fcn(p); 50721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 50731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5074fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise. 5075fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis The new DTD has already been initialized. 5076fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis*/ 5077fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int 5078fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwisdtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) 50791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 50801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis HASH_TABLE_ITER iter; 50811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 50821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* Copy the prefix table. */ 50831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 50841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableIterInit(&iter, &(oldDtd->prefixes)); 50851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 50861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *name; 50871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); 50881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!oldP) 50891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 50901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis name = poolCopyString(&(newDtd->pool), oldP->name); 50911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!name) 50921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 50931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!lookup(&(newDtd->prefixes), name, sizeof(PREFIX))) 50941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 50951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 50961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 50971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableIterInit(&iter, &(oldDtd->attributeIds)); 50981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 50991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* Copy the attribute id table. */ 51001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 51011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 51021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ATTRIBUTE_ID *newA; 51031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *name; 51041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); 51051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 51061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!oldA) 51071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 51081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* Remember to allocate the scratch byte before the name. */ 51091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) 51101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 51111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis name = poolCopyString(&(newDtd->pool), oldA->name); 51121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!name) 51131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 51141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ++name; 5115fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name, 5116fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis sizeof(ATTRIBUTE_ID)); 51171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!newA) 51181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 51191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newA->maybeTokenized = oldA->maybeTokenized; 51201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (oldA->prefix) { 51211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newA->xmlns = oldA->xmlns; 51221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (oldA->prefix == &oldDtd->defaultPrefix) 5123fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newA->prefix = &newDtd->defaultPrefix; 51241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 5125fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes), 5126fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis oldA->prefix->name, 0); 51271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 51281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 51291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 51301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* Copy the element type table. */ 51311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 51321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableIterInit(&iter, &(oldDtd->elementTypes)); 51331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 51341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 51351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int i; 51361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ELEMENT_TYPE *newE; 51371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *name; 51381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); 51391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!oldE) 51401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 51411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis name = poolCopyString(&(newDtd->pool), oldE->name); 51421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!name) 51431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 5144fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name, 5145fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis sizeof(ELEMENT_TYPE)); 51461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!newE) 51471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 51481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (oldE->nDefaultAtts) { 5149fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newE->defaultAtts = (DEFAULT_ATTRIBUTE *) 5150fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); 5151fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!newE->defaultAtts) { 5152fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ms->free_fcn(newE); 5153fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return 0; 5154fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 51551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 51561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (oldE->idAtt) 5157fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newE->idAtt = (ATTRIBUTE_ID *) 5158fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis lookup(&(newDtd->attributeIds), oldE->idAtt->name, 0); 51591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; 51601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (oldE->prefix) 5161fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes), 5162fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis oldE->prefix->name, 0); 51631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (i = 0; i < newE->nDefaultAtts; i++) { 5164fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newE->defaultAtts[i].id = (ATTRIBUTE_ID *) 5165fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); 51661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; 51671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (oldE->defaultAtts[i].value) { 5168fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newE->defaultAtts[i].value 5169fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); 5170fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!newE->defaultAtts[i].value) 5171fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return 0; 51721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 51731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 5174fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newE->defaultAtts[i].value = NULL; 51751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 51761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 51771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 51781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* Copy the entity tables. */ 51791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!copyEntityTable(&(newDtd->generalEntities), 5180fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &(newDtd->pool), 5181fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &(oldDtd->generalEntities))) 51821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 51831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 51841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#ifdef XML_DTD 51851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!copyEntityTable(&(newDtd->paramEntities), 5186fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &(newDtd->pool), 5187fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis &(oldDtd->paramEntities))) 51881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 5189fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newDtd->paramEntityRead = oldDtd->paramEntityRead; 51901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#endif /* XML_DTD */ 51911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5192fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newDtd->keepProcessing = oldDtd->keepProcessing; 5193fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs; 51941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newDtd->standalone = oldDtd->standalone; 51951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 51961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* Don't want deep copying for scaffolding */ 51971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newDtd->in_eldecl = oldDtd->in_eldecl; 51981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newDtd->scaffold = oldDtd->scaffold; 51991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newDtd->contentStringLen = oldDtd->contentStringLen; 52001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newDtd->scaffSize = oldDtd->scaffSize; 52011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newDtd->scaffLevel = oldDtd->scaffLevel; 52021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newDtd->scaffIndex = oldDtd->scaffIndex; 52031dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 52041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 1; 52051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} /* End dtdCopy */ 52061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5207fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int 5208fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwiscopyEntityTable(HASH_TABLE *newTable, 5209fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis STRING_POOL *newPool, 5210fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const HASH_TABLE *oldTable) 52111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 52121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis HASH_TABLE_ITER iter; 5213fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *cachedOldBase = NULL; 5214fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *cachedNewBase = NULL; 52151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 52161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis hashTableIterInit(&iter, oldTable); 52171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 52181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 52191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ENTITY *newE; 52201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *name; 52211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); 52221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!oldE) 52231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 52241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis name = poolCopyString(newPool, oldE->name); 52251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!name) 52261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 52271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newE = (ENTITY *)lookup(newTable, name, sizeof(ENTITY)); 52281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!newE) 52291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 52301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (oldE->systemId) { 52311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *tem = poolCopyString(newPool, oldE->systemId); 52321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!tem) 5233fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return 0; 52341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newE->systemId = tem; 52351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (oldE->base) { 5236fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (oldE->base == cachedOldBase) 5237fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newE->base = cachedNewBase; 5238fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis else { 5239fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis cachedOldBase = oldE->base; 5240fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tem = poolCopyString(newPool, cachedOldBase); 5241fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!tem) 5242fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return 0; 5243fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis cachedNewBase = newE->base = tem; 5244fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 5245fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 5246fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (oldE->publicId) { 5247fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tem = poolCopyString(newPool, oldE->publicId); 5248fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!tem) 5249fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return 0; 5250fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newE->publicId = tem; 52511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 52521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 52531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 5254fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr, 5255fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis oldE->textLen); 52561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!tem) 5257fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return 0; 52581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newE->textPtr = tem; 52591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newE->textLen = oldE->textLen; 52601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 52611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (oldE->notation) { 52621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis const XML_Char *tem = poolCopyString(newPool, oldE->notation); 52631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!tem) 5264fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return 0; 52651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis newE->notation = tem; 52661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 5267fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newE->is_param = oldE->is_param; 5268fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newE->is_internal = oldE->is_internal; 52691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 52701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 1; 52711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 52721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 52731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis#define INIT_SIZE 64 52741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5275fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int FASTCALL 5276fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwiskeyeq(KEY s1, KEY s2) 52771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 52781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (; *s1 == *s2; s1++, s2++) 52791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (*s1 == 0) 52801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 1; 52811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return 0; 52821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 52831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5284fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic unsigned long FASTCALL 5285fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwishash(KEY s) 52861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 52871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis unsigned long h = 0; 52881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis while (*s) 52891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis h = (h << 5) + h + (unsigned char)*s++; 52901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return h; 52911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 52921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5293fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic NAMED * 5294fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwislookup(HASH_TABLE *table, KEY name, size_t createSize) 52951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 52961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis size_t i; 52971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (table->size == 0) { 52981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis size_t tsize; 52991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 53001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!createSize) 5301fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 53021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis tsize = INIT_SIZE * sizeof(NAMED *); 5303fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis table->v = (NAMED **)table->mem->malloc_fcn(tsize); 53041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!table->v) 5305fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 53061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis memset(table->v, 0, tsize); 53071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis table->size = INIT_SIZE; 53081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis table->usedLim = INIT_SIZE / 2; 53091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis i = hash(name) & (table->size - 1); 53101dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 53111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 53121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis unsigned long h = hash(name); 53131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (i = h & (table->size - 1); 53141dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis table->v[i]; 53151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis i == 0 ? i = table->size - 1 : --i) { 53161dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (keyeq(name, table->v[i]->name)) 5317fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return table->v[i]; 53181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 53191dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!createSize) 5320fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 53211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (table->used == table->usedLim) { 53221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis /* check for overflow */ 53231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis size_t newSize = table->size * 2; 53241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis size_t tsize = newSize * sizeof(NAMED *); 5325fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize); 53261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!newV) 5327fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 53281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis memset(newV, 0, tsize); 53291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (i = 0; i < table->size; i++) 5330fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (table->v[i]) { 5331fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis size_t j; 5332fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (j = hash(table->v[i]->name) & (newSize - 1); 5333fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newV[j]; 5334fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis j == 0 ? j = newSize - 1 : --j) 5335fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ; 5336fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis newV[j] = table->v[i]; 5337fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 53381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis table->mem->free_fcn(table->v); 53391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis table->v = newV; 53401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis table->size = newSize; 53411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis table->usedLim = newSize/2; 53421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (i = h & (table->size - 1); 5343fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis table->v[i]; 5344fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis i == 0 ? i = table->size - 1 : --i) 5345fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ; 53461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 53471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 5348fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize); 53491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!table->v[i]) 5350fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 53511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis memset(table->v[i], 0, createSize); 53521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis table->v[i]->name = name; 53531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis (table->used)++; 53541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return table->v[i]; 53551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 53561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5357fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL 5358fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwishashTableClear(HASH_TABLE *table) 5359fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis{ 5360fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis size_t i; 5361fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (i = 0; i < table->size; i++) { 5362fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis NAMED *p = table->v[i]; 5363fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (p) { 5364fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis table->mem->free_fcn(p); 5365fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis table->v[i] = NULL; 5366fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 5367fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 5368fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis table->usedLim = table->size / 2; 5369fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis table->used = 0; 5370fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 5371fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 5372fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL 5373fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwishashTableDestroy(HASH_TABLE *table) 53741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 53751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis size_t i; 53761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (i = 0; i < table->size; i++) { 53771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis NAMED *p = table->v[i]; 53781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (p) 53791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis table->mem->free_fcn(p); 53801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 53811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (table->v) 53821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis table->mem->free_fcn(table->v); 53831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 53841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5385fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL 5386fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwishashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) 53871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 53881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis p->size = 0; 53891dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis p->usedLim = 0; 53901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis p->used = 0; 5391fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis p->v = NULL; 53921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis p->mem = ms; 53931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 53941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5395fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL 5396fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwishashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) 53971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 53981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis iter->p = table->v; 53991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis iter->end = iter->p + table->size; 54001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 54011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5402fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic NAMED * FASTCALL 5403fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwishashTableIterNext(HASH_TABLE_ITER *iter) 54041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 54051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis while (iter->p != iter->end) { 54061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis NAMED *tem = *(iter->p)++; 54071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (tem) 54081dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return tem; 54091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 5410fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 54111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 54121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5413fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL 5414fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) 54151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 5416fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis pool->blocks = NULL; 5417fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis pool->freeBlocks = NULL; 5418fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis pool->start = NULL; 5419fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis pool->ptr = NULL; 5420fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis pool->end = NULL; 54211dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->mem = ms; 54221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 54231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5424fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL 5425fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolClear(STRING_POOL *pool) 54261dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 54271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!pool->freeBlocks) 54281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->freeBlocks = pool->blocks; 54291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 54301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BLOCK *p = pool->blocks; 54311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis while (p) { 54321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BLOCK *tem = p->next; 54331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis p->next = pool->freeBlocks; 54341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->freeBlocks = p; 54351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis p = tem; 54361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 54371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 5438fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis pool->blocks = NULL; 5439fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis pool->start = NULL; 5440fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis pool->ptr = NULL; 5441fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis pool->end = NULL; 54421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 54431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5444fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic void FASTCALL 5445fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolDestroy(STRING_POOL *pool) 54461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 54471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BLOCK *p = pool->blocks; 54481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis while (p) { 54491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BLOCK *tem = p->next; 54501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->mem->free_fcn(p); 54511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis p = tem; 54521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 54531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis p = pool->freeBlocks; 54541dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis while (p) { 54551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BLOCK *tem = p->next; 54561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->mem->free_fcn(p); 54571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis p = tem; 54581dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 54591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 54601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5461fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Char * 5462fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolAppend(STRING_POOL *pool, const ENCODING *enc, 5463fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *ptr, const char *end) 54641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 54651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!pool->ptr && !poolGrow(pool)) 5466fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 54671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 54681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); 54691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (ptr == end) 54701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis break; 54711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolGrow(pool)) 5472fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 54731dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 54741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return pool->start; 54751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 54761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5477fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char * FASTCALL 5478fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolCopyString(STRING_POOL *pool, const XML_Char *s) 54791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 54801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis do { 54811dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(pool, *s)) 5482fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 54831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } while (*s++); 54841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis s = pool->start; 54851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolFinish(pool); 54861dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return s; 54871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 54881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5489fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char * 5490fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) 54911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 54921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!pool->ptr && !poolGrow(pool)) 5493fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 54941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (; n > 0; --n, s++) { 54951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(pool, *s)) 5496fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 54971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 54981dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis s = pool->start; 54991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis poolFinish(pool); 55001dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return s; 55011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 55021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5503fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic const XML_Char * FASTCALL 5504fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolAppendString(STRING_POOL *pool, const XML_Char *s) 55051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 55061dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis while (*s) { 55071dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppendChar(pool, *s)) 5508fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 55091dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis s++; 5510fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis } 55111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return pool->start; 5512fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 55131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5514fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Char * 5515fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolStoreString(STRING_POOL *pool, const ENCODING *enc, 5516fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *ptr, const char *end) 55171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 55181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!poolAppend(pool, enc, ptr, end)) 5519fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 55201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (pool->ptr == pool->end && !poolGrow(pool)) 5521fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 55221dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *(pool->ptr)++ = 0; 55231dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return pool->start; 55241dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 55251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5526fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic XML_Bool FASTCALL 5527fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. LöwispoolGrow(STRING_POOL *pool) 55281dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 55291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (pool->freeBlocks) { 55301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (pool->start == 0) { 55311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->blocks = pool->freeBlocks; 55321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->freeBlocks = pool->freeBlocks->next; 5533fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis pool->blocks->next = NULL; 55341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->start = pool->blocks->s; 55351dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->end = pool->start + pool->blocks->size; 55361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->ptr = pool->start; 5537fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_TRUE; 55381dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 55391dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (pool->end - pool->start < pool->freeBlocks->size) { 55401dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BLOCK *tem = pool->freeBlocks->next; 55411dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->freeBlocks->next = pool->blocks; 55421dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->blocks = pool->freeBlocks; 55431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->freeBlocks = tem; 5544fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis memcpy(pool->blocks->s, pool->start, 5545fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (pool->end - pool->start) * sizeof(XML_Char)); 55461dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->ptr = pool->blocks->s + (pool->ptr - pool->start); 55471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->start = pool->blocks->s; 55481dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->end = pool->start + pool->blocks->size; 5549fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_TRUE; 55501dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 55511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 55521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (pool->blocks && pool->start == pool->blocks->s) { 55531dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int blockSize = (pool->end - pool->start)*2; 5554fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis pool->blocks = (BLOCK *) 5555fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis pool->mem->realloc_fcn(pool->blocks, 5556fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (offsetof(BLOCK, s) 5557fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis + blockSize * sizeof(XML_Char))); 5558fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (pool->blocks == NULL) 5559fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_FALSE; 55601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->blocks->size = blockSize; 55611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->ptr = pool->blocks->s + (pool->ptr - pool->start); 55621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->start = pool->blocks->s; 55631dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->end = pool->start + blockSize; 55641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 55651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 55661dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis BLOCK *tem; 55671dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int blockSize = pool->end - pool->start; 55681dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (blockSize < INIT_BLOCK_SIZE) 55691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis blockSize = INIT_BLOCK_SIZE; 55701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else 55711dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis blockSize *= 2; 5572fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s) 5573fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis + blockSize * sizeof(XML_Char)); 55741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!tem) 5575fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_FALSE; 55761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis tem->size = blockSize; 55771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis tem->next = pool->blocks; 55781dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->blocks = tem; 55791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (pool->ptr != pool->start) 5580fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis memcpy(tem->s, pool->start, 5581fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis (pool->ptr - pool->start) * sizeof(XML_Char)); 55821dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->ptr = tem->s + (pool->ptr - pool->start); 55831dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->start = tem->s; 55841dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis pool->end = tem->s + blockSize; 55851dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 5586fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return XML_TRUE; 55871dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis} 55881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5589fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisstatic int FASTCALL 55901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisnextScaffoldPart(XML_Parser parser) 55911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 5592fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD * const dtd = _dtd; /* save one level of indirection */ 55931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis CONTENT_SCAFFOLD * me; 55941dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int next; 55951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5596fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!dtd->scaffIndex) { 5597fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int)); 5598fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!dtd->scaffIndex) 55991dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return -1; 5600fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffIndex[0] = 0; 56011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 56021dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5603fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->scaffCount >= dtd->scaffSize) { 5604fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis CONTENT_SCAFFOLD *temp; 5605fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->scaffold) { 5606fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis temp = (CONTENT_SCAFFOLD *) 5607fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD)); 5608fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (temp == NULL) 5609fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return -1; 5610fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffSize *= 2; 56111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 56121dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 5613fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS 5614fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis * sizeof(CONTENT_SCAFFOLD)); 5615fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (temp == NULL) 5616fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return -1; 5617fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS; 56181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 5619fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffold = temp; 56201dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 5621fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis next = dtd->scaffCount++; 5622fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis me = &dtd->scaffold[next]; 5623fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (dtd->scaffLevel) { 5624fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]]; 56251dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (parent->lastchild) { 5626fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dtd->scaffold[parent->lastchild].nextsib = next; 56271dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 5628fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!parent->childcnt) 56291dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis parent->firstchild = next; 56301dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis parent->lastchild = next; 56311dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis parent->childcnt++; 56321dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 56331dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0; 56341dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return next; 5635fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 56361dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 56371dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic void 5638fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwisbuild_node(XML_Parser parser, 5639fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int src_node, 5640fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Content *dest, 5641fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Content **contpos, 5642fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char **strpos) 56431dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 5644fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD * const dtd = _dtd; /* save one level of indirection */ 5645fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dest->type = dtd->scaffold[src_node].type; 5646fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dest->quant = dtd->scaffold[src_node].quant; 56471dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (dest->type == XML_CTYPE_NAME) { 5648fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *src; 56491dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis dest->name = *strpos; 5650fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis src = dtd->scaffold[src_node].name; 56511dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis for (;;) { 56521dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *(*strpos)++ = *src; 5653fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!*src) 5654fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis break; 56551dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis src++; 56561dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 56571dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis dest->numchildren = 0; 5658fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dest->children = NULL; 56591dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 56601dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 56611dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis unsigned int i; 56621dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis int cn; 5663fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dest->numchildren = dtd->scaffold[src_node].childcnt; 56641dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis dest->children = *contpos; 56651dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis *contpos += dest->numchildren; 5666fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis for (i = 0, cn = dtd->scaffold[src_node].firstchild; 5667fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis i < dest->numchildren; 5668fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis i++, cn = dtd->scaffold[cn].nextsib) { 56691dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis build_node(parser, cn, &(dest->children[i]), contpos, strpos); 56701dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 5671fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis dest->name = NULL; 56721dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 5673fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 56741dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 56751dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic XML_Content * 56761dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisbuild_model (XML_Parser parser) 56771dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 5678fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD * const dtd = _dtd; /* save one level of indirection */ 56791dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Content *ret; 56801dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis XML_Content *cpos; 5681fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis XML_Char * str; 5682fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis int allocsize = (dtd->scaffCount * sizeof(XML_Content) 5683fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis + (dtd->contentStringLen * sizeof(XML_Char))); 5684fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis 5685fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ret = (XML_Content *)MALLOC(allocsize); 5686fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!ret) 5687fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 56881dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5689fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis str = (XML_Char *) (&ret[dtd->scaffCount]); 56901dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis cpos = &ret[1]; 56911dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 56921dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis build_node(parser, 0, ret, &cpos, &str); 56931dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return ret; 5694fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 56951dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 56961dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwisstatic ELEMENT_TYPE * 56971dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. LöwisgetElementType(XML_Parser parser, 5698fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const ENCODING *enc, 5699fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *ptr, 5700fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const char *end) 57011dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis{ 5702fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis DTD * const dtd = _dtd; /* save one level of indirection */ 5703fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end); 57041dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis ELEMENT_TYPE *ret; 57051dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis 5706fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!name) 5707fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 5708fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis ret = (ELEMENT_TYPE *) lookup(&dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); 5709fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis if (!ret) 5710fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 57111dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (ret->name != name) 5712fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolDiscard(&dtd->pool); 57131dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis else { 5714fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis poolFinish(&dtd->pool); 57151dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis if (!setElementTypePrefix(parser, ret)) 5716fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis return NULL; 57171dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis } 57181dbb1caf86abe5f9920b1f4719daba1c86ce6770Martin v. Löwis return ret; 5719fc03a94aaccc9ae606ee3438ca21d65a335d43e9Martin v. Löwis} 5720