blob: 3e433a26c3ba5e810e1c25df0e9c7a8e9c991e9b [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 */
Daniel Veillard517752b1999-04-05 12:20:10 +000054 void *userData; /* the document being built */
55 xmlDocPtr myDoc; /* the document being built */
Daniel Veillard39a1f9a1999-01-17 19:11:59 +000056 int wellFormed; /* is the document well formed */
Daniel Veillard517752b1999-04-05 12:20:10 +000057 const CHAR *version; /* the XML version string */
58 const CHAR *encoding; /* encoding, if any */
59 int standalone; /* standalone document */
Daniel Veillard260a68f1998-08-13 03:39:55 +000060
61 /* Input stream stack */
62 xmlParserInputPtr input; /* Current input stream */
63 int inputNr; /* Number of current input streams */
64 int inputMax; /* Max number of input streams */
65 xmlParserInputPtr *inputTab; /* stack of inputs */
66
67 /* Node analysis stack */
68 xmlNodePtr node; /* Current parsed Node */
69 int nodeNr; /* Depth of the parsing stack */
70 int nodeMax; /* Max depth of the parsing stack */
71 xmlNodePtr *nodeTab; /* array of nodes */
72
73 int record_info; /* Whether node info should be kept */
74 xmlParserNodeInfoSeq node_seq; /* info about each node parsed */
Daniel Veillard1e346af1999-02-22 10:33:01 +000075} _xmlParserCtxt;
76typedef _xmlParserCtxt xmlParserCtxt;
77typedef xmlParserCtxt *xmlParserCtxtPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000078
79/*
80 * a SAX Locator.
81 */
82
83typedef struct xmlSAXLocator {
84 const CHAR *(*getPublicId)(xmlParserCtxtPtr ctxt);
85 const CHAR *(*getSystemId)(xmlParserCtxtPtr ctxt);
86 int (*getLineNumber)(xmlParserCtxtPtr ctxt);
87 int (*getColumnNumber)(xmlParserCtxtPtr ctxt);
Daniel Veillard1e346af1999-02-22 10:33:01 +000088} _xmlSAXLocator;
89typedef _xmlSAXLocator xmlSAXLocator;
90typedef xmlSAXLocator *xmlSAXLocatorPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +000091
92/*
93 * a SAX Exception.
94 */
95
Daniel Veillard517752b1999-04-05 12:20:10 +000096#include "entities.h"
97
Daniel Veillard260a68f1998-08-13 03:39:55 +000098typedef xmlParserInputPtr (*resolveEntitySAXFunc) (xmlParserCtxtPtr ctxt,
99 const CHAR *publicId, const CHAR *systemId);
Daniel Veillard517752b1999-04-05 12:20:10 +0000100typedef void (*internalSubsetSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name,
101 const CHAR *ExternalID, const CHAR *SystemID);
102typedef xmlEntityPtr (*getEntitySAXFunc) (xmlParserCtxtPtr ctxt,
103 const CHAR *name);
104typedef void (*entityDeclSAXFunc) (xmlParserCtxtPtr ctxt,
105 const CHAR *name, int type, const CHAR *publicId,
106 const CHAR *systemId, CHAR *content);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000107typedef void (*notationDeclSAXFunc)(xmlParserCtxtPtr ctxt, const CHAR *name,
108 const CHAR *publicId, const CHAR *systemId);
Daniel Veillard517752b1999-04-05 12:20:10 +0000109typedef void (*attributeDeclSAXFunc)(xmlParserCtxtPtr ctxt, const CHAR *elem,
110 const CHAR *name, int type, int def,
111 const CHAR *defaultValue, xmlEnumerationPtr tree);
112typedef void (*elementDeclSAXFunc)(xmlParserCtxtPtr ctxt, const CHAR *name,
113 int type, xmlElementContentPtr content);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000114typedef void (*unparsedEntityDeclSAXFunc)(xmlParserCtxtPtr ctxt,
115 const CHAR *name, const CHAR *publicId,
116 const CHAR *systemId, const CHAR *notationName);
117typedef void (*setDocumentLocatorSAXFunc) (xmlParserCtxtPtr ctxt,
118 xmlSAXLocatorPtr loc);
119typedef void (*startDocumentSAXFunc) (xmlParserCtxtPtr ctxt);
120typedef void (*endDocumentSAXFunc) (xmlParserCtxtPtr ctxt);
Daniel Veillard517752b1999-04-05 12:20:10 +0000121typedef void (*startElementSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name,
122 const CHAR **atts);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000123typedef void (*endElementSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name);
Daniel Veillard11e00581998-10-24 18:27:49 +0000124typedef void (*attributeSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name,
125 const CHAR *value);
Daniel Veillard517752b1999-04-05 12:20:10 +0000126typedef void (*referenceSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000127typedef void (*charactersSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *ch,
Daniel Veillard517752b1999-04-05 12:20:10 +0000128 int len);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000129typedef void (*ignorableWhitespaceSAXFunc) (xmlParserCtxtPtr ctxt,
Daniel Veillard517752b1999-04-05 12:20:10 +0000130 const CHAR *ch, int len);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000131typedef void (*processingInstructionSAXFunc) (xmlParserCtxtPtr ctxt,
132 const CHAR *target, const CHAR *data);
Daniel Veillard517752b1999-04-05 12:20:10 +0000133typedef void (*commentSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *value);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000134typedef void (*warningSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...);
135typedef void (*errorSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...);
136typedef void (*fatalErrorSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...);
Daniel Veillard517752b1999-04-05 12:20:10 +0000137typedef int (*isStandaloneSAXFunc) (xmlParserCtxtPtr ctxt);
138typedef int (*hasInternalSubsetSAXFunc) (xmlParserCtxtPtr ctxt);
139typedef int (*hasExternalSubsetSAXFunc) (xmlParserCtxtPtr ctxt);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000140
141typedef struct xmlSAXHandler {
Daniel Veillard517752b1999-04-05 12:20:10 +0000142 internalSubsetSAXFunc internalSubset;
143 isStandaloneSAXFunc isStandalone;
144 hasInternalSubsetSAXFunc hasInternalSubset;
145 hasExternalSubsetSAXFunc hasExternalSubset;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000146 resolveEntitySAXFunc resolveEntity;
Daniel Veillard517752b1999-04-05 12:20:10 +0000147 getEntitySAXFunc getEntity;
148 entityDeclSAXFunc entityDecl;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000149 notationDeclSAXFunc notationDecl;
Daniel Veillard517752b1999-04-05 12:20:10 +0000150 attributeDeclSAXFunc attributeDecl;
151 elementDeclSAXFunc elementDecl;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000152 unparsedEntityDeclSAXFunc unparsedEntityDecl;
153 setDocumentLocatorSAXFunc setDocumentLocator;
154 startDocumentSAXFunc startDocument;
155 endDocumentSAXFunc endDocument;
156 startElementSAXFunc startElement;
157 endElementSAXFunc endElement;
Daniel Veillard517752b1999-04-05 12:20:10 +0000158 referenceSAXFunc reference;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000159 charactersSAXFunc characters;
160 ignorableWhitespaceSAXFunc ignorableWhitespace;
161 processingInstructionSAXFunc processingInstruction;
Daniel Veillard517752b1999-04-05 12:20:10 +0000162 commentSAXFunc comment;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000163 warningSAXFunc warning;
164 errorSAXFunc error;
165 fatalErrorSAXFunc fatalError;
Daniel Veillard1e346af1999-02-22 10:33:01 +0000166} xmlSAXHandler;
167typedef xmlSAXHandler *xmlSAXHandlerPtr;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000168
169/*
170 * Global variables: just the SAX interface tables we are looking for full
171 * reentrancy of the code !
172 */
Daniel Veillard151b1b01998-09-23 00:49:46 +0000173extern xmlSAXLocator xmlDefaultSAXLocator;
174extern xmlSAXHandler xmlDefaultSAXHandler;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000175
Daniel Veillardccb09631998-10-27 06:21:04 +0000176#include "entities.h"
Daniel Veillardd109e371999-03-05 06:26:45 +0000177#include "xml-error.h"
Daniel Veillardccb09631998-10-27 06:21:04 +0000178
Daniel Veillard260a68f1998-08-13 03:39:55 +0000179/*
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000180 * CHAR handling
Daniel Veillard260a68f1998-08-13 03:39:55 +0000181 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000182CHAR *xmlStrdup(const CHAR *cur);
183CHAR *xmlStrndup(const CHAR *cur, int len);
184CHAR *xmlStrchr(const CHAR *str, CHAR val);
185int xmlStrcmp(const CHAR *str1, const CHAR *str2);
186int xmlStrncmp(const CHAR *str1, const CHAR *str2, int len);
187int xmlStrlen(const CHAR *str);
188CHAR *xmlStrcat(CHAR *cur, const CHAR *add);
189CHAR *xmlStrncat(CHAR *cur, const CHAR *add, int len);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000190
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000191/*
192 * Interfaces
193 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000194xmlDocPtr xmlParseDoc(CHAR *cur);
195xmlDocPtr xmlParseMemory(char *buffer, int size);
196xmlDocPtr xmlParseFile(const char *filename);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000197
198/*
199 * Recovery mode
200 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000201xmlDocPtr xmlRecoverDoc(CHAR *cur);
202xmlDocPtr xmlRecoverMemory(char *buffer, int size);
203xmlDocPtr xmlRecoverFile(const char *filename);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000204
205/*
206 * Internal routines
207 */
Daniel Veillard1e346af1999-02-22 10:33:01 +0000208int xmlParseDocument(xmlParserCtxtPtr ctxt);
209xmlDocPtr xmlSAXParseDoc(xmlSAXHandlerPtr sax, CHAR *cur, int recovery);
210xmlDocPtr xmlSAXParseMemory(xmlSAXHandlerPtr sax, char *buffer,
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000211 int size, int recovery);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000212xmlDocPtr xmlSAXParseFile(xmlSAXHandlerPtr sax, const char *filename,
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000213 int recovery);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000214void xmlInitParserCtxt(xmlParserCtxtPtr ctxt);
215void xmlClearParserCtxt(xmlParserCtxtPtr ctxt);
216void xmlSetupParserForBuffer(xmlParserCtxtPtr ctxt, const CHAR* buffer,
Daniel Veillard260a68f1998-08-13 03:39:55 +0000217 const char* filename);
218
Daniel Veillard1e346af1999-02-22 10:33:01 +0000219const xmlParserNodeInfo* xmlParserFindNodeInfo(const xmlParserCtxt* ctxt,
220 const xmlNode* node);
221void xmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
222void xmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000223unsigned long xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeq* seq,
224 const xmlNode* node);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000225void xmlParserAddNodeInfo(xmlParserCtxtPtr ctxt,
226 const xmlParserNodeInfo* info);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000227
Daniel Veillard1e346af1999-02-22 10:33:01 +0000228void xmlDefaultSAXHandlerInit(void);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000229#ifdef __cplusplus
230}
231#endif
232
233#endif /* __XML_PARSER_H__ */
234