1/*
2 * Summary: regular expressions handling
3 * Description: basic API for libxml regular expressions handling used
4 *              for XML Schemas and validation.
5 *
6 * Copy: See Copyright for the status of this software.
7 *
8 * Author: Daniel Veillard
9 */
10
11#ifndef __XML_REGEXP_H__
12#define __XML_REGEXP_H__
13
14#include <libxml/xmlversion.h>
15
16#ifdef LIBXML_REGEXP_ENABLED
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
22/**
23 * xmlRegexpPtr:
24 *
25 * A libxml regular expression, they can actually be far more complex
26 * thank the POSIX regex expressions.
27 */
28typedef struct _xmlRegexp xmlRegexp;
29typedef xmlRegexp *xmlRegexpPtr;
30
31/**
32 * xmlRegExecCtxtPtr:
33 *
34 * A libxml progressive regular expression evaluation context
35 */
36typedef struct _xmlRegExecCtxt xmlRegExecCtxt;
37typedef xmlRegExecCtxt *xmlRegExecCtxtPtr;
38
39#ifdef __cplusplus
40}
41#endif
42#include <libxml/tree.h>
43#include <libxml/dict.h>
44#ifdef __cplusplus
45extern "C" {
46#endif
47
48/*
49 * The POSIX like API
50 */
51XMLPUBFUN xmlRegexpPtr XMLCALL
52		    xmlRegexpCompile	(const xmlChar *regexp);
53XMLPUBFUN void XMLCALL			 xmlRegFreeRegexp(xmlRegexpPtr regexp);
54XMLPUBFUN int XMLCALL
55		    xmlRegexpExec	(xmlRegexpPtr comp,
56					 const xmlChar *value);
57XMLPUBFUN void XMLCALL
58		    xmlRegexpPrint	(FILE *output,
59					 xmlRegexpPtr regexp);
60XMLPUBFUN int XMLCALL
61		    xmlRegexpIsDeterminist(xmlRegexpPtr comp);
62
63/**
64 * xmlRegExecCallbacks:
65 * @exec: the regular expression context
66 * @token: the current token string
67 * @transdata: transition data
68 * @inputdata: input data
69 *
70 * Callback function when doing a transition in the automata
71 */
72typedef void (*xmlRegExecCallbacks) (xmlRegExecCtxtPtr exec,
73	                             const xmlChar *token,
74				     void *transdata,
75				     void *inputdata);
76
77/*
78 * The progressive API
79 */
80XMLPUBFUN xmlRegExecCtxtPtr XMLCALL
81		    xmlRegNewExecCtxt	(xmlRegexpPtr comp,
82					 xmlRegExecCallbacks callback,
83					 void *data);
84XMLPUBFUN void XMLCALL
85		    xmlRegFreeExecCtxt	(xmlRegExecCtxtPtr exec);
86XMLPUBFUN int XMLCALL
87		    xmlRegExecPushString(xmlRegExecCtxtPtr exec,
88					 const xmlChar *value,
89					 void *data);
90XMLPUBFUN int XMLCALL
91		    xmlRegExecPushString2(xmlRegExecCtxtPtr exec,
92					 const xmlChar *value,
93					 const xmlChar *value2,
94					 void *data);
95
96XMLPUBFUN int XMLCALL
97		    xmlRegExecNextValues(xmlRegExecCtxtPtr exec,
98					 int *nbval,
99					 int *nbneg,
100					 xmlChar **values,
101					 int *terminal);
102XMLPUBFUN int XMLCALL
103		    xmlRegExecErrInfo	(xmlRegExecCtxtPtr exec,
104					 const xmlChar **string,
105					 int *nbval,
106					 int *nbneg,
107					 xmlChar **values,
108					 int *terminal);
109#ifdef LIBXML_EXPR_ENABLED
110/*
111 * Formal regular expression handling
112 * Its goal is to do some formal work on content models
113 */
114
115/* expressions are used within a context */
116typedef struct _xmlExpCtxt xmlExpCtxt;
117typedef xmlExpCtxt *xmlExpCtxtPtr;
118
119XMLPUBFUN void XMLCALL
120			xmlExpFreeCtxt	(xmlExpCtxtPtr ctxt);
121XMLPUBFUN xmlExpCtxtPtr XMLCALL
122			xmlExpNewCtxt	(int maxNodes,
123					 xmlDictPtr dict);
124
125XMLPUBFUN int XMLCALL
126			xmlExpCtxtNbNodes(xmlExpCtxtPtr ctxt);
127XMLPUBFUN int XMLCALL
128			xmlExpCtxtNbCons(xmlExpCtxtPtr ctxt);
129
130/* Expressions are trees but the tree is opaque */
131typedef struct _xmlExpNode xmlExpNode;
132typedef xmlExpNode *xmlExpNodePtr;
133
134typedef enum {
135    XML_EXP_EMPTY = 0,
136    XML_EXP_FORBID = 1,
137    XML_EXP_ATOM = 2,
138    XML_EXP_SEQ = 3,
139    XML_EXP_OR = 4,
140    XML_EXP_COUNT = 5
141} xmlExpNodeType;
142
143/*
144 * 2 core expressions shared by all for the empty language set
145 * and for the set with just the empty token
146 */
147XMLPUBVAR xmlExpNodePtr forbiddenExp;
148XMLPUBVAR xmlExpNodePtr emptyExp;
149
150/*
151 * Expressions are reference counted internally
152 */
153XMLPUBFUN void XMLCALL
154			xmlExpFree	(xmlExpCtxtPtr ctxt,
155					 xmlExpNodePtr expr);
156XMLPUBFUN void XMLCALL
157			xmlExpRef	(xmlExpNodePtr expr);
158
159/*
160 * constructors can be either manual or from a string
161 */
162XMLPUBFUN xmlExpNodePtr XMLCALL
163			xmlExpParse	(xmlExpCtxtPtr ctxt,
164					 const char *expr);
165XMLPUBFUN xmlExpNodePtr XMLCALL
166			xmlExpNewAtom	(xmlExpCtxtPtr ctxt,
167					 const xmlChar *name,
168					 int len);
169XMLPUBFUN xmlExpNodePtr XMLCALL
170			xmlExpNewOr	(xmlExpCtxtPtr ctxt,
171					 xmlExpNodePtr left,
172					 xmlExpNodePtr right);
173XMLPUBFUN xmlExpNodePtr XMLCALL
174			xmlExpNewSeq	(xmlExpCtxtPtr ctxt,
175					 xmlExpNodePtr left,
176					 xmlExpNodePtr right);
177XMLPUBFUN xmlExpNodePtr XMLCALL
178			xmlExpNewRange	(xmlExpCtxtPtr ctxt,
179					 xmlExpNodePtr subset,
180					 int min,
181					 int max);
182/*
183 * The really interesting APIs
184 */
185XMLPUBFUN int XMLCALL
186			xmlExpIsNillable(xmlExpNodePtr expr);
187XMLPUBFUN int XMLCALL
188			xmlExpMaxToken	(xmlExpNodePtr expr);
189XMLPUBFUN int XMLCALL
190			xmlExpGetLanguage(xmlExpCtxtPtr ctxt,
191					 xmlExpNodePtr expr,
192					 const xmlChar**langList,
193					 int len);
194XMLPUBFUN int XMLCALL
195			xmlExpGetStart	(xmlExpCtxtPtr ctxt,
196					 xmlExpNodePtr expr,
197					 const xmlChar**tokList,
198					 int len);
199XMLPUBFUN xmlExpNodePtr XMLCALL
200			xmlExpStringDerive(xmlExpCtxtPtr ctxt,
201					 xmlExpNodePtr expr,
202					 const xmlChar *str,
203					 int len);
204XMLPUBFUN xmlExpNodePtr XMLCALL
205			xmlExpExpDerive	(xmlExpCtxtPtr ctxt,
206					 xmlExpNodePtr expr,
207					 xmlExpNodePtr sub);
208XMLPUBFUN int XMLCALL
209			xmlExpSubsume	(xmlExpCtxtPtr ctxt,
210					 xmlExpNodePtr expr,
211					 xmlExpNodePtr sub);
212XMLPUBFUN void XMLCALL
213			xmlExpDump	(xmlBufferPtr buf,
214					 xmlExpNodePtr expr);
215#endif /* LIBXML_EXPR_ENABLED */
216#ifdef __cplusplus
217}
218#endif
219
220#endif /* LIBXML_REGEXP_ENABLED */
221
222#endif /*__XML_REGEXP_H__ */
223