⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlparse.c

📁 一个用visual studio C++开发的XML文件解析和生成程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
/*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 + -