blob: c2e624d314b19e3c9d1fc7fab699fc51568cc6f4 [file] [log] [blame]
Daniel Veillard1e346af1999-02-22 10:33:01 +00001/*
2 * parserInternals.h : internals routines exported by the parser.
3 *
4 * See Copyright for the status of this software.
5 *
6 * Daniel.Veillard@w3.org
7 */
8
9#ifndef __XML_PARSER_INTERNALS_H__
10#define __XML_PARSER_INTERNALS_H__
11
Daniel Veillard361d8452000-04-03 19:48:13 +000012#include <libxml/parser.h>
Daniel Veillard1e346af1999-02-22 10:33:01 +000013
14#ifdef __cplusplus
15extern "C" {
16#endif
17
Daniel Veillarde0854c32000-08-27 21:12:29 +000018#define XML_MAX_NAMELEN 100
Daniel Veillardb96e6431999-08-29 21:02:19 +000019
Daniel Veillard64068b31999-03-24 20:42:16 +000020/************************************************************************
21 * *
22 * UNICODE version of the macros. *
23 * *
24 ************************************************************************/
25/*
26 * [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD]
27 * | [#x10000-#x10FFFF]
28 * any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
29 */
30#define IS_CHAR(c) \
Daniel Veillard496a1cf2000-05-03 14:20:55 +000031 (((c) == 0x09) || ((c) == 0x0A) || ((c) == 0x0D) || \
32 (((c) >= 0x20) && ((c) <= 0xD7FF)) || \
33 (((c) >= 0xE000) && ((c) <= 0xFFFD)) || \
34 (((c) >= 0x10000) && ((c) <= 0x10FFFF)))
Daniel Veillard64068b31999-03-24 20:42:16 +000035
36/*
37 * [3] S ::= (#x20 | #x9 | #xD | #xA)+
38 */
Daniel Veillardfc708e22000-04-08 13:17:27 +000039#define IS_BLANK(c) (((c) == 0x20) || ((c) == 0x09) || ((c) == 0xA) || \
Daniel Veillard64068b31999-03-24 20:42:16 +000040 ((c) == 0x0D))
41
42/*
43 * [85] BaseChar ::= ... long list see REC ...
Daniel Veillard64068b31999-03-24 20:42:16 +000044 */
Daniel Veillarddd477ce2000-09-10 13:23:08 +000045#define IS_BASECHAR(c) xmlIsBaseChar(c)
Daniel Veillard64068b31999-03-24 20:42:16 +000046
47/*
48 * [88] Digit ::= ... long list see REC ...
49 */
Daniel Veillarddd477ce2000-09-10 13:23:08 +000050#define IS_DIGIT(c) xmlIsDigit(c)
Daniel Veillard64068b31999-03-24 20:42:16 +000051
52/*
53 * [87] CombiningChar ::= ... long list see REC ...
54 */
Daniel Veillarddd477ce2000-09-10 13:23:08 +000055#define IS_COMBINING(c) xmlIsCombining(c)
Daniel Veillard64068b31999-03-24 20:42:16 +000056
57/*
58 * [89] Extender ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 |
59 * #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] |
60 * [#x309D-#x309E] | [#x30FC-#x30FE]
61 */
Daniel Veillarddd477ce2000-09-10 13:23:08 +000062#define IS_EXTENDER(c) xmlIsExtender(c)
Daniel Veillard64068b31999-03-24 20:42:16 +000063
64/*
65 * [86] Ideographic ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]
66 */
Daniel Veillarddd477ce2000-09-10 13:23:08 +000067#define IS_IDEOGRAPHIC(c) xmlIsIdeographic(c)
Daniel Veillard64068b31999-03-24 20:42:16 +000068
69/*
70 * [84] Letter ::= BaseChar | Ideographic
71 */
72#define IS_LETTER(c) (IS_BASECHAR(c) || IS_IDEOGRAPHIC(c))
73
Daniel Veillard64068b31999-03-24 20:42:16 +000074
75/*
76 * [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]
77 */
Daniel Veillarddd477ce2000-09-10 13:23:08 +000078#define IS_PUBIDCHAR(c) xmlIsPubidChar(c)
Daniel Veillard64068b31999-03-24 20:42:16 +000079
80#define SKIP_EOL(p) \
81 if (*(p) == 0x13) { p++ ; if (*(p) == 0x10) p++; } \
82 if (*(p) == 0x10) { p++ ; if (*(p) == 0x13) p++; }
83
84#define MOVETO_ENDTAG(p) \
Daniel Veillardcf461992000-03-14 18:30:20 +000085 while ((*p) && (*(p) != '>')) (p)++
Daniel Veillard64068b31999-03-24 20:42:16 +000086
87#define MOVETO_STARTTAG(p) \
Daniel Veillardcf461992000-03-14 18:30:20 +000088 while ((*p) && (*(p) != '<')) (p)++
Daniel Veillard011b63c1999-06-02 17:44:04 +000089
Daniel Veillarddd477ce2000-09-10 13:23:08 +000090/*
91 * Function to finish teh work of the macros where needed
92 */
93int xmlIsBaseChar (int c);
94int xmlIsBlank (int c);
95int xmlIsPubidChar (int c);
96int xmlIsLetter (int c);
97int xmlIsDigit (int c);
98int xmlIsIdeographic(int c);
99int xmlIsCombining (int c);
100int xmlIsExtender (int c);
101int xmlIsCombining (int c);
102int xmlIsChar (int c);
103
Daniel Veillard011b63c1999-06-02 17:44:04 +0000104/**
Daniel Veillardf0cc7cc2000-08-26 21:40:43 +0000105 * Not for the faint of heart
106 */
107
108extern int xmlParserDebugEntities;
109
110/**
Daniel Veillardd692aa41999-02-28 21:54:31 +0000111 * Parser context
112 */
Daniel Veillarddd6b3671999-09-23 22:19:22 +0000113xmlParserCtxtPtr xmlCreateDocParserCtxt (xmlChar *cur);
Daniel Veillardb96e6431999-08-29 21:02:19 +0000114xmlParserCtxtPtr xmlCreateFileParserCtxt (const char *filename);
115xmlParserCtxtPtr xmlCreateMemoryParserCtxt(char *buffer,
116 int size);
Daniel Veillardb96e6431999-08-29 21:02:19 +0000117xmlParserCtxtPtr xmlNewParserCtxt (void);
Daniel Veillardcf461992000-03-14 18:30:20 +0000118xmlParserCtxtPtr xmlCreateEntityParserCtxt(const xmlChar *URL,
119 const xmlChar *ID,
120 const xmlChar *base);
Daniel Veillard496a1cf2000-05-03 14:20:55 +0000121int xmlSwitchEncoding (xmlParserCtxtPtr ctxt,
Daniel Veillardb96e6431999-08-29 21:02:19 +0000122 xmlCharEncoding enc);
Daniel Veillard496a1cf2000-05-03 14:20:55 +0000123int xmlSwitchToEncoding (xmlParserCtxtPtr ctxt,
124 xmlCharEncodingHandlerPtr handler);
Daniel Veillardcf461992000-03-14 18:30:20 +0000125void xmlFreeParserCtxt (xmlParserCtxtPtr ctxt);
Daniel Veillardd692aa41999-02-28 21:54:31 +0000126
Daniel Veillardbc50b591999-03-01 12:28:53 +0000127/**
Daniel Veillard1e346af1999-02-22 10:33:01 +0000128 * Entities
129 */
Daniel Veillardb96e6431999-08-29 21:02:19 +0000130void xmlHandleEntity (xmlParserCtxtPtr ctxt,
131 xmlEntityPtr entity);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000132
Daniel Veillardbc50b591999-03-01 12:28:53 +0000133/**
134 * Input Streams
135 */
Daniel Veillardb96e6431999-08-29 21:02:19 +0000136xmlParserInputPtr xmlNewEntityInputStream (xmlParserCtxtPtr ctxt,
137 xmlEntityPtr entity);
138void xmlPushInput (xmlParserCtxtPtr ctxt,
139 xmlParserInputPtr input);
Daniel Veillarddd6b3671999-09-23 22:19:22 +0000140xmlChar xmlPopInput (xmlParserCtxtPtr ctxt);
Daniel Veillardb96e6431999-08-29 21:02:19 +0000141void xmlFreeInputStream (xmlParserInputPtr input);
142xmlParserInputPtr xmlNewInputFromFile (xmlParserCtxtPtr ctxt,
143 const char *filename);
Daniel Veillardbc50b591999-03-01 12:28:53 +0000144
145/**
Daniel Veillard1e346af1999-02-22 10:33:01 +0000146 * Namespaces.
147 */
Daniel Veillardcf461992000-03-14 18:30:20 +0000148xmlChar * xmlSplitQName (xmlParserCtxtPtr ctxt,
149 const xmlChar *name,
Daniel Veillarddd6b3671999-09-23 22:19:22 +0000150 xmlChar **prefix);
Daniel Veillardcf461992000-03-14 18:30:20 +0000151xmlChar * xmlNamespaceParseNCName (xmlParserCtxtPtr ctxt);
152xmlChar * xmlNamespaceParseQName (xmlParserCtxtPtr ctxt,
Daniel Veillarddd6b3671999-09-23 22:19:22 +0000153 xmlChar **prefix);
Daniel Veillardcf461992000-03-14 18:30:20 +0000154xmlChar * xmlNamespaceParseNSDef (xmlParserCtxtPtr ctxt);
155xmlChar * xmlParseQuotedString (xmlParserCtxtPtr ctxt);
Daniel Veillardb96e6431999-08-29 21:02:19 +0000156void xmlParseNamespace (xmlParserCtxtPtr ctxt);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000157
Daniel Veillardbc50b591999-03-01 12:28:53 +0000158/**
Daniel Veillard1e346af1999-02-22 10:33:01 +0000159 * Generic production rules
160 */
Daniel Veillardcf461992000-03-14 18:30:20 +0000161xmlChar * xmlScanName (xmlParserCtxtPtr ctxt);
162xmlChar * xmlParseName (xmlParserCtxtPtr ctxt);
163xmlChar * xmlParseNmtoken (xmlParserCtxtPtr ctxt);
164xmlChar * xmlParseEntityValue (xmlParserCtxtPtr ctxt,
Daniel Veillarddd6b3671999-09-23 22:19:22 +0000165 xmlChar **orig);
Daniel Veillardcf461992000-03-14 18:30:20 +0000166xmlChar * xmlParseAttValue (xmlParserCtxtPtr ctxt);
167xmlChar * xmlParseSystemLiteral (xmlParserCtxtPtr ctxt);
168xmlChar * xmlParsePubidLiteral (xmlParserCtxtPtr ctxt);
Daniel Veillardb96e6431999-08-29 21:02:19 +0000169void xmlParseCharData (xmlParserCtxtPtr ctxt,
170 int cdata);
Daniel Veillardcf461992000-03-14 18:30:20 +0000171xmlChar * xmlParseExternalID (xmlParserCtxtPtr ctxt,
Daniel Veillarddd6b3671999-09-23 22:19:22 +0000172 xmlChar **publicID,
Daniel Veillardb96e6431999-08-29 21:02:19 +0000173 int strict);
174void xmlParseComment (xmlParserCtxtPtr ctxt);
Daniel Veillardcf461992000-03-14 18:30:20 +0000175xmlChar * xmlParsePITarget (xmlParserCtxtPtr ctxt);
Daniel Veillardb96e6431999-08-29 21:02:19 +0000176void xmlParsePI (xmlParserCtxtPtr ctxt);
177void xmlParseNotationDecl (xmlParserCtxtPtr ctxt);
178void xmlParseEntityDecl (xmlParserCtxtPtr ctxt);
179int xmlParseDefaultDecl (xmlParserCtxtPtr ctxt,
Daniel Veillarddd6b3671999-09-23 22:19:22 +0000180 xmlChar **value);
Daniel Veillardb96e6431999-08-29 21:02:19 +0000181xmlEnumerationPtr xmlParseNotationType (xmlParserCtxtPtr ctxt);
182xmlEnumerationPtr xmlParseEnumerationType (xmlParserCtxtPtr ctxt);
183int xmlParseEnumeratedType (xmlParserCtxtPtr ctxt,
184 xmlEnumerationPtr *tree);
185int xmlParseAttributeType (xmlParserCtxtPtr ctxt,
186 xmlEnumerationPtr *tree);
187void xmlParseAttributeListDecl(xmlParserCtxtPtr ctxt);
188xmlElementContentPtr xmlParseElementMixedContentDecl
189 (xmlParserCtxtPtr ctxt);
190xmlElementContentPtr xmlParseElementChildrenContentDecl
191 (xmlParserCtxtPtr ctxt);
192int xmlParseElementContentDecl(xmlParserCtxtPtr ctxt,
Daniel Veillarddd6b3671999-09-23 22:19:22 +0000193 xmlChar *name,
Daniel Veillardb96e6431999-08-29 21:02:19 +0000194 xmlElementContentPtr *result);
195int xmlParseElementDecl (xmlParserCtxtPtr ctxt);
196void xmlParseMarkupDecl (xmlParserCtxtPtr ctxt);
197int xmlParseCharRef (xmlParserCtxtPtr ctxt);
198xmlEntityPtr xmlParseEntityRef (xmlParserCtxtPtr ctxt);
199void xmlParseReference (xmlParserCtxtPtr ctxt);
200void xmlParsePEReference (xmlParserCtxtPtr ctxt);
201void xmlParseDocTypeDecl (xmlParserCtxtPtr ctxt);
Daniel Veillardcf461992000-03-14 18:30:20 +0000202xmlChar * xmlParseAttribute (xmlParserCtxtPtr ctxt,
Daniel Veillarddd6b3671999-09-23 22:19:22 +0000203 xmlChar **value);
Daniel Veillardcf461992000-03-14 18:30:20 +0000204xmlChar * xmlParseStartTag (xmlParserCtxtPtr ctxt);
Daniel Veillarddbfd6411999-12-28 16:35:14 +0000205void xmlParseEndTag (xmlParserCtxtPtr ctxt);
Daniel Veillardb96e6431999-08-29 21:02:19 +0000206void xmlParseCDSect (xmlParserCtxtPtr ctxt);
207void xmlParseContent (xmlParserCtxtPtr ctxt);
208void xmlParseElement (xmlParserCtxtPtr ctxt);
Daniel Veillardcf461992000-03-14 18:30:20 +0000209xmlChar * xmlParseVersionNum (xmlParserCtxtPtr ctxt);
210xmlChar * xmlParseVersionInfo (xmlParserCtxtPtr ctxt);
211xmlChar * xmlParseEncName (xmlParserCtxtPtr ctxt);
212xmlChar * xmlParseEncodingDecl (xmlParserCtxtPtr ctxt);
Daniel Veillardb96e6431999-08-29 21:02:19 +0000213int xmlParseSDDecl (xmlParserCtxtPtr ctxt);
214void xmlParseXMLDecl (xmlParserCtxtPtr ctxt);
Daniel Veillardcf461992000-03-14 18:30:20 +0000215void xmlParseTextDecl (xmlParserCtxtPtr ctxt);
Daniel Veillardb96e6431999-08-29 21:02:19 +0000216void xmlParseMisc (xmlParserCtxtPtr ctxt);
217void xmlParseExternalSubset (xmlParserCtxtPtr ctxt,
Daniel Veillarddd6b3671999-09-23 22:19:22 +0000218 const xmlChar *ExternalID,
219 const xmlChar *SystemID);
Daniel Veillard517752b1999-04-05 12:20:10 +0000220/*
Daniel Veillard011b63c1999-06-02 17:44:04 +0000221 * Entities substitution
222 */
223#define XML_SUBSTITUTE_NONE 0
224#define XML_SUBSTITUTE_REF 1
225#define XML_SUBSTITUTE_PEREF 2
226#define XML_SUBSTITUTE_BOTH 3
227
Daniel Veillardcf461992000-03-14 18:30:20 +0000228xmlChar * xmlDecodeEntities (xmlParserCtxtPtr ctxt,
Daniel Veillardb96e6431999-08-29 21:02:19 +0000229 int len,
230 int what,
Daniel Veillarddd6b3671999-09-23 22:19:22 +0000231 xmlChar end,
232 xmlChar end2,
233 xmlChar end3);
Daniel Veillardcf461992000-03-14 18:30:20 +0000234xmlChar * xmlStringDecodeEntities (xmlParserCtxtPtr ctxt,
235 const xmlChar *str,
236 int what,
237 xmlChar end,
238 xmlChar end2,
239 xmlChar end3);
Daniel Veillard011b63c1999-06-02 17:44:04 +0000240
241/*
Daniel Veillard517752b1999-04-05 12:20:10 +0000242 * Generated by MACROS on top of parser.c c.f. PUSH_AND_POP
243 */
Daniel Veillardb96e6431999-08-29 21:02:19 +0000244int nodePush (xmlParserCtxtPtr ctxt,
245 xmlNodePtr value);
246xmlNodePtr nodePop (xmlParserCtxtPtr ctxt);
247int inputPush (xmlParserCtxtPtr ctxt,
248 xmlParserInputPtr value);
249xmlParserInputPtr inputPop (xmlParserCtxtPtr ctxt);
Daniel Veillard1e346af1999-02-22 10:33:01 +0000250
Daniel Veillard32bc74e2000-07-14 14:49:25 +0000251/*
252 * Really core function shared with HTML parser
253 */
254int xmlCurrentChar (xmlParserCtxtPtr ctxt,
255 int *len);
256int xmlCopyChar (int len,
257 xmlChar *out,
258 int val);
259void xmlNextChar (xmlParserCtxtPtr ctxt);
260void xmlParserInputShrink (xmlParserInputPtr in);
Daniel Veillardc08a2c61999-09-08 21:35:25 +0000261#ifdef __cplusplus
262}
263#endif
Daniel Veillard1e346af1999-02-22 10:33:01 +0000264#endif /* __XML_PARSER_INTERNALS_H__ */