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