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