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

📄 xmlparse.c

📁 apache的软件linux版本
💻 C
📖 第 1 页 / 共 5 页
字号:
/*Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center LtdSee the file COPYING for copying permission.*/static char RCSId[]  = "$Header: /home/cvs/apr-util/xml/expat/lib/xmlparse.c,v 1.4 2001/08/30 05:44:18 wrowe Exp $";#ifdef COMPILED_FROM_DSP#  include "winconfig.h"#  define XMLPARSEAPI __declspec(dllexport)#  include "expat.h"#  undef XMLPARSEAPI#else#include <config.h>#ifdef HAVE_STRING_H#  include <string.h>#endif#ifndef __CYGWIN__#ifdef __declspec#  define XMLPARSEAPI __declspec(dllexport)#endif#endif#include "expat.h"#ifdef __declspec#  undef XMLPARSEAPI#endif#endif /* ndef COMPILED_FROM_DSP */#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;  XML_Memory_Handling_Suite *mem;} 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;  char is_param;} ENTITY;typedef struct {  enum XML_Content_Type		type;  enum XML_Content_Quant	quant;  const XML_Char *		name;  int				firstchild;  int				lastchild;  int				childcnt;  int				nextsib;} CONTENT_SCAFFOLD;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;  XML_Memory_Handling_Suite *mem;} 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;  /* === scaffolding for building content model === */  int in_eldecl;  CONTENT_SCAFFOLD *scaffold;  unsigned contentStringLen;  unsigned scaffSize;  unsigned scaffCount;  int scaffLevel;  int *scaffIndex;} 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,		XML_Parser parser);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 *, XML_Parser parser);static void dtdDestroy(DTD *, XML_Parser parser);static int dtdCopy(DTD *newDtd, const DTD *oldDtd, XML_Parser parser);static int copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *,			   XML_Parser parser);#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 *, XML_Memory_Handling_Suite *ms);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 *, XML_Memory_Handling_Suite *ms);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 int nextScaffoldPart(XML_Parser parser);static XML_Content *build_model(XML_Parser parser);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);static const XML_Char *poolAppendString(STRING_POOL *pool, const XML_Char *s);static ELEMENT_TYPE * getElementType(XML_Parser Paraser,				     const ENCODING *enc,				     const char *ptr,				     const char *end);#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;  XML_Memory_Handling_Suite m_mem;  /* 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_StartNamespaceDeclHandler m_startNamespaceDeclHandler;  XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler;  XML_NotStandaloneHandler m_notStandaloneHandler;  XML_ExternalEntityRefHandler m_externalEntityRefHandler;  void *m_externalEntityRefHandlerArg;  XML_UnknownEncodingHandler m_unknownEncodingHandler;  XML_ElementDeclHandler m_elementDeclHandler;  XML_AttlistDeclHandler m_attlistDeclHandler;  XML_EntityDeclHandler m_entityDeclHandler;  XML_XmlDeclHandler m_xmlDeclHandler;  const ENCODING *m_encoding;  INIT_ENCODING m_initEncoding;  const ENCODING *m_internalEncoding;  const XML_Char *m_protocolEncodingName;  int m_ns;  int m_ns_triplets;  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_doctypeName;  const XML_Char *m_doctypeSysid;  const XML_Char *m_doctypePubid;  const XML_Char *m_declAttributeType;  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 MALLOC(s) (((Parser *)parser)->m_mem.malloc_fcn((s)))#define REALLOC(p,s) (((Parser *)parser)->m_mem.realloc_fcn((p),(s)))#define FREE(p) (((Parser *)parser)->m_mem.free_fcn((p)))#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)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -