00001
00002
00003
00004
00005 #include <stddef.h>
00006 #include <string.h>
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
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
00068 #define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1))
00069
00070
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
00077 #endif
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
00098
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
00110
00111
00112
00113
00114
00115
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
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
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173 typedef struct tag {
00174 struct tag *parent;
00175 const char *rawName;
00176 int rawNameLength;
00177 TAG_NAME name;
00178 char *buf;
00179 char *bufEnd;
00180 BINDING *bindings;
00181 } TAG;
00182
00183 typedef struct {
00184 const XML_Char *name;
00185 const XML_Char *textPtr;
00186 int textLen;
00187 int processed;
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;
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
00225
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
00262 XML_Bool keepProcessing;
00263
00264
00265 XML_Bool hasParamEntityRefs;
00266 XML_Bool standalone;
00267 #ifdef XML_DTD
00268
00269 XML_Bool paramEntityRead;
00270 HASH_TABLE paramEntities;
00271 #endif
00272 PREFIX defaultPrefix;
00273
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;
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
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
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
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
00448
00449 void *m_userData;
00450 void *m_handlerArg;
00451 char *m_buffer;
00452 const XML_Memory_Handling_Suite m_mem;
00453
00454 const char *m_bufferPtr;
00455
00456 char *m_bufferEnd;
00457
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
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
00680
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