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__ */