blob: 3dc84453032bf8eb58ef2a7140b9a3fabd162cd1 [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 */
54 xmlDocPtr doc; /* the document being built */
Daniel Veillard39a1f9a1999-01-17 19:11:59 +000055 int wellFormed; /* is the document well formed */
Daniel Veillard260a68f1998-08-13 03:39:55 +000056
57 /* Input stream stack */
58 xmlParserInputPtr input; /* Current input stream */
59 int inputNr; /* Number of current input streams */
60 int inputMax; /* Max number of input streams */
61 xmlParserInputPtr *inputTab; /* stack of inputs */
62
63 /* Node analysis stack */
64 xmlNodePtr node; /* Current parsed Node */
65 int nodeNr; /* Depth of the parsing stack */
66 int nodeMax; /* Max depth of the parsing stack */
67 xmlNodePtr *nodeTab; /* array of nodes */
68
69 int record_info; /* Whether node info should be kept */
70 xmlParserNodeInfoSeq node_seq; /* info about each node parsed */
Daniel Veillard1e346af1999-02-22 10:33:01 +000071} _xmlParserCtxt;
72typedef _xmlParserCtxt xmlParserCtxt;
73typedef xmlParserCtxt *xmlParserCtxtPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000074
75/*
76 * a SAX Locator.
77 */
78
79typedef struct xmlSAXLocator {
80 const CHAR *(*getPublicId)(xmlParserCtxtPtr ctxt);
81 const CHAR *(*getSystemId)(xmlParserCtxtPtr ctxt);
82 int (*getLineNumber)(xmlParserCtxtPtr ctxt);
83 int (*getColumnNumber)(xmlParserCtxtPtr ctxt);
Daniel Veillard1e346af1999-02-22 10:33:01 +000084} _xmlSAXLocator;
85typedef _xmlSAXLocator xmlSAXLocator;
86typedef xmlSAXLocator *xmlSAXLocatorPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000087
88/*
89 * a SAX Exception.
90 */
91
92typedef xmlParserInputPtr (*resolveEntitySAXFunc) (xmlParserCtxtPtr ctxt,
93 const CHAR *publicId, const CHAR *systemId);
94typedef void (*notationDeclSAXFunc)(xmlParserCtxtPtr ctxt, const CHAR *name,
95 const CHAR *publicId, const CHAR *systemId);
96typedef void (*unparsedEntityDeclSAXFunc)(xmlParserCtxtPtr ctxt,
97 const CHAR *name, const CHAR *publicId,
98 const CHAR *systemId, const CHAR *notationName);
99typedef void (*setDocumentLocatorSAXFunc) (xmlParserCtxtPtr ctxt,
100 xmlSAXLocatorPtr loc);
101typedef void (*startDocumentSAXFunc) (xmlParserCtxtPtr ctxt);
102typedef void (*endDocumentSAXFunc) (xmlParserCtxtPtr ctxt);
103typedef void (*startElementSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name);
104typedef void (*endElementSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name);
Daniel Veillard11e00581998-10-24 18:27:49 +0000105typedef void (*attributeSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name,
106 const CHAR *value);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000107typedef void (*charactersSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *ch,
108 int start, int len);
109typedef void (*ignorableWhitespaceSAXFunc) (xmlParserCtxtPtr ctxt,
110 const CHAR *ch, int start, int len);
111typedef void (*processingInstructionSAXFunc) (xmlParserCtxtPtr ctxt,
112 const CHAR *target, const CHAR *data);
113typedef void (*warningSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...);
114typedef void (*errorSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...);
115typedef void (*fatalErrorSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...);
116
117typedef struct xmlSAXHandler {
118 resolveEntitySAXFunc resolveEntity;
119 notationDeclSAXFunc notationDecl;
120 unparsedEntityDeclSAXFunc unparsedEntityDecl;
121 setDocumentLocatorSAXFunc setDocumentLocator;
122 startDocumentSAXFunc startDocument;
123 endDocumentSAXFunc endDocument;
124 startElementSAXFunc startElement;
125 endElementSAXFunc endElement;
Daniel Veillard11e00581998-10-24 18:27:49 +0000126 attributeSAXFunc attribute;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000127 charactersSAXFunc characters;
128 ignorableWhitespaceSAXFunc ignorableWhitespace;
129 processingInstructionSAXFunc processingInstruction;
130 warningSAXFunc warning;
131 errorSAXFunc error;
132 fatalErrorSAXFunc fatalError;
Daniel Veillard1e346af1999-02-22 10:33:01 +0000133} xmlSAXHandler;
134typedef xmlSAXHandler *xmlSAXHandlerPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000135
136/*
137 * Global variables: just the SAX interface tables we are looking for full
138 * reentrancy of the code !
139 */
Daniel Veillard151b1b01998-09-23 00:49:46 +0000140extern xmlSAXLocator xmlDefaultSAXLocator;
141extern xmlSAXHandler xmlDefaultSAXHandler;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000142
Daniel Veillardccb09631998-10-27 06:21:04 +0000143#include "entities.h"
Daniel Veillardd109e371999-03-05 06:26:45 +0000144#include "xml-error.h"
Daniel Veillardccb09631998-10-27 06:21:04 +0000145
Daniel Veillard260a68f1998-08-13 03:39:55 +0000146/*
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000147 * CHAR handling
Daniel Veillard260a68f1998-08-13 03:39:55 +0000148 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000149CHAR *xmlStrdup(const CHAR *cur);
150CHAR *xmlStrndup(const CHAR *cur, int len);
151CHAR *xmlStrchr(const CHAR *str, CHAR val);
152int xmlStrcmp(const CHAR *str1, const CHAR *str2);
153int xmlStrncmp(const CHAR *str1, const CHAR *str2, int len);
154int xmlStrlen(const CHAR *str);
155CHAR *xmlStrcat(CHAR *cur, const CHAR *add);
156CHAR *xmlStrncat(CHAR *cur, const CHAR *add, int len);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000157
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000158/*
159 * Interfaces
160 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000161xmlDocPtr xmlParseDoc(CHAR *cur);
162xmlDocPtr xmlParseMemory(char *buffer, int size);
163xmlDocPtr xmlParseFile(const char *filename);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000164
165/*
166 * Recovery mode
167 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000168xmlDocPtr xmlRecoverDoc(CHAR *cur);
169xmlDocPtr xmlRecoverMemory(char *buffer, int size);
170xmlDocPtr xmlRecoverFile(const char *filename);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000171
172/*
173 * Internal routines
174 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000175int xmlParseDocument(xmlParserCtxtPtr ctxt);
176xmlDocPtr xmlSAXParseDoc(xmlSAXHandlerPtr sax, CHAR *cur, int recovery);
177xmlDocPtr xmlSAXParseMemory(xmlSAXHandlerPtr sax, char *buffer,
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000178 int size, int recovery);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000179xmlDocPtr xmlSAXParseFile(xmlSAXHandlerPtr sax, const char *filename,
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000180 int recovery);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000181void xmlInitParserCtxt(xmlParserCtxtPtr ctxt);
182void xmlClearParserCtxt(xmlParserCtxtPtr ctxt);
183void xmlSetupParserForBuffer(xmlParserCtxtPtr ctxt, const CHAR* buffer,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000184 const char* filename);
185
Daniel Veillard1e346af1999-02-22 10:33:01 +0000186const xmlParserNodeInfo* xmlParserFindNodeInfo(const xmlParserCtxt* ctxt,
187 const xmlNode* node);
188void xmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
189void xmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000190unsigned long xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeq* seq,
191 const xmlNode* node);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000192void xmlParserAddNodeInfo(xmlParserCtxtPtr ctxt,
193 const xmlParserNodeInfo* info);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000194
Daniel Veillard1e346af1999-02-22 10:33:01 +0000195void xmlDefaultSAXHandlerInit(void);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000196#ifdef __cplusplus
197}
198#endif
199
200#endif /* __XML_PARSER_H__ */
201