blob: 0b8d22fe525efd6b5ce2c0a033cea170937fe0a8 [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 Veillardd692aa41999-02-28 21:54:31 +000034 xmlParserInputDeallocate free; /* function to deallocate the base */
Daniel Veillard1e346af1999-02-22 10:33:01 +000035} xmlParserInput;
36typedef xmlParserInput *xmlParserInputPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000037
Daniel Veillard1e346af1999-02-22 10:33:01 +000038typedef struct _xmlParserNodeInfo {
Daniel Veillard260a68f1998-08-13 03:39:55 +000039 const struct xmlNode* node;
40 /* Position & line # that text that created the node begins & ends on */
41 unsigned long begin_pos;
42 unsigned long begin_line;
43 unsigned long end_pos;
44 unsigned long end_line;
Daniel Veillard1e346af1999-02-22 10:33:01 +000045} _xmlParserNodeInfo;
46typedef _xmlParserNodeInfo xmlParserNodeInfo;
Daniel Veillard260a68f1998-08-13 03:39:55 +000047
48typedef struct xmlParserNodeInfoSeq {
49 unsigned long maximum;
50 unsigned long length;
51 xmlParserNodeInfo* buffer;
Daniel Veillard1e346af1999-02-22 10:33:01 +000052} _xmlParserNodeInfoSeq;
53typedef _xmlParserNodeInfoSeq xmlParserNodeInfoSeq;
54typedef xmlParserNodeInfoSeq *xmlParserNodeInfoSeqPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000055
Daniel Veillard1e346af1999-02-22 10:33:01 +000056typedef struct _xmlParserCtxt {
Daniel Veillard260a68f1998-08-13 03:39:55 +000057 struct xmlSAXHandler *sax; /* The SAX handler */
Daniel Veillard517752b1999-04-05 12:20:10 +000058 void *userData; /* the document being built */
59 xmlDocPtr myDoc; /* the document being built */
Daniel Veillard39a1f9a1999-01-17 19:11:59 +000060 int wellFormed; /* is the document well formed */
Daniel Veillard011b63c1999-06-02 17:44:04 +000061 int replaceEntities; /* shall we replace entities ? */
Daniel Veillard517752b1999-04-05 12:20:10 +000062 const CHAR *version; /* the XML version string */
63 const CHAR *encoding; /* encoding, if any */
64 int standalone; /* standalone document */
Daniel Veillard260a68f1998-08-13 03:39:55 +000065
66 /* Input stream stack */
67 xmlParserInputPtr input; /* Current input stream */
68 int inputNr; /* Number of current input streams */
69 int inputMax; /* Max number of input streams */
70 xmlParserInputPtr *inputTab; /* stack of inputs */
71
72 /* Node analysis stack */
73 xmlNodePtr node; /* Current parsed Node */
74 int nodeNr; /* Depth of the parsing stack */
75 int nodeMax; /* Max depth of the parsing stack */
76 xmlNodePtr *nodeTab; /* array of nodes */
77
78 int record_info; /* Whether node info should be kept */
79 xmlParserNodeInfoSeq node_seq; /* info about each node parsed */
Daniel Veillard1e346af1999-02-22 10:33:01 +000080} _xmlParserCtxt;
81typedef _xmlParserCtxt xmlParserCtxt;
82typedef xmlParserCtxt *xmlParserCtxtPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000083
84/*
85 * a SAX Locator.
86 */
87
88typedef struct xmlSAXLocator {
Daniel Veillard27d88741999-05-29 11:51:49 +000089 const CHAR *(*getPublicId)(void *ctx);
90 const CHAR *(*getSystemId)(void *ctx);
91 int (*getLineNumber)(void *ctx);
92 int (*getColumnNumber)(void *ctx);
Daniel Veillard1e346af1999-02-22 10:33:01 +000093} _xmlSAXLocator;
94typedef _xmlSAXLocator xmlSAXLocator;
95typedef xmlSAXLocator *xmlSAXLocatorPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000096
97/*
98 * a SAX Exception.
99 */
100
Daniel Veillard517752b1999-04-05 12:20:10 +0000101#include "entities.h"
102
Daniel Veillard27d88741999-05-29 11:51:49 +0000103typedef xmlParserInputPtr (*resolveEntitySAXFunc) (void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000104 const CHAR *publicId, const CHAR *systemId);
Daniel Veillard27d88741999-05-29 11:51:49 +0000105typedef void (*internalSubsetSAXFunc) (void *ctx, const CHAR *name,
Daniel Veillard517752b1999-04-05 12:20:10 +0000106 const CHAR *ExternalID, const CHAR *SystemID);
Daniel Veillard27d88741999-05-29 11:51:49 +0000107typedef xmlEntityPtr (*getEntitySAXFunc) (void *ctx,
Daniel Veillard517752b1999-04-05 12:20:10 +0000108 const CHAR *name);
Daniel Veillard27d88741999-05-29 11:51:49 +0000109typedef void (*entityDeclSAXFunc) (void *ctx,
Daniel Veillard517752b1999-04-05 12:20:10 +0000110 const CHAR *name, int type, const CHAR *publicId,
111 const CHAR *systemId, CHAR *content);
Daniel Veillard27d88741999-05-29 11:51:49 +0000112typedef void (*notationDeclSAXFunc)(void *ctx, const CHAR *name,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000113 const CHAR *publicId, const CHAR *systemId);
Daniel Veillard27d88741999-05-29 11:51:49 +0000114typedef void (*attributeDeclSAXFunc)(void *ctx, const CHAR *elem,
Daniel Veillard517752b1999-04-05 12:20:10 +0000115 const CHAR *name, int type, int def,
116 const CHAR *defaultValue, xmlEnumerationPtr tree);
Daniel Veillard27d88741999-05-29 11:51:49 +0000117typedef void (*elementDeclSAXFunc)(void *ctx, const CHAR *name,
Daniel Veillard517752b1999-04-05 12:20:10 +0000118 int type, xmlElementContentPtr content);
Daniel Veillard27d88741999-05-29 11:51:49 +0000119typedef void (*unparsedEntityDeclSAXFunc)(void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000120 const CHAR *name, const CHAR *publicId,
121 const CHAR *systemId, const CHAR *notationName);
Daniel Veillard27d88741999-05-29 11:51:49 +0000122typedef void (*setDocumentLocatorSAXFunc) (void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000123 xmlSAXLocatorPtr loc);
Daniel Veillard27d88741999-05-29 11:51:49 +0000124typedef void (*startDocumentSAXFunc) (void *ctx);
125typedef void (*endDocumentSAXFunc) (void *ctx);
126typedef void (*startElementSAXFunc) (void *ctx, const CHAR *name,
Daniel Veillard517752b1999-04-05 12:20:10 +0000127 const CHAR **atts);
Daniel Veillard27d88741999-05-29 11:51:49 +0000128typedef void (*endElementSAXFunc) (void *ctx, const CHAR *name);
129typedef void (*attributeSAXFunc) (void *ctx, const CHAR *name,
Daniel Veillard11e00581998-10-24 18:27:49 +0000130 const CHAR *value);
Daniel Veillard27d88741999-05-29 11:51:49 +0000131typedef void (*referenceSAXFunc) (void *ctx, const CHAR *name);
132typedef void (*charactersSAXFunc) (void *ctx, const CHAR *ch,
Daniel Veillard517752b1999-04-05 12:20:10 +0000133 int len);
Daniel Veillard27d88741999-05-29 11:51:49 +0000134typedef void (*ignorableWhitespaceSAXFunc) (void *ctx,
Daniel Veillard517752b1999-04-05 12:20:10 +0000135 const CHAR *ch, int len);
Daniel Veillard27d88741999-05-29 11:51:49 +0000136typedef void (*processingInstructionSAXFunc) (void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000137 const CHAR *target, const CHAR *data);
Daniel Veillard27d88741999-05-29 11:51:49 +0000138typedef void (*commentSAXFunc) (void *ctx, const CHAR *value);
139typedef void (*warningSAXFunc) (void *ctx, const char *msg, ...);
140typedef void (*errorSAXFunc) (void *ctx, const char *msg, ...);
141typedef void (*fatalErrorSAXFunc) (void *ctx, const char *msg, ...);
142typedef int (*isStandaloneSAXFunc) (void *ctx);
143typedef int (*hasInternalSubsetSAXFunc) (void *ctx);
144typedef int (*hasExternalSubsetSAXFunc) (void *ctx);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000145
146typedef struct xmlSAXHandler {
Daniel Veillard517752b1999-04-05 12:20:10 +0000147 internalSubsetSAXFunc internalSubset;
148 isStandaloneSAXFunc isStandalone;
149 hasInternalSubsetSAXFunc hasInternalSubset;
150 hasExternalSubsetSAXFunc hasExternalSubset;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000151 resolveEntitySAXFunc resolveEntity;
Daniel Veillard517752b1999-04-05 12:20:10 +0000152 getEntitySAXFunc getEntity;
153 entityDeclSAXFunc entityDecl;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000154 notationDeclSAXFunc notationDecl;
Daniel Veillard517752b1999-04-05 12:20:10 +0000155 attributeDeclSAXFunc attributeDecl;
156 elementDeclSAXFunc elementDecl;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000157 unparsedEntityDeclSAXFunc unparsedEntityDecl;
158 setDocumentLocatorSAXFunc setDocumentLocator;
159 startDocumentSAXFunc startDocument;
160 endDocumentSAXFunc endDocument;
161 startElementSAXFunc startElement;
162 endElementSAXFunc endElement;
Daniel Veillard517752b1999-04-05 12:20:10 +0000163 referenceSAXFunc reference;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000164 charactersSAXFunc characters;
165 ignorableWhitespaceSAXFunc ignorableWhitespace;
166 processingInstructionSAXFunc processingInstruction;
Daniel Veillard517752b1999-04-05 12:20:10 +0000167 commentSAXFunc comment;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000168 warningSAXFunc warning;
169 errorSAXFunc error;
170 fatalErrorSAXFunc fatalError;
Daniel Veillard1e346af1999-02-22 10:33:01 +0000171} xmlSAXHandler;
172typedef xmlSAXHandler *xmlSAXHandlerPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000173
174/*
175 * Global variables: just the SAX interface tables we are looking for full
Daniel Veillard14fff061999-06-22 21:49:07 +0000176 * reentrancy of the code and version infos.
Daniel Veillard260a68f1998-08-13 03:39:55 +0000177 */
Daniel Veillard14fff061999-06-22 21:49:07 +0000178extern const char *xmlParserVersion;
179
Daniel Veillard151b1b01998-09-23 00:49:46 +0000180extern xmlSAXLocator xmlDefaultSAXLocator;
181extern xmlSAXHandler xmlDefaultSAXHandler;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000182
Daniel Veillardccb09631998-10-27 06:21:04 +0000183#include "entities.h"
Daniel Veillardd109e371999-03-05 06:26:45 +0000184#include "xml-error.h"
Daniel Veillardccb09631998-10-27 06:21:04 +0000185
Daniel Veillard260a68f1998-08-13 03:39:55 +0000186/*
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000187 * CHAR handling
Daniel Veillard260a68f1998-08-13 03:39:55 +0000188 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000189CHAR *xmlStrdup(const CHAR *cur);
190CHAR *xmlStrndup(const CHAR *cur, int len);
191CHAR *xmlStrchr(const CHAR *str, CHAR val);
192int xmlStrcmp(const CHAR *str1, const CHAR *str2);
193int xmlStrncmp(const CHAR *str1, const CHAR *str2, int len);
194int xmlStrlen(const CHAR *str);
195CHAR *xmlStrcat(CHAR *cur, const CHAR *add);
196CHAR *xmlStrncat(CHAR *cur, const CHAR *add, int len);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000197
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000198/*
199 * Interfaces
200 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000201xmlDocPtr xmlParseDoc(CHAR *cur);
202xmlDocPtr xmlParseMemory(char *buffer, int size);
203xmlDocPtr xmlParseFile(const char *filename);
Daniel Veillard011b63c1999-06-02 17:44:04 +0000204int xmlSubstituteEntitiesDefault(int val);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000205
206/*
207 * Recovery mode
208 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000209xmlDocPtr xmlRecoverDoc(CHAR *cur);
210xmlDocPtr xmlRecoverMemory(char *buffer, int size);
211xmlDocPtr xmlRecoverFile(const char *filename);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000212
213/*
214 * Internal routines
215 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000216int xmlParseDocument(xmlParserCtxtPtr ctxt);
217xmlDocPtr xmlSAXParseDoc(xmlSAXHandlerPtr sax, CHAR *cur, int recovery);
218xmlDocPtr xmlSAXParseMemory(xmlSAXHandlerPtr sax, char *buffer,
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000219 int size, int recovery);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000220xmlDocPtr xmlSAXParseFile(xmlSAXHandlerPtr sax, const char *filename,
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000221 int recovery);
Daniel Veillard011b63c1999-06-02 17:44:04 +0000222xmlDtdPtr xmlParseDTD(const CHAR *ExternalID, const CHAR *SystemID);
223xmlDtdPtr xmlSAXParseDTD(xmlSAXHandlerPtr sax, const CHAR *ExternalID,
224 const CHAR *SystemID);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000225void xmlInitParserCtxt(xmlParserCtxtPtr ctxt);
226void xmlClearParserCtxt(xmlParserCtxtPtr ctxt);
227void xmlSetupParserForBuffer(xmlParserCtxtPtr ctxt, const CHAR* buffer,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000228 const char* filename);
229
Daniel Veillard1e346af1999-02-22 10:33:01 +0000230const xmlParserNodeInfo* xmlParserFindNodeInfo(const xmlParserCtxt* ctxt,
231 const xmlNode* node);
232void xmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
233void xmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000234unsigned long xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeq* seq,
235 const xmlNode* node);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000236void xmlParserAddNodeInfo(xmlParserCtxtPtr ctxt,
237 const xmlParserNodeInfo* info);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000238
Daniel Veillard1e346af1999-02-22 10:33:01 +0000239void xmlDefaultSAXHandlerInit(void);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000240#ifdef __cplusplus
241}
242#endif
243
244#endif /* __XML_PARSER_H__ */
245