• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* libxml2 - Library for parsing XML documents
2  * Copyright (C) 2006-2019 Free Software Foundation, Inc.
3  *
4  * This file is not part of the GNU gettext program, but is used with
5  * GNU gettext.
6  *
7  * The original copyright notice is as follows:
8  */
9 
10 /*
11  * Copyright (C) 1998-2012 Daniel Veillard.  All Rights Reserved.
12  *
13  * Permission is hereby granted, free of charge, to any person obtaining a copy
14  * of this software and associated documentation files (the "Software"), to deal
15  * in the Software without restriction, including without limitation the rights
16  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17  * copies of the Software, and to permit persons to whom the Software is fur-
18  * nished to do so, subject to the following conditions:
19  *
20  * The above copyright notice and this permission notice shall be included in
21  * all copies or substantial portions of the Software.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
25  * NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
26  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29  * THE SOFTWARE.
30  *
31  * Author: Daniel Veillard
32  */
33 
34 /*
35  * Summary: The DTD validation
36  * Description: API for the DTD handling and the validity checking
37  */
38 
39 #ifndef __XML_VALID_H__
40 #define __XML_VALID_H__
41 
42 #include <libxml/xmlversion.h>
43 #include <libxml/xmlerror.h>
44 #include <libxml/tree.h>
45 #include <libxml/list.h>
46 #include <libxml/xmlautomata.h>
47 #include <libxml/xmlregexp.h>
48 
49 #ifdef __cplusplus
50 extern "C" {
51 #endif
52 
53 /*
54  * Validation state added for non-determinist content model.
55  */
56 typedef struct _xmlValidState xmlValidState;
57 typedef xmlValidState *xmlValidStatePtr;
58 
59 /**
60  * xmlValidityErrorFunc:
61  * @ctx:  usually an xmlValidCtxtPtr to a validity error context,
62  *        but comes from ctxt->userData (which normally contains such
63  *        a pointer); ctxt->userData can be changed by the user.
64  * @msg:  the string to format *printf like vararg
65  * @...:  remaining arguments to the format
66  *
67  * Callback called when a validity error is found. This is a message
68  * oriented function similar to an *printf function.
69  */
70 typedef void (XMLCDECL *xmlValidityErrorFunc) (void *ctx,
71 			     const char *msg,
72 			     ...) LIBXML_ATTR_FORMAT(2,3);
73 
74 /**
75  * xmlValidityWarningFunc:
76  * @ctx:  usually an xmlValidCtxtPtr to a validity error context,
77  *        but comes from ctxt->userData (which normally contains such
78  *        a pointer); ctxt->userData can be changed by the user.
79  * @msg:  the string to format *printf like vararg
80  * @...:  remaining arguments to the format
81  *
82  * Callback called when a validity warning is found. This is a message
83  * oriented function similar to an *printf function.
84  */
85 typedef void (XMLCDECL *xmlValidityWarningFunc) (void *ctx,
86 			       const char *msg,
87 			       ...) LIBXML_ATTR_FORMAT(2,3);
88 
89 #ifdef IN_LIBXML
90 /**
91  * XML_CTXT_FINISH_DTD_0:
92  *
93  * Special value for finishDtd field when embedded in an xmlParserCtxt
94  */
95 #define XML_CTXT_FINISH_DTD_0 0xabcd1234
96 /**
97  * XML_CTXT_FINISH_DTD_1:
98  *
99  * Special value for finishDtd field when embedded in an xmlParserCtxt
100  */
101 #define XML_CTXT_FINISH_DTD_1 0xabcd1235
102 #endif
103 
104 /*
105  * xmlValidCtxt:
106  * An xmlValidCtxt is used for error reporting when validating.
107  */
108 typedef struct _xmlValidCtxt xmlValidCtxt;
109 typedef xmlValidCtxt *xmlValidCtxtPtr;
110 struct _xmlValidCtxt {
111     void *userData;			/* user specific data block */
112     xmlValidityErrorFunc error;		/* the callback in case of errors */
113     xmlValidityWarningFunc warning;	/* the callback in case of warning */
114 
115     /* Node analysis stack used when validating within entities */
116     xmlNodePtr         node;          /* Current parsed Node */
117     int                nodeNr;        /* Depth of the parsing stack */
118     int                nodeMax;       /* Max depth of the parsing stack */
119     xmlNodePtr        *nodeTab;       /* array of nodes */
120 
121     unsigned int     finishDtd;       /* finished validating the Dtd ? */
122     xmlDocPtr              doc;       /* the document */
123     int                  valid;       /* temporary validity check result */
124 
125     /* state state used for non-determinist content validation */
126     xmlValidState     *vstate;        /* current state */
127     int                vstateNr;      /* Depth of the validation stack */
128     int                vstateMax;     /* Max depth of the validation stack */
129     xmlValidState     *vstateTab;     /* array of validation states */
130 
131 #ifdef LIBXML_REGEXP_ENABLED
132     xmlAutomataPtr            am;     /* the automata */
133     xmlAutomataStatePtr    state;     /* used to build the automata */
134 #else
135     void                     *am;
136     void                  *state;
137 #endif
138 };
139 
140 /*
141  * ALL notation declarations are stored in a table.
142  * There is one table per DTD.
143  */
144 
145 typedef struct _xmlHashTable xmlNotationTable;
146 typedef xmlNotationTable *xmlNotationTablePtr;
147 
148 /*
149  * ALL element declarations are stored in a table.
150  * There is one table per DTD.
151  */
152 
153 typedef struct _xmlHashTable xmlElementTable;
154 typedef xmlElementTable *xmlElementTablePtr;
155 
156 /*
157  * ALL attribute declarations are stored in a table.
158  * There is one table per DTD.
159  */
160 
161 typedef struct _xmlHashTable xmlAttributeTable;
162 typedef xmlAttributeTable *xmlAttributeTablePtr;
163 
164 /*
165  * ALL IDs attributes are stored in a table.
166  * There is one table per document.
167  */
168 
169 typedef struct _xmlHashTable xmlIDTable;
170 typedef xmlIDTable *xmlIDTablePtr;
171 
172 /*
173  * ALL Refs attributes are stored in a table.
174  * There is one table per document.
175  */
176 
177 typedef struct _xmlHashTable xmlRefTable;
178 typedef xmlRefTable *xmlRefTablePtr;
179 
180 /* Notation */
181 XMLPUBFUN xmlNotationPtr XMLCALL
182 		xmlAddNotationDecl	(xmlValidCtxtPtr ctxt,
183 					 xmlDtdPtr dtd,
184 					 const xmlChar *name,
185 					 const xmlChar *PublicID,
186 					 const xmlChar *SystemID);
187 #ifdef LIBXML_TREE_ENABLED
188 XMLPUBFUN xmlNotationTablePtr XMLCALL
189 		xmlCopyNotationTable	(xmlNotationTablePtr table);
190 #endif /* LIBXML_TREE_ENABLED */
191 XMLPUBFUN void XMLCALL
192 		xmlFreeNotationTable	(xmlNotationTablePtr table);
193 #ifdef LIBXML_OUTPUT_ENABLED
194 XMLPUBFUN void XMLCALL
195 		xmlDumpNotationDecl	(xmlBufferPtr buf,
196 					 xmlNotationPtr nota);
197 XMLPUBFUN void XMLCALL
198 		xmlDumpNotationTable	(xmlBufferPtr buf,
199 					 xmlNotationTablePtr table);
200 #endif /* LIBXML_OUTPUT_ENABLED */
201 
202 /* Element Content */
203 /* the non Doc version are being deprecated */
204 XMLPUBFUN xmlElementContentPtr XMLCALL
205 		xmlNewElementContent	(const xmlChar *name,
206 					 xmlElementContentType type);
207 XMLPUBFUN xmlElementContentPtr XMLCALL
208 		xmlCopyElementContent	(xmlElementContentPtr content);
209 XMLPUBFUN void XMLCALL
210 		xmlFreeElementContent	(xmlElementContentPtr cur);
211 /* the new versions with doc argument */
212 XMLPUBFUN xmlElementContentPtr XMLCALL
213 		xmlNewDocElementContent	(xmlDocPtr doc,
214 					 const xmlChar *name,
215 					 xmlElementContentType type);
216 XMLPUBFUN xmlElementContentPtr XMLCALL
217 		xmlCopyDocElementContent(xmlDocPtr doc,
218 					 xmlElementContentPtr content);
219 XMLPUBFUN void XMLCALL
220 		xmlFreeDocElementContent(xmlDocPtr doc,
221 					 xmlElementContentPtr cur);
222 XMLPUBFUN void XMLCALL
223 		xmlSnprintfElementContent(char *buf,
224 					 int size,
225 	                                 xmlElementContentPtr content,
226 					 int englob);
227 #ifdef LIBXML_OUTPUT_ENABLED
228 /* DEPRECATED */
229 XMLPUBFUN void XMLCALL
230 		xmlSprintfElementContent(char *buf,
231 	                                 xmlElementContentPtr content,
232 					 int englob);
233 #endif /* LIBXML_OUTPUT_ENABLED */
234 /* DEPRECATED */
235 
236 /* Element */
237 XMLPUBFUN xmlElementPtr XMLCALL
238 		xmlAddElementDecl	(xmlValidCtxtPtr ctxt,
239 					 xmlDtdPtr dtd,
240 					 const xmlChar *name,
241 					 xmlElementTypeVal type,
242 					 xmlElementContentPtr content);
243 #ifdef LIBXML_TREE_ENABLED
244 XMLPUBFUN xmlElementTablePtr XMLCALL
245 		xmlCopyElementTable	(xmlElementTablePtr table);
246 #endif /* LIBXML_TREE_ENABLED */
247 XMLPUBFUN void XMLCALL
248 		xmlFreeElementTable	(xmlElementTablePtr table);
249 #ifdef LIBXML_OUTPUT_ENABLED
250 XMLPUBFUN void XMLCALL
251 		xmlDumpElementTable	(xmlBufferPtr buf,
252 					 xmlElementTablePtr table);
253 XMLPUBFUN void XMLCALL
254 		xmlDumpElementDecl	(xmlBufferPtr buf,
255 					 xmlElementPtr elem);
256 #endif /* LIBXML_OUTPUT_ENABLED */
257 
258 /* Enumeration */
259 XMLPUBFUN xmlEnumerationPtr XMLCALL
260 		xmlCreateEnumeration	(const xmlChar *name);
261 XMLPUBFUN void XMLCALL
262 		xmlFreeEnumeration	(xmlEnumerationPtr cur);
263 #ifdef LIBXML_TREE_ENABLED
264 XMLPUBFUN xmlEnumerationPtr XMLCALL
265 		xmlCopyEnumeration	(xmlEnumerationPtr cur);
266 #endif /* LIBXML_TREE_ENABLED */
267 
268 /* Attribute */
269 XMLPUBFUN xmlAttributePtr XMLCALL
270 		xmlAddAttributeDecl	(xmlValidCtxtPtr ctxt,
271 					 xmlDtdPtr dtd,
272 					 const xmlChar *elem,
273 					 const xmlChar *name,
274 					 const xmlChar *ns,
275 					 xmlAttributeType type,
276 					 xmlAttributeDefault def,
277 					 const xmlChar *defaultValue,
278 					 xmlEnumerationPtr tree);
279 #ifdef LIBXML_TREE_ENABLED
280 XMLPUBFUN xmlAttributeTablePtr XMLCALL
281 		xmlCopyAttributeTable  (xmlAttributeTablePtr table);
282 #endif /* LIBXML_TREE_ENABLED */
283 XMLPUBFUN void XMLCALL
284 		xmlFreeAttributeTable  (xmlAttributeTablePtr table);
285 #ifdef LIBXML_OUTPUT_ENABLED
286 XMLPUBFUN void XMLCALL
287 		xmlDumpAttributeTable  (xmlBufferPtr buf,
288 					xmlAttributeTablePtr table);
289 XMLPUBFUN void XMLCALL
290 		xmlDumpAttributeDecl   (xmlBufferPtr buf,
291 					xmlAttributePtr attr);
292 #endif /* LIBXML_OUTPUT_ENABLED */
293 
294 /* IDs */
295 XMLPUBFUN xmlIDPtr XMLCALL
296 		xmlAddID	       (xmlValidCtxtPtr ctxt,
297 					xmlDocPtr doc,
298 					const xmlChar *value,
299 					xmlAttrPtr attr);
300 XMLPUBFUN void XMLCALL
301 		xmlFreeIDTable	       (xmlIDTablePtr table);
302 XMLPUBFUN xmlAttrPtr XMLCALL
303 		xmlGetID	       (xmlDocPtr doc,
304 					const xmlChar *ID);
305 XMLPUBFUN int XMLCALL
306 		xmlIsID		       (xmlDocPtr doc,
307 					xmlNodePtr elem,
308 					xmlAttrPtr attr);
309 XMLPUBFUN int XMLCALL
310 		xmlRemoveID	       (xmlDocPtr doc,
311 					xmlAttrPtr attr);
312 
313 /* IDREFs */
314 XMLPUBFUN xmlRefPtr XMLCALL
315 		xmlAddRef	       (xmlValidCtxtPtr ctxt,
316 					xmlDocPtr doc,
317 					const xmlChar *value,
318 					xmlAttrPtr attr);
319 XMLPUBFUN void XMLCALL
320 		xmlFreeRefTable	       (xmlRefTablePtr table);
321 XMLPUBFUN int XMLCALL
322 		xmlIsRef	       (xmlDocPtr doc,
323 					xmlNodePtr elem,
324 					xmlAttrPtr attr);
325 XMLPUBFUN int XMLCALL
326 		xmlRemoveRef	       (xmlDocPtr doc,
327 					xmlAttrPtr attr);
328 XMLPUBFUN xmlListPtr XMLCALL
329 		xmlGetRefs	       (xmlDocPtr doc,
330 					const xmlChar *ID);
331 
332 /**
333  * The public function calls related to validity checking.
334  */
335 #ifdef LIBXML_VALID_ENABLED
336 /* Allocate/Release Validation Contexts */
337 XMLPUBFUN xmlValidCtxtPtr XMLCALL
338 		xmlNewValidCtxt(void);
339 XMLPUBFUN void XMLCALL
340 		xmlFreeValidCtxt(xmlValidCtxtPtr);
341 
342 XMLPUBFUN int XMLCALL
343 		xmlValidateRoot		(xmlValidCtxtPtr ctxt,
344 					 xmlDocPtr doc);
345 XMLPUBFUN int XMLCALL
346 		xmlValidateElementDecl	(xmlValidCtxtPtr ctxt,
347 					 xmlDocPtr doc,
348 		                         xmlElementPtr elem);
349 XMLPUBFUN xmlChar * XMLCALL
350 		xmlValidNormalizeAttributeValue(xmlDocPtr doc,
351 					 xmlNodePtr elem,
352 					 const xmlChar *name,
353 					 const xmlChar *value);
354 XMLPUBFUN xmlChar * XMLCALL
355 		xmlValidCtxtNormalizeAttributeValue(xmlValidCtxtPtr ctxt,
356 					 xmlDocPtr doc,
357 					 xmlNodePtr elem,
358 					 const xmlChar *name,
359 					 const xmlChar *value);
360 XMLPUBFUN int XMLCALL
361 		xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt,
362 					 xmlDocPtr doc,
363 		                         xmlAttributePtr attr);
364 XMLPUBFUN int XMLCALL
365 		xmlValidateAttributeValue(xmlAttributeType type,
366 					 const xmlChar *value);
367 XMLPUBFUN int XMLCALL
368 		xmlValidateNotationDecl	(xmlValidCtxtPtr ctxt,
369 					 xmlDocPtr doc,
370 		                         xmlNotationPtr nota);
371 XMLPUBFUN int XMLCALL
372 		xmlValidateDtd		(xmlValidCtxtPtr ctxt,
373 					 xmlDocPtr doc,
374 					 xmlDtdPtr dtd);
375 XMLPUBFUN int XMLCALL
376 		xmlValidateDtdFinal	(xmlValidCtxtPtr ctxt,
377 					 xmlDocPtr doc);
378 XMLPUBFUN int XMLCALL
379 		xmlValidateDocument	(xmlValidCtxtPtr ctxt,
380 					 xmlDocPtr doc);
381 XMLPUBFUN int XMLCALL
382 		xmlValidateElement	(xmlValidCtxtPtr ctxt,
383 					 xmlDocPtr doc,
384 					 xmlNodePtr elem);
385 XMLPUBFUN int XMLCALL
386 		xmlValidateOneElement	(xmlValidCtxtPtr ctxt,
387 					 xmlDocPtr doc,
388 		                         xmlNodePtr elem);
389 XMLPUBFUN int XMLCALL
390 		xmlValidateOneAttribute	(xmlValidCtxtPtr ctxt,
391 					 xmlDocPtr doc,
392 					 xmlNodePtr	elem,
393 					 xmlAttrPtr attr,
394 					 const xmlChar *value);
395 XMLPUBFUN int XMLCALL
396 		xmlValidateOneNamespace	(xmlValidCtxtPtr ctxt,
397 					 xmlDocPtr doc,
398 					 xmlNodePtr elem,
399 					 const xmlChar *prefix,
400 					 xmlNsPtr ns,
401 					 const xmlChar *value);
402 XMLPUBFUN int XMLCALL
403 		xmlValidateDocumentFinal(xmlValidCtxtPtr ctxt,
404 					 xmlDocPtr doc);
405 #endif /* LIBXML_VALID_ENABLED */
406 
407 #if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
408 XMLPUBFUN int XMLCALL
409 		xmlValidateNotationUse	(xmlValidCtxtPtr ctxt,
410 					 xmlDocPtr doc,
411 					 const xmlChar *notationName);
412 #endif /* LIBXML_VALID_ENABLED or LIBXML_SCHEMAS_ENABLED */
413 
414 XMLPUBFUN int XMLCALL
415 		xmlIsMixedElement	(xmlDocPtr doc,
416 					 const xmlChar *name);
417 XMLPUBFUN xmlAttributePtr XMLCALL
418 		xmlGetDtdAttrDesc	(xmlDtdPtr dtd,
419 					 const xmlChar *elem,
420 					 const xmlChar *name);
421 XMLPUBFUN xmlAttributePtr XMLCALL
422 		xmlGetDtdQAttrDesc	(xmlDtdPtr dtd,
423 					 const xmlChar *elem,
424 					 const xmlChar *name,
425 					 const xmlChar *prefix);
426 XMLPUBFUN xmlNotationPtr XMLCALL
427 		xmlGetDtdNotationDesc	(xmlDtdPtr dtd,
428 					 const xmlChar *name);
429 XMLPUBFUN xmlElementPtr XMLCALL
430 		xmlGetDtdQElementDesc	(xmlDtdPtr dtd,
431 					 const xmlChar *name,
432 					 const xmlChar *prefix);
433 XMLPUBFUN xmlElementPtr XMLCALL
434 		xmlGetDtdElementDesc	(xmlDtdPtr dtd,
435 					 const xmlChar *name);
436 
437 #ifdef LIBXML_VALID_ENABLED
438 
439 XMLPUBFUN int XMLCALL
440 		xmlValidGetPotentialChildren(xmlElementContent *ctree,
441 					 const xmlChar **names,
442 					 int *len,
443 					 int max);
444 
445 XMLPUBFUN int XMLCALL
446 		xmlValidGetValidElements(xmlNode *prev,
447 					 xmlNode *next,
448 					 const xmlChar **names,
449 					 int max);
450 XMLPUBFUN int XMLCALL
451 		xmlValidateNameValue	(const xmlChar *value);
452 XMLPUBFUN int XMLCALL
453 		xmlValidateNamesValue	(const xmlChar *value);
454 XMLPUBFUN int XMLCALL
455 		xmlValidateNmtokenValue	(const xmlChar *value);
456 XMLPUBFUN int XMLCALL
457 		xmlValidateNmtokensValue(const xmlChar *value);
458 
459 #ifdef LIBXML_REGEXP_ENABLED
460 /*
461  * Validation based on the regexp support
462  */
463 XMLPUBFUN int XMLCALL
464 		xmlValidBuildContentModel(xmlValidCtxtPtr ctxt,
465 					 xmlElementPtr elem);
466 
467 XMLPUBFUN int XMLCALL
468 		xmlValidatePushElement	(xmlValidCtxtPtr ctxt,
469 					 xmlDocPtr doc,
470 					 xmlNodePtr elem,
471 					 const xmlChar *qname);
472 XMLPUBFUN int XMLCALL
473 		xmlValidatePushCData	(xmlValidCtxtPtr ctxt,
474 					 const xmlChar *data,
475 					 int len);
476 XMLPUBFUN int XMLCALL
477 		xmlValidatePopElement	(xmlValidCtxtPtr ctxt,
478 					 xmlDocPtr doc,
479 					 xmlNodePtr elem,
480 					 const xmlChar *qname);
481 #endif /* LIBXML_REGEXP_ENABLED */
482 #endif /* LIBXML_VALID_ENABLED */
483 #ifdef __cplusplus
484 }
485 #endif
486 #endif /* __XML_VALID_H__ */
487