Main Page | Class List | Directories | File List | Class Members | File Members

xmlparse.c

Go to the documentation of this file.
00001 /* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
00002    See the file COPYING for copying permission.
00003 */
00004 
00005 #include <stddef.h>
00006 #include <string.h>                     /* memset(), memcpy() */
00007 #include <assert.h>
00008 
00009 #define XML_BUILDING_EXPAT 1
00010 
00011 #ifdef COMPILED_FROM_DSP
00012 #include "winconfig.h"
00013 #elif defined(MACOS_CLASSIC)
00014 #include "macconfig.h"
00015 #elif defined(HAVE_EXPAT_CONFIG_H)
00016 #include <expat_config.h>
00017 #endif /* ndef COMPILED_FROM_DSP */
00018 
00019 #include "expat.h"
00020 
00021 #ifdef XML_UNICODE
00022 #define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX
00023 #define XmlConvert XmlUtf16Convert
00024 #define XmlGetInternalEncoding XmlGetUtf16InternalEncoding
00025 #define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS
00026 #define XmlEncode XmlUtf16Encode
00027 #define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1))
00028 typedef unsigned short ICHAR;
00029 #else
00030 #define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX
00031 #define XmlConvert XmlUtf8Convert
00032 #define XmlGetInternalEncoding XmlGetUtf8InternalEncoding
00033 #define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS
00034 #define XmlEncode XmlUtf8Encode
00035 #define MUST_CONVERT(enc, s) (!(enc)->isUtf8)
00036 typedef char ICHAR;
00037 #endif
00038 
00039 
00040 #ifndef XML_NS
00041 
00042 #define XmlInitEncodingNS XmlInitEncoding
00043 #define XmlInitUnknownEncodingNS XmlInitUnknownEncoding
00044 #undef XmlGetInternalEncodingNS
00045 #define XmlGetInternalEncodingNS XmlGetInternalEncoding
00046 #define XmlParseXmlDeclNS XmlParseXmlDecl
00047 
00048 #endif
00049 
00050 #ifdef XML_UNICODE
00051 
00052 #ifdef XML_UNICODE_WCHAR_T
00053 #define XML_T(x) (const wchar_t)x
00054 #define XML_L(x) L ## x
00055 #else
00056 #define XML_T(x) (const unsigned short)x
00057 #define XML_L(x) x
00058 #endif
00059 
00060 #else
00061 
00062 #define XML_T(x) x
00063 #define XML_L(x) x
00064 
00065 #endif
00066 
00067 /* Round up n to be a multiple of sz, where sz is a power of 2. */
00068 #define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1))
00069 
00070 /* Handle the case where memmove() doesn't exist. */
00071 #ifndef HAVE_MEMMOVE
00072 #ifdef HAVE_BCOPY
00073 #define memmove(d,s,l) bcopy((s),(d),(l))
00074 #else
00075 #error memmove does not exist on this platform, nor is a substitute available
00076 #endif /* HAVE_BCOPY */
00077 #endif /* HAVE_MEMMOVE */
00078 
00079 #include "internal.h"
00080 #include "xmltok.h"
00081 #include "xmlrole.h"
00082 
00083 typedef const XML_Char *KEY;
00084 
00085 typedef struct {
00086   KEY name;
00087 } NAMED;
00088 
00089 typedef struct {
00090   NAMED **v;
00091   unsigned char power;
00092   size_t size;
00093   size_t used;
00094   const XML_Memory_Handling_Suite *mem;
00095 } HASH_TABLE;
00096 
00097 /* Basic character hash algorithm, taken from Python's string hash:
00098    h = h * 1000003 ^ character, the constant being a prime number.
00099 
00100 */
00101 #ifdef XML_UNICODE
00102 #define CHAR_HASH(h, c) \
00103   (((h) * 0xF4243) ^ (unsigned short)(c))
00104 #else
00105 #define CHAR_HASH(h, c) \
00106   (((h) * 0xF4243) ^ (unsigned char)(c))
00107 #endif
00108 
00109 /* For probing (after a collision) we need a step size relative prime
00110    to the hash table size, which is a power of 2. We use double-hashing,
00111    since we can calculate a second hash value cheaply by taking those bits
00112    of the first hash value that were discarded (masked out) when the table
00113    index was calculated: index = hash & mask, where mask = table->size - 1.
00114    We limit the maximum step size to table->size / 4 (mask >> 2) and make
00115    it odd, since odd numbers are always relative prime to a power of 2.
00116 */
00117 #define SECOND_HASH(hash, mask, power) \
00118   ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2))
00119 #define PROBE_STEP(hash, mask, power) \
00120   ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1))
00121 
00122 typedef struct {
00123   NAMED **p;
00124   NAMED **end;
00125 } HASH_TABLE_ITER;
00126 
00127 #define INIT_TAG_BUF_SIZE 32  /* must be a multiple of sizeof(XML_Char) */
00128 #define INIT_DATA_BUF_SIZE 1024
00129 #define INIT_ATTS_SIZE 16
00130 #define INIT_ATTS_VERSION 0xFFFFFFFF
00131 #define INIT_BLOCK_SIZE 1024
00132 #define INIT_BUFFER_SIZE 1024
00133 
00134 #define EXPAND_SPARE 24
00135 
00136 typedef struct binding {
00137   struct prefix *prefix;
00138   struct binding *nextTagBinding;
00139   struct binding *prevPrefixBinding;
00140   const struct attribute_id *attId;
00141   XML_Char *uri;
00142   int uriLen;
00143   int uriAlloc;
00144 } BINDING;
00145 
00146 typedef struct prefix {
00147   const XML_Char *name;
00148   BINDING *binding;
00149 } PREFIX;
00150 
00151 typedef struct {
00152   const XML_Char *str;
00153   const XML_Char *localPart;
00154   const XML_Char *prefix;
00155   int strLen;
00156   int uriLen;
00157   int prefixLen;
00158 } TAG_NAME;
00159 
00160 /* TAG represents an open element.
00161    The name of the element is stored in both the document and API
00162    encodings.  The memory buffer 'buf' is a separately-allocated
00163    memory area which stores the name.  During the XML_Parse()/
00164    XMLParseBuffer() when the element is open, the memory for the 'raw'
00165    version of the name (in the document encoding) is shared with the
00166    document buffer.  If the element is open across calls to
00167    XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to
00168    contain the 'raw' name as well.
00169 
00170    A parser re-uses these structures, maintaining a list of allocated
00171    TAG objects in a free list.
00172 */
00173 typedef struct tag {
00174   struct tag *parent;           /* parent of this element */
00175   const char *rawName;          /* tagName in the original encoding */
00176   int rawNameLength;
00177   TAG_NAME name;                /* tagName in the API encoding */
00178   char *buf;                    /* buffer for name components */
00179   char *bufEnd;                 /* end of the buffer */
00180   BINDING *bindings;
00181 } TAG;
00182 
00183 typedef struct {
00184   const XML_Char *name;
00185   const XML_Char *textPtr;
00186   int textLen;                  /* length in XML_Chars */
00187   int processed;                /* # of processed bytes - when suspended */
00188   const XML_Char *systemId;
00189   const XML_Char *base;
00190   const XML_Char *publicId;
00191   const XML_Char *notation;
00192   XML_Bool open;
00193   XML_Bool is_param;
00194   XML_Bool is_internal; /* true if declared in internal subset outside PE */
00195 } ENTITY;
00196 
00197 typedef struct {
00198   enum XML_Content_Type         type;
00199   enum XML_Content_Quant        quant;
00200   const XML_Char *              name;
00201   int                           firstchild;
00202   int                           lastchild;
00203   int                           childcnt;
00204   int                           nextsib;
00205 } CONTENT_SCAFFOLD;
00206 
00207 #define INIT_SCAFFOLD_ELEMENTS 32
00208 
00209 typedef struct block {
00210   struct block *next;
00211   int size;
00212   XML_Char s[1];
00213 } BLOCK;
00214 
00215 typedef struct {
00216   BLOCK *blocks;
00217   BLOCK *freeBlocks;
00218   const XML_Char *end;
00219   XML_Char *ptr;
00220   XML_Char *start;
00221   const XML_Memory_Handling_Suite *mem;
00222 } STRING_POOL;
00223 
00224 /* The XML_Char before the name is used to determine whether
00225    an attribute has been specified. */
00226 typedef struct attribute_id {
00227   XML_Char *name;
00228   PREFIX *prefix;
00229   XML_Bool maybeTokenized;
00230   XML_Bool xmlns;
00231 } ATTRIBUTE_ID;
00232 
00233 typedef struct {
00234   const ATTRIBUTE_ID *id;
00235   XML_Bool isCdata;
00236   const XML_Char *value;
00237 } DEFAULT_ATTRIBUTE;
00238 
00239 typedef struct {
00240   unsigned long version;
00241   unsigned long hash;
00242   const XML_Char *uriName;
00243 } NS_ATT;
00244 
00245 typedef struct {
00246   const XML_Char *name;
00247   PREFIX *prefix;
00248   const ATTRIBUTE_ID *idAtt;
00249   int nDefaultAtts;
00250   int allocDefaultAtts;
00251   DEFAULT_ATTRIBUTE *defaultAtts;
00252 } ELEMENT_TYPE;
00253 
00254 typedef struct {
00255   HASH_TABLE generalEntities;
00256   HASH_TABLE elementTypes;
00257   HASH_TABLE attributeIds;
00258   HASH_TABLE prefixes;
00259   STRING_POOL pool;
00260   STRING_POOL entityValuePool;
00261   /* false once a parameter entity reference has been skipped */
00262   XML_Bool keepProcessing;
00263   /* true once an internal or external PE reference has been encountered;
00264      this includes the reference to an external subset */
00265   XML_Bool hasParamEntityRefs;
00266   XML_Bool standalone;
00267 #ifdef XML_DTD
00268   /* indicates if external PE has been read */
00269   XML_Bool paramEntityRead;
00270   HASH_TABLE paramEntities;
00271 #endif /* XML_DTD */
00272   PREFIX defaultPrefix;
00273   /* === scaffolding for building content model === */
00274   XML_Bool in_eldecl;
00275   CONTENT_SCAFFOLD *scaffold;
00276   unsigned contentStringLen;
00277   unsigned scaffSize;
00278   unsigned scaffCount;
00279   int scaffLevel;
00280   int *scaffIndex;
00281 } DTD;
00282 
00283 typedef struct open_internal_entity {
00284   const char *internalEventPtr;
00285   const char *internalEventEndPtr;
00286   struct open_internal_entity *next;
00287   ENTITY *entity;
00288   int startTagLevel;
00289   XML_Bool betweenDecl; /* WFC: PE Between Declarations */
00290 } OPEN_INTERNAL_ENTITY;
00291 
00292 typedef enum XML_Error PTRCALL Processor(XML_Parser parser,
00293                                          const char *start,
00294                                          const char *end,
00295                                          const char **endPtr);
00296 
00297 static Processor prologProcessor;
00298 static Processor prologInitProcessor;
00299 static Processor contentProcessor;
00300 static Processor cdataSectionProcessor;
00301 #ifdef XML_DTD
00302 static Processor ignoreSectionProcessor;
00303 static Processor externalParEntProcessor;
00304 static Processor externalParEntInitProcessor;
00305 static Processor entityValueProcessor;
00306 static Processor entityValueInitProcessor;
00307 #endif /* XML_DTD */
00308 static Processor epilogProcessor;
00309 static Processor errorProcessor;
00310 static Processor externalEntityInitProcessor;
00311 static Processor externalEntityInitProcessor2;
00312 static Processor externalEntityInitProcessor3;
00313 static Processor externalEntityContentProcessor;
00314 static Processor internalEntityProcessor;
00315 
00316 static enum XML_Error
00317 handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName);
00318 static enum XML_Error
00319 processXmlDecl(XML_Parser parser, int isGeneralTextEntity,
00320                const char *s, const char *next);
00321 static enum XML_Error
00322 initializeEncoding(XML_Parser parser);
00323 static enum XML_Error
00324 doProlog(XML_Parser parser, const ENCODING *enc, const char *s, 
00325          const char *end, int tok, const char *next, const char **nextPtr, 
00326          XML_Bool haveMore);
00327 static enum XML_Error
00328 processInternalEntity(XML_Parser parser, ENTITY *entity, 
00329                       XML_Bool betweenDecl);
00330 static enum XML_Error
00331 doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
00332           const char *start, const char *end, const char **endPtr, 
00333           XML_Bool haveMore);
00334 static enum XML_Error
00335 doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr,
00336                const char *end, const char **nextPtr, XML_Bool haveMore);
00337 #ifdef XML_DTD
00338 static enum XML_Error
00339 doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr,
00340                 const char *end, const char **nextPtr, XML_Bool haveMore);
00341 #endif /* XML_DTD */
00342 
00343 static enum XML_Error
00344 storeAtts(XML_Parser parser, const ENCODING *, const char *s,
00345           TAG_NAME *tagNamePtr, BINDING **bindingsPtr);
00346 static enum XML_Error
00347 addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
00348            const XML_Char *uri, BINDING **bindingsPtr);
00349 static int
00350 defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, 
00351                 XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser);
00352 static enum XML_Error
00353 storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata,
00354                     const char *, const char *, STRING_POOL *);
00355 static enum XML_Error
00356 appendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata,
00357                      const char *, const char *, STRING_POOL *);
00358 static ATTRIBUTE_ID *
00359 getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start,
00360                const char *end);
00361 static int
00362 setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *);
00363 static enum XML_Error
00364 storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *start,
00365                  const char *end);
00366 static int
00367 reportProcessingInstruction(XML_Parser parser, const ENCODING *enc,
00368                             const char *start, const char *end);
00369 static int
00370 reportComment(XML_Parser parser, const ENCODING *enc, const char *start,
00371               const char *end);
00372 static void
00373 reportDefault(XML_Parser parser, const ENCODING *enc, const char *start,
00374               const char *end);
00375 
00376 static const XML_Char * getContext(XML_Parser parser);
00377 static XML_Bool
00378 setContext(XML_Parser parser, const XML_Char *context);
00379 
00380 static void FASTCALL normalizePublicId(XML_Char *s);
00381 
00382 static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms);
00383 /* do not call if parentParser != NULL */
00384 static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms);
00385 static void
00386 dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms);
00387 static int
00388 dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms);
00389 static int
00390 copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *);
00391 
00392 static NAMED *
00393 lookup(HASH_TABLE *table, KEY name, size_t createSize);
00394 static void FASTCALL
00395 hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms);
00396 static void FASTCALL hashTableClear(HASH_TABLE *);
00397 static void FASTCALL hashTableDestroy(HASH_TABLE *);
00398 static void FASTCALL
00399 hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *);
00400 static NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *);
00401 
00402 static void FASTCALL
00403 poolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms);
00404 static void FASTCALL poolClear(STRING_POOL *);
00405 static void FASTCALL poolDestroy(STRING_POOL *);
00406 static XML_Char *
00407 poolAppend(STRING_POOL *pool, const ENCODING *enc,
00408            const char *ptr, const char *end);
00409 static XML_Char *
00410 poolStoreString(STRING_POOL *pool, const ENCODING *enc,
00411                 const char *ptr, const char *end);
00412 static XML_Bool FASTCALL poolGrow(STRING_POOL *pool);
00413 static const XML_Char * FASTCALL
00414 poolCopyString(STRING_POOL *pool, const XML_Char *s);
00415 static const XML_Char *
00416 poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n);
00417 static const XML_Char * FASTCALL
00418 poolAppendString(STRING_POOL *pool, const XML_Char *s);
00419 
00420 static int FASTCALL nextScaffoldPart(XML_Parser parser);
00421 static XML_Content * build_model(XML_Parser parser);
00422 static ELEMENT_TYPE *
00423 getElementType(XML_Parser parser, const ENCODING *enc,
00424                const char *ptr, const char *end);
00425 
00426 static XML_Parser
00427 parserCreate(const XML_Char *encodingName,
00428              const XML_Memory_Handling_Suite *memsuite,
00429              const XML_Char *nameSep,
00430              DTD *dtd);
00431 static void
00432 parserInit(XML_Parser parser, const XML_Char *encodingName);
00433 
00434 #define poolStart(pool) ((pool)->start)
00435 #define poolEnd(pool) ((pool)->ptr)
00436 #define poolLength(pool) ((pool)->ptr - (pool)->start)
00437 #define poolChop(pool) ((void)--(pool->ptr))
00438 #define poolLastChar(pool) (((pool)->ptr)[-1])
00439 #define poolDiscard(pool) ((pool)->ptr = (pool)->start)
00440 #define poolFinish(pool) ((pool)->start = (pool)->ptr)
00441 #define poolAppendChar(pool, c) \
00442   (((pool)->ptr == (pool)->end && !poolGrow(pool)) \
00443    ? 0 \
00444    : ((*((pool)->ptr)++ = c), 1))
00445 
00446 struct XML_ParserStruct {
00447   /* The first member must be userData so that the XML_GetUserData
00448      macro works. */
00449   void *m_userData;
00450   void *m_handlerArg;
00451   char *m_buffer;
00452   const XML_Memory_Handling_Suite m_mem;
00453   /* first character to be parsed */
00454   const char *m_bufferPtr;
00455   /* past last character to be parsed */
00456   char *m_bufferEnd;
00457   /* allocated end of buffer */
00458   const char *m_bufferLim;
00459   long m_parseEndByteIndex;
00460   const char *m_parseEndPtr;
00461   XML_Char *m_dataBuf;
00462   XML_Char *m_dataBufEnd;
00463   XML_StartElementHandler m_startElementHandler;
00464   XML_EndElementHandler m_endElementHandler;
00465   XML_CharacterDataHandler m_characterDataHandler;
00466   XML_ProcessingInstructionHandler m_processingInstructionHandler;
00467   XML_CommentHandler m_commentHandler;
00468   XML_StartCdataSectionHandler m_startCdataSectionHandler;
00469   XML_EndCdataSectionHandler m_endCdataSectionHandler;
00470   XML_DefaultHandler m_defaultHandler;
00471   XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler;
00472   XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler;
00473   XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler;
00474   XML_NotationDeclHandler m_notationDeclHandler;
00475   XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler;
00476   XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler;
00477   XML_NotStandaloneHandler m_notStandaloneHandler;
00478   XML_ExternalEntityRefHandler m_externalEntityRefHandler;
00479   XML_Parser m_externalEntityRefHandlerArg;
00480   XML_SkippedEntityHandler m_skippedEntityHandler;
00481   XML_UnknownEncodingHandler m_unknownEncodingHandler;
00482   XML_ElementDeclHandler m_elementDeclHandler;
00483   XML_AttlistDeclHandler m_attlistDeclHandler;
00484   XML_EntityDeclHandler m_entityDeclHandler;
00485   XML_XmlDeclHandler m_xmlDeclHandler;
00486   const ENCODING *m_encoding;
00487   INIT_ENCODING m_initEncoding;
00488   const ENCODING *m_internalEncoding;
00489   const XML_Char *m_protocolEncodingName;
00490   XML_Bool m_ns;
00491   XML_Bool m_ns_triplets;
00492   void *m_unknownEncodingMem;
00493   void *m_unknownEncodingData;
00494   void *m_unknownEncodingHandlerData;
00495   void (XMLCALL *m_unknownEncodingRelease)(void *);
00496   PROLOG_STATE m_prologState;
00497   Processor *m_processor;
00498   enum XML_Error m_errorCode;
00499   const char *m_eventPtr;
00500   const char *m_eventEndPtr;
00501   const char *m_positionPtr;
00502   OPEN_INTERNAL_ENTITY *m_openInternalEntities;
00503   OPEN_INTERNAL_ENTITY *m_freeInternalEntities;
00504   XML_Bool m_defaultExpandInternalEntities;
00505   int m_tagLevel;
00506   ENTITY *m_declEntity;
00507   const XML_Char *m_doctypeName;
00508   const XML_Char *m_doctypeSysid;
00509   const XML_Char *m_doctypePubid;
00510   const XML_Char *m_declAttributeType;
00511   const XML_Char *m_declNotationName;
00512   const XML_Char *m_declNotationPublicId;
00513   ELEMENT_TYPE *m_declElementType;
00514   ATTRIBUTE_ID *m_declAttributeId;
00515   XML_Bool m_declAttributeIsCdata;
00516   XML_Bool m_declAttributeIsId;
00517   DTD *m_dtd;
00518   const XML_Char *m_curBase;
00519   TAG *m_tagStack;
00520   TAG *m_freeTagList;
00521   BINDING *m_inheritedBindings;
00522   BINDING *m_freeBindingList;
00523   int m_attsSize;
00524   int m_nSpecifiedAtts;
00525   int m_idAttIndex;
00526   ATTRIBUTE *m_atts;
00527   NS_ATT *m_nsAtts;
00528   unsigned long m_nsAttsVersion;
00529   unsigned char m_nsAttsPower;
00530   POSITION m_position;
00531   STRING_POOL m_tempPool;
00532   STRING_POOL m_temp2Pool;
00533   char *m_groupConnector;
00534   unsigned int m_groupSize;
00535   XML_Char m_namespaceSeparator;
00536   XML_Parser m_parentParser;
00537   XML_ParsingStatus m_parsingStatus;
00538 #ifdef XML_DTD
00539   XML_Bool m_isParamEntity;
00540   XML_Bool m_useForeignDTD;
00541   enum XML_ParamEntityParsing m_paramEntityParsing;
00542 #endif
00543 };
00544 
00545 #define MALLOC(s) (parser->m_mem.malloc_fcn((s)))
00546 #define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s)))
00547 #define FREE(p) (parser->m_mem.free_fcn((p)))
00548 
00549 #define userData (parser->m_userData)
00550 #define handlerArg (parser->m_handlerArg)
00551 #define startElementHandler (parser->m_startElementHandler)
00552 #define endElementHandler (parser->m_endElementHandler)
00553 #define characterDataHandler (parser->m_characterDataHandler)
00554 #define processingInstructionHandler \
00555         (parser->m_processingInstructionHandler)
00556 #define commentHandler (parser->m_commentHandler)
00557 #define startCdataSectionHandler \
00558         (parser->m_startCdataSectionHandler)
00559 #define endCdataSectionHandler (parser->m_endCdataSectionHandler)
00560 #define defaultHandler (parser->m_defaultHandler)
00561 #define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler)
00562 #define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler)
00563 #define unparsedEntityDeclHandler \
00564         (parser->m_unparsedEntityDeclHandler)
00565 #define notationDeclHandler (parser->m_notationDeclHandler)
00566 #define startNamespaceDeclHandler \
00567         (parser->m_startNamespaceDeclHandler)
00568 #define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler)
00569 #define notStandaloneHandler (parser->m_notStandaloneHandler)
00570 #define externalEntityRefHandler \
00571         (parser->m_externalEntityRefHandler)
00572 #define externalEntityRefHandlerArg \
00573         (parser->m_externalEntityRefHandlerArg)
00574 #define internalEntityRefHandler \
00575         (parser->m_internalEntityRefHandler)
00576 #define skippedEntityHandler (parser->m_skippedEntityHandler)
00577 #define unknownEncodingHandler (parser->m_unknownEncodingHandler)
00578 #define elementDeclHandler (parser->m_elementDeclHandler)
00579 #define attlistDeclHandler (parser->m_attlistDeclHandler)
00580 #define entityDeclHandler (parser->m_entityDeclHandler)
00581 #define xmlDeclHandler (parser->m_xmlDeclHandler)
00582 #define encoding (parser->m_encoding)
00583 #define initEncoding (parser->m_initEncoding)
00584 #define internalEncoding (parser->m_internalEncoding)
00585 #define unknownEncodingMem (parser->m_unknownEncodingMem)
00586 #define unknownEncodingData (parser->m_unknownEncodingData)
00587 #define unknownEncodingHandlerData \
00588   (parser->m_unknownEncodingHandlerData)
00589 #define unknownEncodingRelease (parser->m_unknownEncodingRelease)
00590 #define protocolEncodingName (parser->m_protocolEncodingName)
00591 #define ns (parser->m_ns)
00592 #define ns_triplets (parser->m_ns_triplets)
00593 #define prologState (parser->m_prologState)
00594 #define processor (parser->m_processor)
00595 #define errorCode (parser->m_errorCode)
00596 #define eventPtr (parser->m_eventPtr)
00597 #define eventEndPtr (parser->m_eventEndPtr)
00598 #define positionPtr (parser->m_positionPtr)
00599 #define position (parser->m_position)
00600 #define openInternalEntities (parser->m_openInternalEntities)
00601 #define freeInternalEntities (parser->m_freeInternalEntities)
00602 #define defaultExpandInternalEntities \
00603         (parser->m_defaultExpandInternalEntities)
00604 #define tagLevel (parser->m_tagLevel)
00605 #define buffer (parser->m_buffer)
00606 #define bufferPtr (parser->m_bufferPtr)
00607 #define bufferEnd (parser->m_bufferEnd)
00608 #define parseEndByteIndex (parser->m_parseEndByteIndex)
00609 #define parseEndPtr (parser->m_parseEndPtr)
00610 #define bufferLim (parser->m_bufferLim)
00611 #define dataBuf (parser->m_dataBuf)
00612 #define dataBufEnd (parser->m_dataBufEnd)
00613 #define _dtd (parser->m_dtd)
00614 #define curBase (parser->m_curBase)
00615 #define declEntity (parser->m_declEntity)
00616 #define doctypeName (parser->m_doctypeName)
00617 #define doctypeSysid (parser->m_doctypeSysid)
00618 #define doctypePubid (parser->m_doctypePubid)
00619 #define declAttributeType (parser->m_declAttributeType)
00620 #define declNotationName (parser->m_declNotationName)
00621 #define declNotationPublicId (parser->m_declNotationPublicId)
00622 #define declElementType (parser->m_declElementType)
00623 #define declAttributeId (parser->m_declAttributeId)
00624 #define declAttributeIsCdata (parser->m_declAttributeIsCdata)
00625 #define declAttributeIsId (parser->m_declAttributeIsId)
00626 #define freeTagList (parser->m_freeTagList)
00627 #define freeBindingList (parser->m_freeBindingList)
00628 #define inheritedBindings (parser->m_inheritedBindings)
00629 #define tagStack (parser->m_tagStack)
00630 #define atts (parser->m_atts)
00631 #define attsSize (parser->m_attsSize)
00632 #define nSpecifiedAtts (parser->m_nSpecifiedAtts)
00633 #define idAttIndex (parser->m_idAttIndex)
00634 #define nsAtts (parser->m_nsAtts)
00635 #define nsAttsVersion (parser->m_nsAttsVersion)
00636 #define nsAttsPower (parser->m_nsAttsPower)
00637 #define tempPool (parser->m_tempPool)
00638 #define temp2Pool (parser->m_temp2Pool)
00639 #define groupConnector (parser->m_groupConnector)
00640 #define groupSize (parser->m_groupSize)
00641 #define namespaceSeparator (parser->m_namespaceSeparator)
00642 #define parentParser (parser->m_parentParser)
00643 #define parsing (parser->m_parsingStatus.parsing)
00644 #define finalBuffer (parser->m_parsingStatus.finalBuffer)
00645 #ifdef XML_DTD
00646 #define isParamEntity (parser->m_isParamEntity)
00647 #define useForeignDTD (parser->m_useForeignDTD)
00648 #define paramEntityParsing (parser->m_paramEntityParsing)
00649 #endif /* XML_DTD */
00650 
00651 XML_Parser XMLCALL
00652 XML_ParserCreate(const XML_Char *encodingName)
00653 {
00654   return XML_ParserCreate_MM(encodingName, NULL, NULL);
00655 }
00656 
00657 XML_Parser XMLCALL
00658 XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep)
00659 {
00660   XML_Char tmp[2];
00661   *tmp = nsSep;
00662   return XML_ParserCreate_MM(encodingName, NULL, tmp);
00663 }
00664 
00665 static const XML_Char implicitContext[] = {
00666   'x', 'm', 'l', '=', 'h', 't', 't', 'p', ':', '/', '/',
00667   'w', 'w', 'w', '.', 'w', '3', '.', 'o', 'r', 'g', '/',
00668   'X', 'M', 'L', '/', '1', '9', '9', '8', '/',
00669   'n', 'a', 'm', 'e', 's', 'p', 'a', 'c', 'e', '\0'
00670 };
00671 
00672 XML_Parser XMLCALL
00673 XML_ParserCreate_MM(const XML_Char *encodingName,
00674                     const XML_Memory_Handling_Suite *memsuite,
00675                     const XML_Char *nameSep)
00676 {
00677   XML_Parser parser = parserCreate(encodingName, memsuite, nameSep, NULL);
00678   if (parser != NULL && ns) {
00679     /* implicit context only set for root parser, since child
00680        parsers (i.e. external entity parsers) will inherit it
00681     */
00682     if (!setContext(parser, implicitContext)) {
00683       XML_ParserFree(parser);
00684       return NULL;
00685     }
00686   }
00687   return parser;
00688 }
00689 
00690 static XML_Parser
00691 parserCreate(const XML_Char *encodingName,
00692              const XML_Memory_Handling_Suite *memsuite,
00693              const XML_Char *nameSep,
00694              DTD *dtd)
00695 {
00696   XML_Parser parser;
00697 
00698   if (memsuite) {
00699     XML_Memory_Handling_Suite *mtemp;
00700     parser = (XML_Parser)
00701       memsuite->malloc_fcn(sizeof(struct XML_ParserStruct));
00702     if (parser != NULL) {
00703       mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
00704       mtemp->malloc_fcn = memsuite->malloc_fcn;
00705       mtemp->realloc_fcn = memsuite->realloc_fcn;
00706       mtemp->free_fcn = memsuite->free_fcn;
00707     }
00708   }
00709   else {
00710     XML_Memory_Handling_Suite *mtemp;
00711     parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct));
00712     if (parser != NULL) {
00713       mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
00714       mtemp->malloc_fcn = malloc;
00715       mtemp->realloc_fcn = realloc;
00716       mtemp->free_fcn = free;
00717     }
00718   }
00719 
00720   if (!parser)
00721     return parser;
00722 
00723   buffer = NULL;
00724   bufferLim = NULL;
00725 
00726   attsSize = INIT_ATTS_SIZE;
00727   atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE));
00728   if (atts == NULL) {
00729     FREE(parser);
00730     return NULL;
00731   }
00732   dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char));
00733   if (dataBuf == NULL) {
00734     FREE(atts);
00735     FREE(parser);
00736     return NULL;
00737   }
00738   dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE;
00739 
00740   if (dtd)
00741     _dtd = dtd;
00742   else {
00743     _dtd = dtdCreate(&parser->m_mem);
00744     if (_dtd == NULL) {
00745       FREE(dataBuf);
00746       FREE(atts);
00747       FREE(parser);
00748       return NULL;
00749     }
00750   }
00751 
00752   freeBindingList = NULL;
00753   freeTagList = NULL;
00754   freeInternalEntities = NULL;
00755 
00756   groupSize = 0;
00757   groupConnector = NULL;
00758 
00759   unknownEncodingHandler = NULL;
00760   unknownEncodingHandlerData = NULL;
00761 
00762   namespaceSeparator = '!';
00763   ns = XML_FALSE;
00764   ns_triplets = XML_FALSE;
00765 
00766   nsAtts = NULL;
00767   nsAttsVersion = 0;
00768   nsAttsPower = 0;
00769 
00770   poolInit(&tempPool, &(parser->m_mem));
00771   poolInit(&temp2Pool, &(parser->m_mem));
00772   parserInit(parser, encodingName);
00773 
00774   if (encodingName && !protocolEncodingName) {
00775     XML_ParserFree(parser);
00776     return NULL;
00777   }
00778 
00779   if (nameSep) {
00780     ns = XML_TRUE;
00781     internalEncoding = XmlGetInternalEncodingNS();
00782     namespaceSeparator = *nameSep;
00783   }
00784   else {
00785     internalEncoding = XmlGetInternalEncoding();
00786   }
00787 
00788   return parser;
00789 }
00790 
00791 static void
00792 parserInit(XML_Parser parser, const XML_Char *encodingName)
00793 {
00794   processor = prologInitProcessor;
00795   XmlPrologStateInit(&prologState);
00796   protocolEncodingName = (encodingName != NULL
00797                           ? poolCopyString(&tempPool, encodingName)
00798                           : NULL);
00799   curBase = NULL;
00800   XmlInitEncoding(&initEncoding, &encoding, 0);
00801   userData = NULL;
00802   handlerArg = NULL;
00803   startElementHandler = NULL;
00804   endElementHandler = NULL;
00805   characterDataHandler = NULL;
00806   processingInstructionHandler = NULL;
00807   commentHandler = NULL;
00808   startCdataSectionHandler = NULL;
00809   endCdataSectionHandler = NULL;
00810