1 /*=========================================================================== 2 Parsifal XML Parser 3 Copyright (c) 2002-2008 Toni Uusitalo 4 released to the public domain 2002-11-15 5 http://www.saunalahti.fi/~samiuus/toni/xmlproc/ 6 7 Parsifal is free for both commercial and non-commercial use and 8 redistribution, provided that author's copyright and disclaimer are 9 retained intact. You are free to modify Parsifal for your own use and 10 to redistribute Parsifal with your modifications, provided that the 11 modifications are clearly documented. 12 13 DISCLAIMER 14 ---------- 15 16 This program is distributed in the hope that it will be useful, but 17 WITHOUT ANY WARRANTY; without even the implied warranty of 18 Merchantability or fitness for a particular purpose. Please use it AT 19 YOUR OWN RISK. 20 ===========================================================================*/ 21 22 #ifndef PARSIFAL__H 23 #define PARSIFAL__H 24 25 #ifdef __cplusplus 26 extern "C" { 27 #endif 28 29 #include "pns.h" 30 #include "bistream.h" 31 #include "xmlhash.h" 32 #include "xmlvect.h" 33 #include "xmlsbuf.h" 34 #include "xmlpool.h" 35 #include "xmldtd.h" 36 37 #ifndef XMLCH_DEFINED 38 #define XMLCH_DEFINED 39 typedef unsigned char XMLCH; 40 #endif 41 42 typedef struct tagXMLRUNTIMETAG 43 { 44 XMLCH *qname; 45 XMLCH *uri; 46 XMLCH *localName; 47 XMLCH *prefix; 48 LPXMLHTABLE Scope; 49 LPXMLHTABLE prevScope; 50 XMLSTRINGBUF nameBuf; 51 } XMLRUNTIMETAG, *LPXMLRUNTIMETAG; 52 53 typedef struct tagXMLRUNTIMEATT 54 { 55 XMLCH *qname; 56 XMLCH *value; 57 XMLCH *uri; 58 XMLCH *localName; 59 XMLCH *prefix; 60 XMLSTRINGBUF nameBuf; 61 XMLSTRINGBUF valBuf; 62 } XMLRUNTIMEATT, *LPXMLRUNTIMEATT; 63 64 enum tagXMLENTITYTYPE { 65 XML_ENTITY_INT_PARAM = 1, 66 XML_ENTITY_INT_GEN, 67 XML_ENTITY_EXT_PARAM, 68 XML_ENTITY_EXT_GEN, 69 XML_ENTITY_UNPARSED, 70 XML_ENTITY_DOCTYPE 71 }; 72 typedef enum tagXMLENTITYTYPE XMLENTITYTYPE; 73 74 typedef struct tagXMLENTITY 75 { 76 XMLENTITYTYPE type; 77 int len; 78 int open; 79 XMLCH *name; 80 XMLCH *value; 81 XMLCH *publicID; 82 XMLCH *systemID; 83 XMLCH *notation; 84 } XMLENTITY, *LPXMLENTITY; 85 86 typedef struct tagXMLPARSERRUNTIME 87 { 88 LPXMLHTABLE nsScope; 89 LPXMLHTABLE namedAtts; 90 LPXMLHTABLE entitiesTable; 91 LPXMLHTABLE declAttTable; 92 LPXMLHTABLE cpNames; 93 LPXMLVECTOR atts; 94 LPXMLVECTOR tagstack; 95 LPXMLVECTOR entities; 96 LPBUFFEREDISTREAM refReader; 97 XMLCH *publicID, *systemID, *doctypeStr; 98 const XMLCH *nameStart; 99 XMLSTRINGBUF charsBuf; 100 LPXMLPOOL strPool; 101 LPXMLPOOL cpNodesPool; 102 struct tagDTD *dtd; 103 int doctypeParsed; 104 XMLENTITY userSubset; 105 } XMLPARSERRUNTIME, *LPXMLPARSERRUNTIME; 106 107 enum tagXMLERRCODE { 108 ERR_XMLP_MEMORY_ALLOC = 1, 109 ERR_XMLP_READER_FATAL, 110 ERR_XMLP_INVALID_TOKEN, 111 ERR_XMLP_INVALID_NAME, 112 ERR_XMLP_INVALID_END_TAG, 113 ERR_XMLP_UNDEF_ENTITY, 114 ERR_XMLP_WS_NOT_ALLOWED, 115 ERR_XMLP_WS_REQUIRED, 116 ERR_XMLP_UNCLOSED_TAG, 117 ERR_XMLP_EXPECTED_FOUND, 118 ERR_XMLP_EXPECTED_TOKEN, 119 ERR_XMLP_MULTIPLE_TOP, 120 ERR_XMLP_INVALID_AT_TOP, 121 ERR_XMLP_UNDEF_NSPREFIX, 122 ERR_XMLP_DUPL_ATTRIBUTE, 123 ERR_XMLP_ENCODING, 124 ERR_XMLP_UNSUP_ENCODING, 125 ERR_XMLP_INVALID_DECL, 126 ERR_XMLP_INVALID_ATT_VALUE, 127 ERR_XMLP_ABORT, 128 ERR_XMLP_ILLEGAL_CHAR, 129 ERR_XMLP_RECURSIVE_ENTITY_REF, 130 ERR_XMLP_IO, 131 ERR_XMLP_SWITCH_ENCODING, 132 ERR_XMLP_VALIDATION = 300 133 }; 134 typedef enum tagXMLERRCODE XMLERRCODE; 135 136 #define XMLFLAG_NAMESPACES 0x1 /* http://xml.org/sax/features/namespaces */ 137 #define XMLFLAG_NAMESPACE_PREFIXES 0x2 /* http://xml.org/sax/features/namespace-prefixes */ 138 #define XMLFLAG_EXTERNAL_GENERAL_ENTITIES 0x4 /* http://xml.org/sax/features/external-general-entities */ 139 #define XMLFLAG_PRESERVE_GENERAL_ENTITIES 0x8 140 #define XMLFLAG_UNDEF_GENERAL_ENTITIES 0x10 141 #define XMLFLAG_PRESERVE_WS_ATTRIBUTES 0x20 142 #define XMLFLAG_REPORT_DTD_EXT 0x40 143 #define XMLFLAG_VALIDATION_WARNINGS 0x80 144 #define XMLFLAG_SPLIT_LARGE_CONTENT 0x100 145 #define XMLFLAG_USE_SIMPLEPULL 0x200 146 147 typedef int (*XML_EVENT_HANDLER)(void *UserData); 148 typedef int (*XML_START_ELEMENT_HANDLER)(void *UserData, const XMLCH *uri, 149 const XMLCH *localName, const XMLCH *qName, 150 LPXMLVECTOR atts); 151 typedef int (*XML_END_ELEMENT_HANDLER)(void *UserData, const XMLCH *uri, 152 const XMLCH *localName, const XMLCH *qName); 153 typedef int (*XML_CHARACTERS_HANDLER)(void *UserData, const XMLCH *chars, int cbSize); 154 typedef int (*XML_PI_HANDLER)(void *UserData, const XMLCH *target, const XMLCH *data); 155 typedef int (*XML_START_DTD_HANDLER)(void *UserData, const XMLCH *name, 156 const XMLCH *publicId, const XMLCH *systemId, 157 int hasInternalSubset); 158 typedef int (*XML_XMLDECL_HANDLER)(void *UserData, const XMLCH *version, 159 const XMLCH *encoding, const XMLCH *standalone); 160 typedef int (*XML_RESOLVE_ENTITY_HANDLER)(void *UserData, LPXMLENTITY entity, 161 LPBUFFEREDISTREAM reader); 162 typedef int (*XML_SKIPPED_ENTITY_HANDLER)(void *UserData, const XMLCH *name); 163 typedef int (*XML_ENTITY_EVENT_HANDLER)(void *UserData, LPXMLENTITY entity); 164 typedef int (*XML_ATTRIBUTEDECL_HANDLER)(void *UserData, const XMLCH *eName, 165 const XMLCH *aName, int type, const XMLCH *typeStr, int valueDef, 166 const XMLCH *def); 167 typedef int (*XML_ELEMENTDECL_HANDLER)(void *UserData, const XMLCH *name, 168 void *contentModel); 169 typedef int (*XML_NOTATIONDECL_HANDLER)(void *UserData, const XMLCH *name, 170 const XMLCH *publicID, const XMLCH *systemID); 171 typedef XMLCH* (*XML_ENCODINGALIAS_HANDLER)(void *UserData, const XMLCH *enc); 172 173 typedef struct tagXMLPARSER 174 { 175 LPBUFFEREDISTREAM reader; 176 LPXMLPARSERRUNTIME prt; 177 XMLCH *DocumentElement; 178 XMLCH ErrorString[128]; 179 int ErrorCode; 180 int ErrorLine; 181 int ErrorColumn; 182 void *UserData; 183 unsigned long XMLFlags; 184 XML_EVENT_HANDLER startDocumentHandler; 185 XML_EVENT_HANDLER endDocumentHandler; 186 XML_EVENT_HANDLER startCDATAHandler; 187 XML_EVENT_HANDLER endCDATAHandler; 188 XML_EVENT_HANDLER endDTDHandler; 189 XML_CHARACTERS_HANDLER charactersHandler; 190 XML_CHARACTERS_HANDLER ignorableWhitespaceHandler; 191 XML_CHARACTERS_HANDLER commentHandler; 192 XML_ENCODINGALIAS_HANDLER encodingAliasHandler; 193 XML_START_ELEMENT_HANDLER startElementHandler; 194 XML_END_ELEMENT_HANDLER endElementHandler; 195 XML_PI_HANDLER processingInstructionHandler; 196 XML_START_DTD_HANDLER startDTDHandler; 197 XML_XMLDECL_HANDLER xmlDeclHandler; 198 XML_SKIPPED_ENTITY_HANDLER skippedEntityHandler; 199 XML_ENTITY_EVENT_HANDLER startEntityHandler; 200 XML_ENTITY_EVENT_HANDLER endEntityHandler; 201 XML_RESOLVE_ENTITY_HANDLER resolveEntityHandler; 202 XML_RESOLVE_ENTITY_HANDLER externalEntityParsedHandler; 203 XML_ATTRIBUTEDECL_HANDLER attributeDeclHandler; 204 XML_ELEMENTDECL_HANDLER elementDeclHandler; 205 XML_ENTITY_EVENT_HANDLER entityDeclHandler; 206 XML_NOTATIONDECL_HANDLER notationDeclHandler; 207 /*XML_ERROR_HANDLER */ void (*errorHandler)(struct tagXMLPARSER *parser); 208 } XMLPARSER, *LPXMLPARSER; 209 210 typedef void (*XML_ERROR_HANDLER)(LPXMLPARSER parser); 211 212 #ifndef XMLAPI 213 #define XMLAPI 214 #endif 215 216 #define XML_OK 0 217 #define XML_ABORT 1 218 219 #define _XMLParser_SetFlag(parser,flag,valBool) \ 220 ((valBool) ? (((LPXMLPARSER)parser)->XMLFlags |= (flag)) : \ 221 (((LPXMLPARSER)parser)->XMLFlags &= ~(flag)) ) 222 223 #define _XMLParser_GetFlag(parser,flag) \ 224 ((((LPXMLPARSER)parser)->XMLFlags & (flag)) == (flag)) 225 226 #define _XMLParser_AttIsDefaulted(att) (!(att->nameBuf.str)) 227 228 LPXMLPARSER XMLAPI XMLParser_Create(LPXMLPARSER *parser); 229 int XMLAPI XMLParser_Parse(LPXMLPARSER parser, LPFNINPUTSRC inputSrc, void *inputData, const XMLCH *encoding); 230 void XMLAPI XMLParser_Free(LPXMLPARSER parser); 231 LPXMLRUNTIMEATT XMLAPI XMLParser_GetNamedItem(LPXMLPARSER parser, const XMLCH *name); 232 XMLCH XMLAPI *XMLParser_GetSystemID(LPXMLPARSER parser); 233 XMLCH XMLAPI *XMLParser_GetPublicID(LPXMLPARSER parser); 234 XMLCH XMLAPI *XMLParser_GetPrefixMapping(LPXMLPARSER parser, const XMLCH *prefix); 235 int XMLAPI XMLParser_GetCurrentLine(LPXMLPARSER parser); 236 int XMLAPI XMLParser_GetCurrentColumn(LPXMLPARSER parser); 237 LPXMLENTITY XMLAPI XMLParser_GetCurrentEntity(LPXMLPARSER parser); 238 LPXMLENTITY XMLAPI XMLParser_SetExternalSubset(LPXMLPARSER parser, const XMLCH *publicID, const XMLCH *systemID); 239 XMLCH XMLAPI *XMLParser_GetVersionString(void); 240 int XMLAPI XMLParser_GetContextBytes(LPXMLPARSER parser, XMLCH **Bytes, int *cBytes); 241 int XMLAPI XMLNormalizeBuf(XMLCH *buf, int len); 242 int XMLAPI XMLIsNameStartChar(XMLCH *ch, int chSize); 243 int XMLAPI XMLIsNameChar(XMLCH *ch, int chSize); 244 int XMLAPI XMLParser_HasMoreEvents(LPXMLPARSER parser); 245 246 #ifdef __cplusplus 247 } 248 #endif /* __cplusplus */ 249 #endif /* PARSIFAL__H */ 250 251 252 253