blob: 43d183e0315f4f1e90a46a2fdef7099be866b7c7 [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"
Daniel Veillard14fff061999-06-22 21:49:07 +000013#include "xmlIO.h"
Daniel Veillard260a68f1998-08-13 03:39:55 +000014
15#ifdef __cplusplus
16extern "C" {
17#endif
18
19/*
20 * Constants.
21 */
22#define XML_DEFAULT_VERSION "1.0"
23
Daniel Veillardd692aa41999-02-28 21:54:31 +000024typedef void (* xmlParserInputDeallocate)(CHAR *);
Daniel Veillard260a68f1998-08-13 03:39:55 +000025typedef struct xmlParserInput {
Daniel Veillard14fff061999-06-22 21:49:07 +000026 /* Input buffer */
27 xmlParserInputBufferPtr buf; /* UTF-8 encoded buffer */
28
Daniel Veillard260a68f1998-08-13 03:39:55 +000029 const char *filename; /* The file analyzed, if any */
30 const CHAR *base; /* Base of the array to parse */
31 const CHAR *cur; /* Current char being parsed */
32 int line; /* Current line */
33 int col; /* Current column */
Daniel Veillarde2d034d1999-07-27 19:52:06 +000034 int consumed; /* How many CHARs were already consumed */
Daniel Veillardd692aa41999-02-28 21:54:31 +000035 xmlParserInputDeallocate free; /* function to deallocate the base */
Daniel Veillard1e346af1999-02-22 10:33:01 +000036} xmlParserInput;
37typedef xmlParserInput *xmlParserInputPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000038
Daniel Veillard1e346af1999-02-22 10:33:01 +000039typedef struct _xmlParserNodeInfo {
Daniel Veillard260a68f1998-08-13 03:39:55 +000040 const struct xmlNode* node;
41 /* Position & line # that text that created the node begins & ends on */
42 unsigned long begin_pos;
43 unsigned long begin_line;
44 unsigned long end_pos;
45 unsigned long end_line;
Daniel Veillard1e346af1999-02-22 10:33:01 +000046} _xmlParserNodeInfo;
47typedef _xmlParserNodeInfo xmlParserNodeInfo;
Daniel Veillard260a68f1998-08-13 03:39:55 +000048
49typedef struct xmlParserNodeInfoSeq {
50 unsigned long maximum;
51 unsigned long length;
52 xmlParserNodeInfo* buffer;
Daniel Veillard1e346af1999-02-22 10:33:01 +000053} _xmlParserNodeInfoSeq;
54typedef _xmlParserNodeInfoSeq xmlParserNodeInfoSeq;
55typedef xmlParserNodeInfoSeq *xmlParserNodeInfoSeqPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000056
Daniel Veillard1e346af1999-02-22 10:33:01 +000057typedef struct _xmlParserCtxt {
Daniel Veillard260a68f1998-08-13 03:39:55 +000058 struct xmlSAXHandler *sax; /* The SAX handler */
Daniel Veillard517752b1999-04-05 12:20:10 +000059 void *userData; /* the document being built */
60 xmlDocPtr myDoc; /* the document being built */
Daniel Veillard39a1f9a1999-01-17 19:11:59 +000061 int wellFormed; /* is the document well formed */
Daniel Veillard011b63c1999-06-02 17:44:04 +000062 int replaceEntities; /* shall we replace entities ? */
Daniel Veillard517752b1999-04-05 12:20:10 +000063 const CHAR *version; /* the XML version string */
64 const CHAR *encoding; /* encoding, if any */
65 int standalone; /* standalone document */
Daniel Veillardbe70ff71999-07-05 16:50:46 +000066 int html; /* are we parsing an HTML document */
Daniel Veillard260a68f1998-08-13 03:39:55 +000067
68 /* Input stream stack */
69 xmlParserInputPtr input; /* Current input stream */
70 int inputNr; /* Number of current input streams */
71 int inputMax; /* Max number of input streams */
72 xmlParserInputPtr *inputTab; /* stack of inputs */
73
74 /* Node analysis stack */
75 xmlNodePtr node; /* Current parsed Node */
76 int nodeNr; /* Depth of the parsing stack */
77 int nodeMax; /* Max depth of the parsing stack */
78 xmlNodePtr *nodeTab; /* array of nodes */
79
80 int record_info; /* Whether node info should be kept */
81 xmlParserNodeInfoSeq node_seq; /* info about each node parsed */
Daniel Veillard1e346af1999-02-22 10:33:01 +000082} _xmlParserCtxt;
83typedef _xmlParserCtxt xmlParserCtxt;
84typedef xmlParserCtxt *xmlParserCtxtPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000085
86/*
87 * a SAX Locator.
88 */
89
90typedef struct xmlSAXLocator {
Daniel Veillard27d88741999-05-29 11:51:49 +000091 const CHAR *(*getPublicId)(void *ctx);
92 const CHAR *(*getSystemId)(void *ctx);
93 int (*getLineNumber)(void *ctx);
94 int (*getColumnNumber)(void *ctx);
Daniel Veillard1e346af1999-02-22 10:33:01 +000095} _xmlSAXLocator;
96typedef _xmlSAXLocator xmlSAXLocator;
97typedef xmlSAXLocator *xmlSAXLocatorPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000098
99/*
100 * a SAX Exception.
101 */
102
Daniel Veillard517752b1999-04-05 12:20:10 +0000103#include "entities.h"
104
Daniel Veillard27d88741999-05-29 11:51:49 +0000105typedef xmlParserInputPtr (*resolveEntitySAXFunc) (void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000106 const CHAR *publicId, const CHAR *systemId);
Daniel Veillard27d88741999-05-29 11:51:49 +0000107typedef void (*internalSubsetSAXFunc) (void *ctx, const CHAR *name,
Daniel Veillard517752b1999-04-05 12:20:10 +0000108 const CHAR *ExternalID, const CHAR *SystemID);
Daniel Veillard27d88741999-05-29 11:51:49 +0000109typedef xmlEntityPtr (*getEntitySAXFunc) (void *ctx,
Daniel Veillard517752b1999-04-05 12:20:10 +0000110 const CHAR *name);
Daniel Veillard27d88741999-05-29 11:51:49 +0000111typedef void (*entityDeclSAXFunc) (void *ctx,
Daniel Veillard517752b1999-04-05 12:20:10 +0000112 const CHAR *name, int type, const CHAR *publicId,
113 const CHAR *systemId, CHAR *content);
Daniel Veillard27d88741999-05-29 11:51:49 +0000114typedef void (*notationDeclSAXFunc)(void *ctx, const CHAR *name,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000115 const CHAR *publicId, const CHAR *systemId);
Daniel Veillard27d88741999-05-29 11:51:49 +0000116typedef void (*attributeDeclSAXFunc)(void *ctx, const CHAR *elem,
Daniel Veillard517752b1999-04-05 12:20:10 +0000117 const CHAR *name, int type, int def,
118 const CHAR *defaultValue, xmlEnumerationPtr tree);
Daniel Veillard27d88741999-05-29 11:51:49 +0000119typedef void (*elementDeclSAXFunc)(void *ctx, const CHAR *name,
Daniel Veillard517752b1999-04-05 12:20:10 +0000120 int type, xmlElementContentPtr content);
Daniel Veillard27d88741999-05-29 11:51:49 +0000121typedef void (*unparsedEntityDeclSAXFunc)(void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000122 const CHAR *name, const CHAR *publicId,
123 const CHAR *systemId, const CHAR *notationName);
Daniel Veillard27d88741999-05-29 11:51:49 +0000124typedef void (*setDocumentLocatorSAXFunc) (void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000125 xmlSAXLocatorPtr loc);
Daniel Veillard27d88741999-05-29 11:51:49 +0000126typedef void (*startDocumentSAXFunc) (void *ctx);
127typedef void (*endDocumentSAXFunc) (void *ctx);
128typedef void (*startElementSAXFunc) (void *ctx, const CHAR *name,
Daniel Veillard517752b1999-04-05 12:20:10 +0000129 const CHAR **atts);
Daniel Veillard27d88741999-05-29 11:51:49 +0000130typedef void (*endElementSAXFunc) (void *ctx, const CHAR *name);
131typedef void (*attributeSAXFunc) (void *ctx, const CHAR *name,
Daniel Veillard11e00581998-10-24 18:27:49 +0000132 const CHAR *value);
Daniel Veillard27d88741999-05-29 11:51:49 +0000133typedef void (*referenceSAXFunc) (void *ctx, const CHAR *name);
134typedef void (*charactersSAXFunc) (void *ctx, const CHAR *ch,
Daniel Veillard517752b1999-04-05 12:20:10 +0000135 int len);
Daniel Veillard27d88741999-05-29 11:51:49 +0000136typedef void (*ignorableWhitespaceSAXFunc) (void *ctx,
Daniel Veillard517752b1999-04-05 12:20:10 +0000137 const CHAR *ch, int len);
Daniel Veillard27d88741999-05-29 11:51:49 +0000138typedef void (*processingInstructionSAXFunc) (void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000139 const CHAR *target, const CHAR *data);
Daniel Veillard27d88741999-05-29 11:51:49 +0000140typedef void (*commentSAXFunc) (void *ctx, const CHAR *value);
141typedef void (*warningSAXFunc) (void *ctx, const char *msg, ...);
142typedef void (*errorSAXFunc) (void *ctx, const char *msg, ...);
143typedef void (*fatalErrorSAXFunc) (void *ctx, const char *msg, ...);
144typedef int (*isStandaloneSAXFunc) (void *ctx);
145typedef int (*hasInternalSubsetSAXFunc) (void *ctx);
146typedef int (*hasExternalSubsetSAXFunc) (void *ctx);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000147
148typedef struct xmlSAXHandler {
Daniel Veillard517752b1999-04-05 12:20:10 +0000149 internalSubsetSAXFunc internalSubset;
150 isStandaloneSAXFunc isStandalone;
151 hasInternalSubsetSAXFunc hasInternalSubset;
152 hasExternalSubsetSAXFunc hasExternalSubset;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000153 resolveEntitySAXFunc resolveEntity;
Daniel Veillard517752b1999-04-05 12:20:10 +0000154 getEntitySAXFunc getEntity;
155 entityDeclSAXFunc entityDecl;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000156 notationDeclSAXFunc notationDecl;
Daniel Veillard517752b1999-04-05 12:20:10 +0000157 attributeDeclSAXFunc attributeDecl;
158 elementDeclSAXFunc elementDecl;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000159 unparsedEntityDeclSAXFunc unparsedEntityDecl;
160 setDocumentLocatorSAXFunc setDocumentLocator;
161 startDocumentSAXFunc startDocument;
162 endDocumentSAXFunc endDocument;
163 startElementSAXFunc startElement;
164 endElementSAXFunc endElement;
Daniel Veillard517752b1999-04-05 12:20:10 +0000165 referenceSAXFunc reference;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000166 charactersSAXFunc characters;
167 ignorableWhitespaceSAXFunc ignorableWhitespace;
168 processingInstructionSAXFunc processingInstruction;
Daniel Veillard517752b1999-04-05 12:20:10 +0000169 commentSAXFunc comment;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000170 warningSAXFunc warning;
171 errorSAXFunc error;
172 fatalErrorSAXFunc fatalError;
Daniel Veillard1e346af1999-02-22 10:33:01 +0000173} xmlSAXHandler;
174typedef xmlSAXHandler *xmlSAXHandlerPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000175
176/*
177 * Global variables: just the SAX interface tables we are looking for full
Daniel Veillard14fff061999-06-22 21:49:07 +0000178 * reentrancy of the code and version infos.
Daniel Veillard260a68f1998-08-13 03:39:55 +0000179 */
Daniel Veillard14fff061999-06-22 21:49:07 +0000180extern const char *xmlParserVersion;
181
Daniel Veillard151b1b01998-09-23 00:49:46 +0000182extern xmlSAXLocator xmlDefaultSAXLocator;
183extern xmlSAXHandler xmlDefaultSAXHandler;
Daniel Veillardbe70ff71999-07-05 16:50:46 +0000184extern xmlSAXHandler htmlDefaultSAXHandler;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000185
Daniel Veillardccb09631998-10-27 06:21:04 +0000186#include "entities.h"
Daniel Veillardd109e371999-03-05 06:26:45 +0000187#include "xml-error.h"
Daniel Veillardccb09631998-10-27 06:21:04 +0000188
Daniel Veillard260a68f1998-08-13 03:39:55 +0000189/*
Daniel Veillarde2d034d1999-07-27 19:52:06 +0000190 * Input functions
191 */
192
193int xmlParserInputRead(xmlParserInputPtr in, int len);
194int xmlParserInputGrow(xmlParserInputPtr in, int len);
195
196/*
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000197 * CHAR handling
Daniel Veillard260a68f1998-08-13 03:39:55 +0000198 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000199CHAR *xmlStrdup(const CHAR *cur);
200CHAR *xmlStrndup(const CHAR *cur, int len);
Daniel Veillard1566d3a1999-07-15 14:24:29 +0000201CHAR *xmlStrsub(const CHAR *str, int start, int len);
202const CHAR *xmlStrchr(const CHAR *str, CHAR val);
203const CHAR *xmlStrstr(const CHAR *str, CHAR *val);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000204int xmlStrcmp(const CHAR *str1, const CHAR *str2);
205int xmlStrncmp(const CHAR *str1, const CHAR *str2, int len);
206int xmlStrlen(const CHAR *str);
207CHAR *xmlStrcat(CHAR *cur, const CHAR *add);
208CHAR *xmlStrncat(CHAR *cur, const CHAR *add, int len);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000209
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000210/*
211 * Interfaces
212 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000213xmlDocPtr xmlParseDoc(CHAR *cur);
214xmlDocPtr xmlParseMemory(char *buffer, int size);
215xmlDocPtr xmlParseFile(const char *filename);
Daniel Veillard011b63c1999-06-02 17:44:04 +0000216int xmlSubstituteEntitiesDefault(int val);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000217
218/*
219 * Recovery mode
220 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000221xmlDocPtr xmlRecoverDoc(CHAR *cur);
222xmlDocPtr xmlRecoverMemory(char *buffer, int size);
223xmlDocPtr xmlRecoverFile(const char *filename);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000224
225/*
226 * Internal routines
227 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000228int xmlParseDocument(xmlParserCtxtPtr ctxt);
229xmlDocPtr xmlSAXParseDoc(xmlSAXHandlerPtr sax, CHAR *cur, int recovery);
230xmlDocPtr xmlSAXParseMemory(xmlSAXHandlerPtr sax, char *buffer,
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000231 int size, int recovery);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000232xmlDocPtr xmlSAXParseFile(xmlSAXHandlerPtr sax, const char *filename,
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000233 int recovery);
Daniel Veillard011b63c1999-06-02 17:44:04 +0000234xmlDtdPtr xmlParseDTD(const CHAR *ExternalID, const CHAR *SystemID);
235xmlDtdPtr xmlSAXParseDTD(xmlSAXHandlerPtr sax, const CHAR *ExternalID,
236 const CHAR *SystemID);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000237void xmlInitParserCtxt(xmlParserCtxtPtr ctxt);
238void xmlClearParserCtxt(xmlParserCtxtPtr ctxt);
239void xmlSetupParserForBuffer(xmlParserCtxtPtr ctxt, const CHAR* buffer,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000240 const char* filename);
241
Daniel Veillard1e346af1999-02-22 10:33:01 +0000242const xmlParserNodeInfo* xmlParserFindNodeInfo(const xmlParserCtxt* ctxt,
243 const xmlNode* node);
244void xmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
245void xmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000246unsigned long xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeq* seq,
247 const xmlNode* node);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000248void xmlParserAddNodeInfo(xmlParserCtxtPtr ctxt,
249 const xmlParserNodeInfo* info);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000250
Daniel Veillard1e346af1999-02-22 10:33:01 +0000251void xmlDefaultSAXHandlerInit(void);
Daniel Veillardbe70ff71999-07-05 16:50:46 +0000252void htmlDefaultSAXHandlerInit(void);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000253#ifdef __cplusplus
254}
255#endif
256
257#endif /* __XML_PARSER_H__ */
258