📄 xmlparse.c
字号:
/*Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center LtdSee the file copying.txt for copying permission.*/#include "xmldef.h"#include "xmlparse.h"#include <stddef.h>#ifdef XML_UNICODE#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX#define XmlConvert XmlUtf16Convert#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS#define XmlEncode XmlUtf16Encode#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1))typedef unsigned short ICHAR;#else#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX#define XmlConvert XmlUtf8Convert#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS#define XmlEncode XmlUtf8Encode#define MUST_CONVERT(enc, s) (!(enc)->isUtf8)typedef char ICHAR;#endif#ifndef XML_NS#define XmlInitEncodingNS XmlInitEncoding#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding#undef XmlGetInternalEncodingNS#define XmlGetInternalEncodingNS XmlGetInternalEncoding#define XmlParseXmlDeclNS XmlParseXmlDecl#endif#ifdef XML_UNICODE_WCHAR_T#define XML_T(x) L ## x#else#define XML_T(x) x#endif/* Round up n to be a multiple of sz, where sz is a power of 2. */#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1))#include "xmltok.h"#include "xmlrole.h"typedef const XML_Char *KEY;typedef struct { KEY name;} NAMED;typedef struct { NAMED **v; size_t size; size_t used; size_t usedLim;} HASH_TABLE;typedef struct { NAMED **p; NAMED **end;} HASH_TABLE_ITER;#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */#define INIT_DATA_BUF_SIZE 1024#define INIT_ATTS_SIZE 16#define INIT_BLOCK_SIZE 1024#define INIT_BUFFER_SIZE 1024#define EXPAND_SPARE 24typedef struct binding { struct prefix *prefix; struct binding *nextTagBinding; struct binding *prevPrefixBinding; const struct attribute_id *attId; XML_Char *uri; int uriLen; int uriAlloc;} BINDING;typedef struct prefix { const XML_Char *name; BINDING *binding;} PREFIX;typedef struct { const XML_Char *str; const XML_Char *localPart; int uriLen;} TAG_NAME;typedef struct tag { struct tag *parent; const char *rawName; int rawNameLength; TAG_NAME name; char *buf; char *bufEnd; BINDING *bindings;} TAG;typedef struct { const XML_Char *name; const XML_Char *textPtr; int textLen; const XML_Char *systemId; const XML_Char *base; const XML_Char *publicId; const XML_Char *notation; char open;} ENTITY;typedef struct block { struct block *next; int size; XML_Char s[1];} BLOCK;typedef struct { BLOCK *blocks; BLOCK *freeBlocks; const XML_Char *end; XML_Char *ptr; XML_Char *start;} STRING_POOL;/* The XML_Char before the name is used to determine whetheran attribute has been specified. */typedef struct attribute_id { XML_Char *name; PREFIX *prefix; char maybeTokenized; char xmlns;} ATTRIBUTE_ID;typedef struct { const ATTRIBUTE_ID *id; char isCdata; const XML_Char *value;} DEFAULT_ATTRIBUTE;typedef struct { const XML_Char *name; PREFIX *prefix; const ATTRIBUTE_ID *idAtt; int nDefaultAtts; int allocDefaultAtts; DEFAULT_ATTRIBUTE *defaultAtts;} ELEMENT_TYPE;typedef struct { HASH_TABLE generalEntities; HASH_TABLE elementTypes; HASH_TABLE attributeIds; HASH_TABLE prefixes; STRING_POOL pool; int complete; int standalone;#ifdef XML_DTD HASH_TABLE paramEntities;#endif /* XML_DTD */ PREFIX defaultPrefix;} DTD;typedef struct open_internal_entity { const char *internalEventPtr; const char *internalEventEndPtr; struct open_internal_entity *next; ENTITY *entity;} OPEN_INTERNAL_ENTITY;typedef enum XML_Error Processor(XML_Parser parser, const char *start, const char *end, const char **endPtr);static Processor prologProcessor;static Processor prologInitProcessor;static Processor contentProcessor;static Processor cdataSectionProcessor;#ifdef XML_DTDstatic Processor ignoreSectionProcessor;#endif /* XML_DTD */static Processor epilogProcessor;static Processor errorProcessor;static Processor externalEntityInitProcessor;static Processor externalEntityInitProcessor2;static Processor externalEntityInitProcessor3;static Processor externalEntityContentProcessor;static enum XML_ErrorhandleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName);static enum XML_ErrorprocessXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *, const char *);static enum XML_ErrorinitializeEncoding(XML_Parser parser);static enum XML_ErrordoProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end, int tok, const char *next, const char **nextPtr);static enum XML_ErrorprocessInternalParamEntity(XML_Parser parser, ENTITY *entity);static enum XML_ErrordoContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, const char *start, const char *end, const char **endPtr);static enum XML_ErrordoCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, const char *end, const char **nextPtr);#ifdef XML_DTDstatic enum XML_ErrordoIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, const char *end, const char **nextPtr);#endif /* XML_DTD */static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *, const char *s, TAG_NAME *tagNamePtr, BINDING **bindingsPtr);staticint addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, const XML_Char *uri, BINDING **bindingsPtr);static intdefineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, int isCdata, int isId, const XML_Char *dfltValue);static enum XML_ErrorstoreAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *, STRING_POOL *);static enum XML_ErrorappendAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *, STRING_POOL *);static ATTRIBUTE_ID *getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *);static enum XML_ErrorstoreEntityValue(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);static intreportProcessingInstruction(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);static intreportComment(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);static voidreportDefault(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);static const XML_Char *getContext(XML_Parser parser);static int setContext(XML_Parser parser, const XML_Char *context);static void normalizePublicId(XML_Char *s);static int dtdInit(DTD *);static void dtdDestroy(DTD *);static int dtdCopy(DTD *newDtd, const DTD *oldDtd);static int copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *);#ifdef XML_DTDstatic void dtdSwap(DTD *, DTD *);#endif /* XML_DTD */static NAMED *lookup(HASH_TABLE *table, KEY name, size_t createSize);static void hashTableInit(HASH_TABLE *);static void hashTableDestroy(HASH_TABLE *);static void hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *);static NAMED *hashTableIterNext(HASH_TABLE_ITER *);static void poolInit(STRING_POOL *);static void poolClear(STRING_POOL *);static void poolDestroy(STRING_POOL *);static XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end);static XML_Char *poolStoreString(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end);static int poolGrow(STRING_POOL *pool);static const XML_Char *poolCopyString(STRING_POOL *pool, const XML_Char *s);static const XML_Char *poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n);#define poolStart(pool) ((pool)->start)#define poolEnd(pool) ((pool)->ptr)#define poolLength(pool) ((pool)->ptr - (pool)->start)#define poolChop(pool) ((void)--(pool->ptr))#define poolLastChar(pool) (((pool)->ptr)[-1])#define poolDiscard(pool) ((pool)->ptr = (pool)->start)#define poolFinish(pool) ((pool)->start = (pool)->ptr)#define poolAppendChar(pool, c) \ (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ ? 0 \ : ((*((pool)->ptr)++ = c), 1))typedef struct { /* The first member must be userData so that the XML_GetUserData macro works. */ void *m_userData; void *m_handlerArg; char *m_buffer; /* first character to be parsed */ const char *m_bufferPtr; /* past last character to be parsed */ char *m_bufferEnd; /* allocated end of buffer */ const char *m_bufferLim; long m_parseEndByteIndex; const char *m_parseEndPtr; XML_Char *m_dataBuf; XML_Char *m_dataBufEnd; XML_StartElementHandler m_startElementHandler; XML_EndElementHandler m_endElementHandler; XML_CharacterDataHandler m_characterDataHandler; XML_ProcessingInstructionHandler m_processingInstructionHandler; XML_CommentHandler m_commentHandler; XML_StartCdataSectionHandler m_startCdataSectionHandler; XML_EndCdataSectionHandler m_endCdataSectionHandler; XML_DefaultHandler m_defaultHandler; XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler; XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler; XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler; XML_NotationDeclHandler m_notationDeclHandler; XML_ExternalParsedEntityDeclHandler m_externalParsedEntityDeclHandler; XML_InternalParsedEntityDeclHandler m_internalParsedEntityDeclHandler; XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler; XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler; XML_NotStandaloneHandler m_notStandaloneHandler; XML_ExternalEntityRefHandler m_externalEntityRefHandler; void *m_externalEntityRefHandlerArg; XML_UnknownEncodingHandler m_unknownEncodingHandler; const ENCODING *m_encoding; INIT_ENCODING m_initEncoding; const ENCODING *m_internalEncoding; const XML_Char *m_protocolEncodingName; int m_ns; void *m_unknownEncodingMem; void *m_unknownEncodingData; void *m_unknownEncodingHandlerData; void (*m_unknownEncodingRelease)(void *); PROLOG_STATE m_prologState; Processor *m_processor; enum XML_Error m_errorCode; const char *m_eventPtr; const char *m_eventEndPtr; const char *m_positionPtr; OPEN_INTERNAL_ENTITY *m_openInternalEntities; int m_defaultExpandInternalEntities; int m_tagLevel; ENTITY *m_declEntity; const XML_Char *m_declNotationName; const XML_Char *m_declNotationPublicId; ELEMENT_TYPE *m_declElementType; ATTRIBUTE_ID *m_declAttributeId; char m_declAttributeIsCdata; char m_declAttributeIsId; DTD m_dtd; const XML_Char *m_curBase; TAG *m_tagStack; TAG *m_freeTagList; BINDING *m_inheritedBindings; BINDING *m_freeBindingList; int m_attsSize; int m_nSpecifiedAtts; int m_idAttIndex; ATTRIBUTE *m_atts; POSITION m_position; STRING_POOL m_tempPool; STRING_POOL m_temp2Pool; char *m_groupConnector; unsigned m_groupSize; int m_hadExternalDoctype; XML_Char m_namespaceSeparator;#ifdef XML_DTD enum XML_ParamEntityParsing m_paramEntityParsing; XML_Parser m_parentParser;#endif} Parser;#define userData (((Parser *)parser)->m_userData)#define handlerArg (((Parser *)parser)->m_handlerArg)#define startElementHandler (((Parser *)parser)->m_startElementHandler)#define endElementHandler (((Parser *)parser)->m_endElementHandler)#define characterDataHandler (((Parser *)parser)->m_characterDataHandler)#define processingInstructionHandler (((Parser *)parser)->m_processingInstructionHandler)#define commentHandler (((Parser *)parser)->m_commentHandler)#define startCdataSectionHandler (((Parser *)parser)->m_startCdataSectionHandler)#define endCdataSectionHandler (((Parser *)parser)->m_endCdataSectionHandler)#define defaultHandler (((Parser *)parser)->m_defaultHandler)#define startDoctypeDeclHandler (((Parser *)parser)->m_startDoctypeDeclHandler)#define endDoctypeDeclHandler (((Parser *)parser)->m_endDoctypeDeclHandler)#define unparsedEntityDeclHandler (((Parser *)parser)->m_unparsedEntityDeclHandler)#define notationDeclHandler (((Parser *)parser)->m_notationDeclHandler)#define externalParsedEntityDeclHandler (((Parser *)parser)->m_externalParsedEntityDeclHandler)#define internalParsedEntityDeclHandler (((Parser *)parser)->m_internalParsedEntityDeclHandler)#define startNamespaceDeclHandler (((Parser *)parser)->m_startNamespaceDeclHandler)#define endNamespaceDeclHandler (((Parser *)parser)->m_endNamespaceDeclHandler)#define notStandaloneHandler (((Parser *)parser)->m_notStandaloneHandler)#define externalEntityRefHandler (((Parser *)parser)->m_externalEntityRefHandler)#define externalEntityRefHandlerArg (((Parser *)parser)->m_externalEntityRefHandlerArg)#define unknownEncodingHandler (((Parser *)parser)->m_unknownEncodingHandler)#define encoding (((Parser *)parser)->m_encoding)#define initEncoding (((Parser *)parser)->m_initEncoding)#define internalEncoding (((Parser *)parser)->m_internalEncoding)#define unknownEncodingMem (((Parser *)parser)->m_unknownEncodingMem)#define unknownEncodingData (((Parser *)parser)->m_unknownEncodingData)#define unknownEncodingHandlerData \ (((Parser *)parser)->m_unknownEncodingHandlerData)#define unknownEncodingRelease (((Parser *)parser)->m_unknownEncodingRelease)#define protocolEncodingName (((Parser *)parser)->m_protocolEncodingName)#define ns (((Parser *)parser)->m_ns)#define prologState (((Parser *)parser)->m_prologState)#define processor (((Parser *)parser)->m_processor)#define errorCode (((Parser *)parser)->m_errorCode)#define eventPtr (((Parser *)parser)->m_eventPtr)#define eventEndPtr (((Parser *)parser)->m_eventEndPtr)#define positionPtr (((Parser *)parser)->m_positionPtr)#define position (((Parser *)parser)->m_position)#define openInternalEntities (((Parser *)parser)->m_openInternalEntities)#define defaultExpandInternalEntities (((Parser *)parser)->m_defaultExpandInternalEntities)#define tagLevel (((Parser *)parser)->m_tagLevel)#define buffer (((Parser *)parser)->m_buffer)#define bufferPtr (((Parser *)parser)->m_bufferPtr)#define bufferEnd (((Parser *)parser)->m_bufferEnd)#define parseEndByteIndex (((Parser *)parser)->m_parseEndByteIndex)#define parseEndPtr (((Parser *)parser)->m_parseEndPtr)#define bufferLim (((Parser *)parser)->m_bufferLim)#define dataBuf (((Parser *)parser)->m_dataBuf)#define dataBufEnd (((Parser *)parser)->m_dataBufEnd)#define dtd (((Parser *)parser)->m_dtd)#define curBase (((Parser *)parser)->m_curBase)#define declEntity (((Parser *)parser)->m_declEntity)#define declNotationName (((Parser *)parser)->m_declNotationName)#define declNotationPublicId (((Parser *)parser)->m_declNotationPublicId)#define declElementType (((Parser *)parser)->m_declElementType)#define declAttributeId (((Parser *)parser)->m_declAttributeId)#define declAttributeIsCdata (((Parser *)parser)->m_declAttributeIsCdata)#define declAttributeIsId (((Parser *)parser)->m_declAttributeIsId)#define freeTagList (((Parser *)parser)->m_freeTagList)#define freeBindingList (((Parser *)parser)->m_freeBindingList)#define inheritedBindings (((Parser *)parser)->m_inheritedBindings)#define tagStack (((Parser *)parser)->m_tagStack)#define atts (((Parser *)parser)->m_atts)#define attsSize (((Parser *)parser)->m_attsSize)#define nSpecifiedAtts (((Parser *)parser)->m_nSpecifiedAtts)#define idAttIndex (((Parser *)parser)->m_idAttIndex)#define tempPool (((Parser *)parser)->m_tempPool)#define temp2Pool (((Parser *)parser)->m_temp2Pool)#define groupConnector (((Parser *)parser)->m_groupConnector)#define groupSize (((Parser *)parser)->m_groupSize)#define hadExternalDoctype (((Parser *)parser)->m_hadExternalDoctype)#define namespaceSeparator (((Parser *)parser)->m_namespaceSeparator)#ifdef XML_DTD#define parentParser (((Parser *)parser)->m_parentParser)#define paramEntityParsing (((Parser *)parser)->m_paramEntityParsing)#endif /* XML_DTD */#ifdef _MSC_VER#ifdef _DEBUGParser *asParser(XML_Parser parser){ return parser;}#endif#endifXML_Parser XML_ParserCreate(const XML_Char *encodingName){ XML_Parser parser = malloc(sizeof(Parser));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -