blob: ca0835fc1af659ee328bc6865a8b02513321bd91 [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
23typedef struct xmlParserInput {
24 const char *filename; /* The file analyzed, if any */
25 const CHAR *base; /* Base of the array to parse */
26 const CHAR *cur; /* Current char being parsed */
27 int line; /* Current line */
28 int col; /* Current column */
Daniel Veillard1e346af1999-02-22 10:33:01 +000029} xmlParserInput;
30typedef xmlParserInput *xmlParserInputPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000031
Daniel Veillard1e346af1999-02-22 10:33:01 +000032typedef struct _xmlParserNodeInfo {
Daniel Veillard260a68f1998-08-13 03:39:55 +000033 const struct xmlNode* node;
34 /* Position & line # that text that created the node begins & ends on */
35 unsigned long begin_pos;
36 unsigned long begin_line;
37 unsigned long end_pos;
38 unsigned long end_line;
Daniel Veillard1e346af1999-02-22 10:33:01 +000039} _xmlParserNodeInfo;
40typedef _xmlParserNodeInfo xmlParserNodeInfo;
Daniel Veillard260a68f1998-08-13 03:39:55 +000041
42typedef struct xmlParserNodeInfoSeq {
43 unsigned long maximum;
44 unsigned long length;
45 xmlParserNodeInfo* buffer;
Daniel Veillard1e346af1999-02-22 10:33:01 +000046} _xmlParserNodeInfoSeq;
47typedef _xmlParserNodeInfoSeq xmlParserNodeInfoSeq;
48typedef xmlParserNodeInfoSeq *xmlParserNodeInfoSeqPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000049
Daniel Veillard1e346af1999-02-22 10:33:01 +000050typedef struct _xmlParserCtxt {
Daniel Veillard260a68f1998-08-13 03:39:55 +000051 struct xmlSAXHandler *sax; /* The SAX handler */
52 xmlDocPtr doc; /* the document being built */
Daniel Veillard39a1f9a1999-01-17 19:11:59 +000053 int wellFormed; /* is the document well formed */
Daniel Veillard260a68f1998-08-13 03:39:55 +000054
55 /* Input stream stack */
56 xmlParserInputPtr input; /* Current input stream */
57 int inputNr; /* Number of current input streams */
58 int inputMax; /* Max number of input streams */
59 xmlParserInputPtr *inputTab; /* stack of inputs */
60
61 /* Node analysis stack */
62 xmlNodePtr node; /* Current parsed Node */
63 int nodeNr; /* Depth of the parsing stack */
64 int nodeMax; /* Max depth of the parsing stack */
65 xmlNodePtr *nodeTab; /* array of nodes */
66
67 int record_info; /* Whether node info should be kept */
68 xmlParserNodeInfoSeq node_seq; /* info about each node parsed */
Daniel Veillard1e346af1999-02-22 10:33:01 +000069} _xmlParserCtxt;
70typedef _xmlParserCtxt xmlParserCtxt;
71typedef xmlParserCtxt *xmlParserCtxtPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000072
73/*
74 * a SAX Locator.
75 */
76
77typedef struct xmlSAXLocator {
78 const CHAR *(*getPublicId)(xmlParserCtxtPtr ctxt);
79 const CHAR *(*getSystemId)(xmlParserCtxtPtr ctxt);
80 int (*getLineNumber)(xmlParserCtxtPtr ctxt);
81 int (*getColumnNumber)(xmlParserCtxtPtr ctxt);
Daniel Veillard1e346af1999-02-22 10:33:01 +000082} _xmlSAXLocator;
83typedef _xmlSAXLocator xmlSAXLocator;
84typedef xmlSAXLocator *xmlSAXLocatorPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000085
86/*
87 * a SAX Exception.
88 */
89
90typedef xmlParserInputPtr (*resolveEntitySAXFunc) (xmlParserCtxtPtr ctxt,
91 const CHAR *publicId, const CHAR *systemId);
92typedef void (*notationDeclSAXFunc)(xmlParserCtxtPtr ctxt, const CHAR *name,
93 const CHAR *publicId, const CHAR *systemId);
94typedef void (*unparsedEntityDeclSAXFunc)(xmlParserCtxtPtr ctxt,
95 const CHAR *name, const CHAR *publicId,
96 const CHAR *systemId, const CHAR *notationName);
97typedef void (*setDocumentLocatorSAXFunc) (xmlParserCtxtPtr ctxt,
98 xmlSAXLocatorPtr loc);
99typedef void (*startDocumentSAXFunc) (xmlParserCtxtPtr ctxt);
100typedef void (*endDocumentSAXFunc) (xmlParserCtxtPtr ctxt);
101typedef void (*startElementSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name);
102typedef void (*endElementSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name);
Daniel Veillard11e00581998-10-24 18:27:49 +0000103typedef void (*attributeSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name,
104 const CHAR *value);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000105typedef void (*charactersSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *ch,
106 int start, int len);
107typedef void (*ignorableWhitespaceSAXFunc) (xmlParserCtxtPtr ctxt,
108 const CHAR *ch, int start, int len);
109typedef void (*processingInstructionSAXFunc) (xmlParserCtxtPtr ctxt,
110 const CHAR *target, const CHAR *data);
111typedef void (*warningSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...);
112typedef void (*errorSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...);
113typedef void (*fatalErrorSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...);
114
115typedef struct xmlSAXHandler {
116 resolveEntitySAXFunc resolveEntity;
117 notationDeclSAXFunc notationDecl;
118 unparsedEntityDeclSAXFunc unparsedEntityDecl;
119 setDocumentLocatorSAXFunc setDocumentLocator;
120 startDocumentSAXFunc startDocument;
121 endDocumentSAXFunc endDocument;
122 startElementSAXFunc startElement;
123 endElementSAXFunc endElement;
Daniel Veillard11e00581998-10-24 18:27:49 +0000124 attributeSAXFunc attribute;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000125 charactersSAXFunc characters;
126 ignorableWhitespaceSAXFunc ignorableWhitespace;
127 processingInstructionSAXFunc processingInstruction;
128 warningSAXFunc warning;
129 errorSAXFunc error;
130 fatalErrorSAXFunc fatalError;
Daniel Veillard1e346af1999-02-22 10:33:01 +0000131} xmlSAXHandler;
132typedef xmlSAXHandler *xmlSAXHandlerPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000133
134/*
135 * Global variables: just the SAX interface tables we are looking for full
136 * reentrancy of the code !
137 */
Daniel Veillard151b1b01998-09-23 00:49:46 +0000138extern xmlSAXLocator xmlDefaultSAXLocator;
139extern xmlSAXHandler xmlDefaultSAXHandler;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000140
Daniel Veillardccb09631998-10-27 06:21:04 +0000141#include "entities.h"
Daniel Veillard1e346af1999-02-22 10:33:01 +0000142#include "error.h"
Daniel Veillardccb09631998-10-27 06:21:04 +0000143
Daniel Veillard260a68f1998-08-13 03:39:55 +0000144/*
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000145 * CHAR handling
Daniel Veillard260a68f1998-08-13 03:39:55 +0000146 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000147CHAR *xmlStrdup(const CHAR *cur);
148CHAR *xmlStrndup(const CHAR *cur, int len);
149CHAR *xmlStrchr(const CHAR *str, CHAR val);
150int xmlStrcmp(const CHAR *str1, const CHAR *str2);
151int xmlStrncmp(const CHAR *str1, const CHAR *str2, int len);
152int xmlStrlen(const CHAR *str);
153CHAR *xmlStrcat(CHAR *cur, const CHAR *add);
154CHAR *xmlStrncat(CHAR *cur, const CHAR *add, int len);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000155
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000156/*
157 * Interfaces
158 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000159xmlDocPtr xmlParseDoc(CHAR *cur);
160xmlDocPtr xmlParseMemory(char *buffer, int size);
161xmlDocPtr xmlParseFile(const char *filename);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000162
163/*
164 * Recovery mode
165 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000166xmlDocPtr xmlRecoverDoc(CHAR *cur);
167xmlDocPtr xmlRecoverMemory(char *buffer, int size);
168xmlDocPtr xmlRecoverFile(const char *filename);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000169
170/*
171 * Internal routines
172 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000173int xmlParseDocument(xmlParserCtxtPtr ctxt);
174xmlDocPtr xmlSAXParseDoc(xmlSAXHandlerPtr sax, CHAR *cur, int recovery);
175xmlDocPtr xmlSAXParseMemory(xmlSAXHandlerPtr sax, char *buffer,
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000176 int size, int recovery);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000177xmlDocPtr xmlSAXParseFile(xmlSAXHandlerPtr sax, const char *filename,
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000178 int recovery);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000179void xmlInitParserCtxt(xmlParserCtxtPtr ctxt);
180void xmlClearParserCtxt(xmlParserCtxtPtr ctxt);
181void xmlSetupParserForBuffer(xmlParserCtxtPtr ctxt, const CHAR* buffer,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000182 const char* filename);
183
Daniel Veillard1e346af1999-02-22 10:33:01 +0000184const xmlParserNodeInfo* xmlParserFindNodeInfo(const xmlParserCtxt* ctxt,
185 const xmlNode* node);
186void xmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
187void xmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000188unsigned long xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeq* seq,
189 const xmlNode* node);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000190void xmlParserAddNodeInfo(xmlParserCtxtPtr ctxt,
191 const xmlParserNodeInfo* info);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000192
Daniel Veillard1e346af1999-02-22 10:33:01 +0000193void xmlDefaultSAXHandlerInit(void);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000194#ifdef __cplusplus
195}
196#endif
197
198#endif /* __XML_PARSER_H__ */
199