blob: aaab58c4a37d9b5fbc3096b14c2e804392d47726 [file] [log] [blame]
Daniel Veillard260a68f1998-08-13 03:39:55 +00001/*
2 * parser.h : constants and stuff related to the XML parser.
3 *
4 * See Copyright for the status of this software.
5 *
Daniel Veillard39a1f9a1999-01-17 19:11:59 +00006 * Daniel.Veillard@w3.org
Daniel Veillard260a68f1998-08-13 03:39:55 +00007 */
8
9#ifndef __XML_PARSER_H__
10#define __XML_PARSER_H__
11
12#include "tree.h"
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18/*
19 * Constants.
20 */
21#define XML_DEFAULT_VERSION "1.0"
22
Daniel Veillardd692aa41999-02-28 21:54:31 +000023typedef void (* xmlParserInputDeallocate)(CHAR *);
Daniel Veillard260a68f1998-08-13 03:39:55 +000024typedef struct xmlParserInput {
25 const char *filename; /* The file analyzed, if any */
26 const CHAR *base; /* Base of the array to parse */
27 const CHAR *cur; /* Current char being parsed */
28 int line; /* Current line */
29 int col; /* Current column */
Daniel Veillardd692aa41999-02-28 21:54:31 +000030 xmlParserInputDeallocate free; /* function to deallocate the base */
Daniel Veillard1e346af1999-02-22 10:33:01 +000031} xmlParserInput;
32typedef xmlParserInput *xmlParserInputPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000033
Daniel Veillard1e346af1999-02-22 10:33:01 +000034typedef struct _xmlParserNodeInfo {
Daniel Veillard260a68f1998-08-13 03:39:55 +000035 const struct xmlNode* node;
36 /* Position & line # that text that created the node begins & ends on */
37 unsigned long begin_pos;
38 unsigned long begin_line;
39 unsigned long end_pos;
40 unsigned long end_line;
Daniel Veillard1e346af1999-02-22 10:33:01 +000041} _xmlParserNodeInfo;
42typedef _xmlParserNodeInfo xmlParserNodeInfo;
Daniel Veillard260a68f1998-08-13 03:39:55 +000043
44typedef struct xmlParserNodeInfoSeq {
45 unsigned long maximum;
46 unsigned long length;
47 xmlParserNodeInfo* buffer;
Daniel Veillard1e346af1999-02-22 10:33:01 +000048} _xmlParserNodeInfoSeq;
49typedef _xmlParserNodeInfoSeq xmlParserNodeInfoSeq;
50typedef xmlParserNodeInfoSeq *xmlParserNodeInfoSeqPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000051
Daniel Veillard1e346af1999-02-22 10:33:01 +000052typedef struct _xmlParserCtxt {
Daniel Veillard260a68f1998-08-13 03:39:55 +000053 struct xmlSAXHandler *sax; /* The SAX handler */
Daniel Veillard517752b1999-04-05 12:20:10 +000054 void *userData; /* the document being built */
55 xmlDocPtr myDoc; /* the document being built */
Daniel Veillard39a1f9a1999-01-17 19:11:59 +000056 int wellFormed; /* is the document well formed */
Daniel Veillard011b63c1999-06-02 17:44:04 +000057 int replaceEntities; /* shall we replace entities ? */
Daniel Veillard517752b1999-04-05 12:20:10 +000058 const CHAR *version; /* the XML version string */
59 const CHAR *encoding; /* encoding, if any */
60 int standalone; /* standalone document */
Daniel Veillard260a68f1998-08-13 03:39:55 +000061
62 /* Input stream stack */
63 xmlParserInputPtr input; /* Current input stream */
64 int inputNr; /* Number of current input streams */
65 int inputMax; /* Max number of input streams */
66 xmlParserInputPtr *inputTab; /* stack of inputs */
67
68 /* Node analysis stack */
69 xmlNodePtr node; /* Current parsed Node */
70 int nodeNr; /* Depth of the parsing stack */
71 int nodeMax; /* Max depth of the parsing stack */
72 xmlNodePtr *nodeTab; /* array of nodes */
73
74 int record_info; /* Whether node info should be kept */
75 xmlParserNodeInfoSeq node_seq; /* info about each node parsed */
Daniel Veillard1e346af1999-02-22 10:33:01 +000076} _xmlParserCtxt;
77typedef _xmlParserCtxt xmlParserCtxt;
78typedef xmlParserCtxt *xmlParserCtxtPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000079
80/*
81 * a SAX Locator.
82 */
83
84typedef struct xmlSAXLocator {
Daniel Veillard27d88741999-05-29 11:51:49 +000085 const CHAR *(*getPublicId)(void *ctx);
86 const CHAR *(*getSystemId)(void *ctx);
87 int (*getLineNumber)(void *ctx);
88 int (*getColumnNumber)(void *ctx);
Daniel Veillard1e346af1999-02-22 10:33:01 +000089} _xmlSAXLocator;
90typedef _xmlSAXLocator xmlSAXLocator;
91typedef xmlSAXLocator *xmlSAXLocatorPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000092
93/*
94 * a SAX Exception.
95 */
96
Daniel Veillard517752b1999-04-05 12:20:10 +000097#include "entities.h"
98
Daniel Veillard27d88741999-05-29 11:51:49 +000099typedef xmlParserInputPtr (*resolveEntitySAXFunc) (void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000100 const CHAR *publicId, const CHAR *systemId);
Daniel Veillard27d88741999-05-29 11:51:49 +0000101typedef void (*internalSubsetSAXFunc) (void *ctx, const CHAR *name,
Daniel Veillard517752b1999-04-05 12:20:10 +0000102 const CHAR *ExternalID, const CHAR *SystemID);
Daniel Veillard27d88741999-05-29 11:51:49 +0000103typedef xmlEntityPtr (*getEntitySAXFunc) (void *ctx,
Daniel Veillard517752b1999-04-05 12:20:10 +0000104 const CHAR *name);
Daniel Veillard27d88741999-05-29 11:51:49 +0000105typedef void (*entityDeclSAXFunc) (void *ctx,
Daniel Veillard517752b1999-04-05 12:20:10 +0000106 const CHAR *name, int type, const CHAR *publicId,
107 const CHAR *systemId, CHAR *content);
Daniel Veillard27d88741999-05-29 11:51:49 +0000108typedef void (*notationDeclSAXFunc)(void *ctx, const CHAR *name,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000109 const CHAR *publicId, const CHAR *systemId);
Daniel Veillard27d88741999-05-29 11:51:49 +0000110typedef void (*attributeDeclSAXFunc)(void *ctx, const CHAR *elem,
Daniel Veillard517752b1999-04-05 12:20:10 +0000111 const CHAR *name, int type, int def,
112 const CHAR *defaultValue, xmlEnumerationPtr tree);
Daniel Veillard27d88741999-05-29 11:51:49 +0000113typedef void (*elementDeclSAXFunc)(void *ctx, const CHAR *name,
Daniel Veillard517752b1999-04-05 12:20:10 +0000114 int type, xmlElementContentPtr content);
Daniel Veillard27d88741999-05-29 11:51:49 +0000115typedef void (*unparsedEntityDeclSAXFunc)(void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000116 const CHAR *name, const CHAR *publicId,
117 const CHAR *systemId, const CHAR *notationName);
Daniel Veillard27d88741999-05-29 11:51:49 +0000118typedef void (*setDocumentLocatorSAXFunc) (void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000119 xmlSAXLocatorPtr loc);
Daniel Veillard27d88741999-05-29 11:51:49 +0000120typedef void (*startDocumentSAXFunc) (void *ctx);
121typedef void (*endDocumentSAXFunc) (void *ctx);
122typedef void (*startElementSAXFunc) (void *ctx, const CHAR *name,
Daniel Veillard517752b1999-04-05 12:20:10 +0000123 const CHAR **atts);
Daniel Veillard27d88741999-05-29 11:51:49 +0000124typedef void (*endElementSAXFunc) (void *ctx, const CHAR *name);
125typedef void (*attributeSAXFunc) (void *ctx, const CHAR *name,
Daniel Veillard11e00581998-10-24 18:27:49 +0000126 const CHAR *value);
Daniel Veillard27d88741999-05-29 11:51:49 +0000127typedef void (*referenceSAXFunc) (void *ctx, const CHAR *name);
128typedef void (*charactersSAXFunc) (void *ctx, const CHAR *ch,
Daniel Veillard517752b1999-04-05 12:20:10 +0000129 int len);
Daniel Veillard27d88741999-05-29 11:51:49 +0000130typedef void (*ignorableWhitespaceSAXFunc) (void *ctx,
Daniel Veillard517752b1999-04-05 12:20:10 +0000131 const CHAR *ch, int len);
Daniel Veillard27d88741999-05-29 11:51:49 +0000132typedef void (*processingInstructionSAXFunc) (void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000133 const CHAR *target, const CHAR *data);
Daniel Veillard27d88741999-05-29 11:51:49 +0000134typedef void (*commentSAXFunc) (void *ctx, const CHAR *value);
135typedef void (*warningSAXFunc) (void *ctx, const char *msg, ...);
136typedef void (*errorSAXFunc) (void *ctx, const char *msg, ...);
137typedef void (*fatalErrorSAXFunc) (void *ctx, const char *msg, ...);
138typedef int (*isStandaloneSAXFunc) (void *ctx);
139typedef int (*hasInternalSubsetSAXFunc) (void *ctx);
140typedef int (*hasExternalSubsetSAXFunc) (void *ctx);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000141
142typedef struct xmlSAXHandler {
Daniel Veillard517752b1999-04-05 12:20:10 +0000143 internalSubsetSAXFunc internalSubset;
144 isStandaloneSAXFunc isStandalone;
145 hasInternalSubsetSAXFunc hasInternalSubset;
146 hasExternalSubsetSAXFunc hasExternalSubset;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000147 resolveEntitySAXFunc resolveEntity;
Daniel Veillard517752b1999-04-05 12:20:10 +0000148 getEntitySAXFunc getEntity;
149 entityDeclSAXFunc entityDecl;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000150 notationDeclSAXFunc notationDecl;
Daniel Veillard517752b1999-04-05 12:20:10 +0000151 attributeDeclSAXFunc attributeDecl;
152 elementDeclSAXFunc elementDecl;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000153 unparsedEntityDeclSAXFunc unparsedEntityDecl;
154 setDocumentLocatorSAXFunc setDocumentLocator;
155 startDocumentSAXFunc startDocument;
156 endDocumentSAXFunc endDocument;
157 startElementSAXFunc startElement;
158 endElementSAXFunc endElement;
Daniel Veillard517752b1999-04-05 12:20:10 +0000159 referenceSAXFunc reference;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000160 charactersSAXFunc characters;
161 ignorableWhitespaceSAXFunc ignorableWhitespace;
162 processingInstructionSAXFunc processingInstruction;
Daniel Veillard517752b1999-04-05 12:20:10 +0000163 commentSAXFunc comment;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000164 warningSAXFunc warning;
165 errorSAXFunc error;
166 fatalErrorSAXFunc fatalError;
Daniel Veillard1e346af1999-02-22 10:33:01 +0000167} xmlSAXHandler;
168typedef xmlSAXHandler *xmlSAXHandlerPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000169
170/*
171 * Global variables: just the SAX interface tables we are looking for full
172 * reentrancy of the code !
173 */
Daniel Veillard151b1b01998-09-23 00:49:46 +0000174extern xmlSAXLocator xmlDefaultSAXLocator;
175extern xmlSAXHandler xmlDefaultSAXHandler;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000176
Daniel Veillardccb09631998-10-27 06:21:04 +0000177#include "entities.h"
Daniel Veillardd109e371999-03-05 06:26:45 +0000178#include "xml-error.h"
Daniel Veillardccb09631998-10-27 06:21:04 +0000179
Daniel Veillard260a68f1998-08-13 03:39:55 +0000180/*
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000181 * CHAR handling
Daniel Veillard260a68f1998-08-13 03:39:55 +0000182 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000183CHAR *xmlStrdup(const CHAR *cur);
184CHAR *xmlStrndup(const CHAR *cur, int len);
185CHAR *xmlStrchr(const CHAR *str, CHAR val);
186int xmlStrcmp(const CHAR *str1, const CHAR *str2);
187int xmlStrncmp(const CHAR *str1, const CHAR *str2, int len);
188int xmlStrlen(const CHAR *str);
189CHAR *xmlStrcat(CHAR *cur, const CHAR *add);
190CHAR *xmlStrncat(CHAR *cur, const CHAR *add, int len);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000191
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000192/*
193 * Interfaces
194 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000195xmlDocPtr xmlParseDoc(CHAR *cur);
196xmlDocPtr xmlParseMemory(char *buffer, int size);
197xmlDocPtr xmlParseFile(const char *filename);
Daniel Veillard011b63c1999-06-02 17:44:04 +0000198int xmlSubstituteEntitiesDefault(int val);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000199
200/*
201 * Recovery mode
202 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000203xmlDocPtr xmlRecoverDoc(CHAR *cur);
204xmlDocPtr xmlRecoverMemory(char *buffer, int size);
205xmlDocPtr xmlRecoverFile(const char *filename);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000206
207/*
208 * Internal routines
209 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000210int xmlParseDocument(xmlParserCtxtPtr ctxt);
211xmlDocPtr xmlSAXParseDoc(xmlSAXHandlerPtr sax, CHAR *cur, int recovery);
212xmlDocPtr xmlSAXParseMemory(xmlSAXHandlerPtr sax, char *buffer,
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000213 int size, int recovery);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000214xmlDocPtr xmlSAXParseFile(xmlSAXHandlerPtr sax, const char *filename,
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000215 int recovery);
Daniel Veillard011b63c1999-06-02 17:44:04 +0000216xmlDtdPtr xmlParseDTD(const CHAR *ExternalID, const CHAR *SystemID);
217xmlDtdPtr xmlSAXParseDTD(xmlSAXHandlerPtr sax, const CHAR *ExternalID,
218 const CHAR *SystemID);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000219void xmlInitParserCtxt(xmlParserCtxtPtr ctxt);
220void xmlClearParserCtxt(xmlParserCtxtPtr ctxt);
221void xmlSetupParserForBuffer(xmlParserCtxtPtr ctxt, const CHAR* buffer,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000222 const char* filename);
223
Daniel Veillard1e346af1999-02-22 10:33:01 +0000224const xmlParserNodeInfo* xmlParserFindNodeInfo(const xmlParserCtxt* ctxt,
225 const xmlNode* node);
226void xmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
227void xmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000228unsigned long xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeq* seq,
229 const xmlNode* node);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000230void xmlParserAddNodeInfo(xmlParserCtxtPtr ctxt,
231 const xmlParserNodeInfo* info);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000232
Daniel Veillard1e346af1999-02-22 10:33:01 +0000233void xmlDefaultSAXHandlerInit(void);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000234#ifdef __cplusplus
235}
236#endif
237
238#endif /* __XML_PARSER_H__ */
239