blob: 63fa549918db4412234d19b293519c2cc23b0688 [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 Veillardbe70ff71999-07-05 16:50:46 +000065 int html; /* are we parsing an HTML document */
Daniel Veillard260a68f1998-08-13 03:39:55 +000066
67 /* Input stream stack */
68 xmlParserInputPtr input; /* Current input stream */
69 int inputNr; /* Number of current input streams */
70 int inputMax; /* Max number of input streams */
71 xmlParserInputPtr *inputTab; /* stack of inputs */
72
73 /* Node analysis stack */
74 xmlNodePtr node; /* Current parsed Node */
75 int nodeNr; /* Depth of the parsing stack */
76 int nodeMax; /* Max depth of the parsing stack */
77 xmlNodePtr *nodeTab; /* array of nodes */
78
79 int record_info; /* Whether node info should be kept */
80 xmlParserNodeInfoSeq node_seq; /* info about each node parsed */
Daniel Veillard1e346af1999-02-22 10:33:01 +000081} _xmlParserCtxt;
82typedef _xmlParserCtxt xmlParserCtxt;
83typedef xmlParserCtxt *xmlParserCtxtPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000084
85/*
86 * a SAX Locator.
87 */
88
89typedef struct xmlSAXLocator {
Daniel Veillard27d88741999-05-29 11:51:49 +000090 const CHAR *(*getPublicId)(void *ctx);
91 const CHAR *(*getSystemId)(void *ctx);
92 int (*getLineNumber)(void *ctx);
93 int (*getColumnNumber)(void *ctx);
Daniel Veillard1e346af1999-02-22 10:33:01 +000094} _xmlSAXLocator;
95typedef _xmlSAXLocator xmlSAXLocator;
96typedef xmlSAXLocator *xmlSAXLocatorPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000097
98/*
99 * a SAX Exception.
100 */
101
Daniel Veillard517752b1999-04-05 12:20:10 +0000102#include "entities.h"
103
Daniel Veillard27d88741999-05-29 11:51:49 +0000104typedef xmlParserInputPtr (*resolveEntitySAXFunc) (void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000105 const CHAR *publicId, const CHAR *systemId);
Daniel Veillard27d88741999-05-29 11:51:49 +0000106typedef void (*internalSubsetSAXFunc) (void *ctx, const CHAR *name,
Daniel Veillard517752b1999-04-05 12:20:10 +0000107 const CHAR *ExternalID, const CHAR *SystemID);
Daniel Veillard27d88741999-05-29 11:51:49 +0000108typedef xmlEntityPtr (*getEntitySAXFunc) (void *ctx,
Daniel Veillard517752b1999-04-05 12:20:10 +0000109 const CHAR *name);
Daniel Veillard27d88741999-05-29 11:51:49 +0000110typedef void (*entityDeclSAXFunc) (void *ctx,
Daniel Veillard517752b1999-04-05 12:20:10 +0000111 const CHAR *name, int type, const CHAR *publicId,
112 const CHAR *systemId, CHAR *content);
Daniel Veillard27d88741999-05-29 11:51:49 +0000113typedef void (*notationDeclSAXFunc)(void *ctx, const CHAR *name,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000114 const CHAR *publicId, const CHAR *systemId);
Daniel Veillard27d88741999-05-29 11:51:49 +0000115typedef void (*attributeDeclSAXFunc)(void *ctx, const CHAR *elem,
Daniel Veillard517752b1999-04-05 12:20:10 +0000116 const CHAR *name, int type, int def,
117 const CHAR *defaultValue, xmlEnumerationPtr tree);
Daniel Veillard27d88741999-05-29 11:51:49 +0000118typedef void (*elementDeclSAXFunc)(void *ctx, const CHAR *name,
Daniel Veillard517752b1999-04-05 12:20:10 +0000119 int type, xmlElementContentPtr content);
Daniel Veillard27d88741999-05-29 11:51:49 +0000120typedef void (*unparsedEntityDeclSAXFunc)(void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000121 const CHAR *name, const CHAR *publicId,
122 const CHAR *systemId, const CHAR *notationName);
Daniel Veillard27d88741999-05-29 11:51:49 +0000123typedef void (*setDocumentLocatorSAXFunc) (void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000124 xmlSAXLocatorPtr loc);
Daniel Veillard27d88741999-05-29 11:51:49 +0000125typedef void (*startDocumentSAXFunc) (void *ctx);
126typedef void (*endDocumentSAXFunc) (void *ctx);
127typedef void (*startElementSAXFunc) (void *ctx, const CHAR *name,
Daniel Veillard517752b1999-04-05 12:20:10 +0000128 const CHAR **atts);
Daniel Veillard27d88741999-05-29 11:51:49 +0000129typedef void (*endElementSAXFunc) (void *ctx, const CHAR *name);
130typedef void (*attributeSAXFunc) (void *ctx, const CHAR *name,
Daniel Veillard11e00581998-10-24 18:27:49 +0000131 const CHAR *value);
Daniel Veillard27d88741999-05-29 11:51:49 +0000132typedef void (*referenceSAXFunc) (void *ctx, const CHAR *name);
133typedef void (*charactersSAXFunc) (void *ctx, const CHAR *ch,
Daniel Veillard517752b1999-04-05 12:20:10 +0000134 int len);
Daniel Veillard27d88741999-05-29 11:51:49 +0000135typedef void (*ignorableWhitespaceSAXFunc) (void *ctx,
Daniel Veillard517752b1999-04-05 12:20:10 +0000136 const CHAR *ch, int len);
Daniel Veillard27d88741999-05-29 11:51:49 +0000137typedef void (*processingInstructionSAXFunc) (void *ctx,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000138 const CHAR *target, const CHAR *data);
Daniel Veillard27d88741999-05-29 11:51:49 +0000139typedef void (*commentSAXFunc) (void *ctx, const CHAR *value);
140typedef void (*warningSAXFunc) (void *ctx, const char *msg, ...);
141typedef void (*errorSAXFunc) (void *ctx, const char *msg, ...);
142typedef void (*fatalErrorSAXFunc) (void *ctx, const char *msg, ...);
143typedef int (*isStandaloneSAXFunc) (void *ctx);
144typedef int (*hasInternalSubsetSAXFunc) (void *ctx);
145typedef int (*hasExternalSubsetSAXFunc) (void *ctx);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000146
147typedef struct xmlSAXHandler {
Daniel Veillard517752b1999-04-05 12:20:10 +0000148 internalSubsetSAXFunc internalSubset;
149 isStandaloneSAXFunc isStandalone;
150 hasInternalSubsetSAXFunc hasInternalSubset;
151 hasExternalSubsetSAXFunc hasExternalSubset;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000152 resolveEntitySAXFunc resolveEntity;
Daniel Veillard517752b1999-04-05 12:20:10 +0000153 getEntitySAXFunc getEntity;
154 entityDeclSAXFunc entityDecl;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000155 notationDeclSAXFunc notationDecl;
Daniel Veillard517752b1999-04-05 12:20:10 +0000156 attributeDeclSAXFunc attributeDecl;
157 elementDeclSAXFunc elementDecl;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000158 unparsedEntityDeclSAXFunc unparsedEntityDecl;
159 setDocumentLocatorSAXFunc setDocumentLocator;
160 startDocumentSAXFunc startDocument;
161 endDocumentSAXFunc endDocument;
162 startElementSAXFunc startElement;
163 endElementSAXFunc endElement;
Daniel Veillard517752b1999-04-05 12:20:10 +0000164 referenceSAXFunc reference;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000165 charactersSAXFunc characters;
166 ignorableWhitespaceSAXFunc ignorableWhitespace;
167 processingInstructionSAXFunc processingInstruction;
Daniel Veillard517752b1999-04-05 12:20:10 +0000168 commentSAXFunc comment;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000169 warningSAXFunc warning;
170 errorSAXFunc error;
171 fatalErrorSAXFunc fatalError;
Daniel Veillard1e346af1999-02-22 10:33:01 +0000172} xmlSAXHandler;
173typedef xmlSAXHandler *xmlSAXHandlerPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000174
175/*
176 * Global variables: just the SAX interface tables we are looking for full
Daniel Veillard14fff061999-06-22 21:49:07 +0000177 * reentrancy of the code and version infos.
Daniel Veillard260a68f1998-08-13 03:39:55 +0000178 */
Daniel Veillard14fff061999-06-22 21:49:07 +0000179extern const char *xmlParserVersion;
180
Daniel Veillard151b1b01998-09-23 00:49:46 +0000181extern xmlSAXLocator xmlDefaultSAXLocator;
182extern xmlSAXHandler xmlDefaultSAXHandler;
Daniel Veillardbe70ff71999-07-05 16:50:46 +0000183extern xmlSAXHandler htmlDefaultSAXHandler;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000184
Daniel Veillardccb09631998-10-27 06:21:04 +0000185#include "entities.h"
Daniel Veillardd109e371999-03-05 06:26:45 +0000186#include "xml-error.h"
Daniel Veillardccb09631998-10-27 06:21:04 +0000187
Daniel Veillard260a68f1998-08-13 03:39:55 +0000188/*
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000189 * CHAR handling
Daniel Veillard260a68f1998-08-13 03:39:55 +0000190 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000191CHAR *xmlStrdup(const CHAR *cur);
192CHAR *xmlStrndup(const CHAR *cur, int len);
193CHAR *xmlStrchr(const CHAR *str, CHAR val);
194int xmlStrcmp(const CHAR *str1, const CHAR *str2);
195int xmlStrncmp(const CHAR *str1, const CHAR *str2, int len);
196int xmlStrlen(const CHAR *str);
197CHAR *xmlStrcat(CHAR *cur, const CHAR *add);
198CHAR *xmlStrncat(CHAR *cur, const CHAR *add, int len);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000199
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000200/*
201 * Interfaces
202 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000203xmlDocPtr xmlParseDoc(CHAR *cur);
204xmlDocPtr xmlParseMemory(char *buffer, int size);
205xmlDocPtr xmlParseFile(const char *filename);
Daniel Veillard011b63c1999-06-02 17:44:04 +0000206int xmlSubstituteEntitiesDefault(int val);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000207
208/*
209 * Recovery mode
210 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000211xmlDocPtr xmlRecoverDoc(CHAR *cur);
212xmlDocPtr xmlRecoverMemory(char *buffer, int size);
213xmlDocPtr xmlRecoverFile(const char *filename);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000214
215/*
216 * Internal routines
217 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000218int xmlParseDocument(xmlParserCtxtPtr ctxt);
219xmlDocPtr xmlSAXParseDoc(xmlSAXHandlerPtr sax, CHAR *cur, int recovery);
220xmlDocPtr xmlSAXParseMemory(xmlSAXHandlerPtr sax, char *buffer,
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000221 int size, int recovery);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000222xmlDocPtr xmlSAXParseFile(xmlSAXHandlerPtr sax, const char *filename,
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000223 int recovery);
Daniel Veillard011b63c1999-06-02 17:44:04 +0000224xmlDtdPtr xmlParseDTD(const CHAR *ExternalID, const CHAR *SystemID);
225xmlDtdPtr xmlSAXParseDTD(xmlSAXHandlerPtr sax, const CHAR *ExternalID,
226 const CHAR *SystemID);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000227void xmlInitParserCtxt(xmlParserCtxtPtr ctxt);
228void xmlClearParserCtxt(xmlParserCtxtPtr ctxt);
229void xmlSetupParserForBuffer(xmlParserCtxtPtr ctxt, const CHAR* buffer,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000230 const char* filename);
231
Daniel Veillard1e346af1999-02-22 10:33:01 +0000232const xmlParserNodeInfo* xmlParserFindNodeInfo(const xmlParserCtxt* ctxt,
233 const xmlNode* node);
234void xmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
235void xmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000236unsigned long xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeq* seq,
237 const xmlNode* node);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000238void xmlParserAddNodeInfo(xmlParserCtxtPtr ctxt,
239 const xmlParserNodeInfo* info);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000240
Daniel Veillard1e346af1999-02-22 10:33:01 +0000241void xmlDefaultSAXHandlerInit(void);
Daniel Veillardbe70ff71999-07-05 16:50:46 +0000242void htmlDefaultSAXHandlerInit(void);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000243#ifdef __cplusplus
244}
245#endif
246
247#endif /* __XML_PARSER_H__ */
248