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_VCTXT_DTD_VALIDATED: 64 * 65 * Set after xmlValidateDtdFinal was called. 66 */ 67 #define XML_VCTXT_DTD_VALIDATED (1u << 0) 68 /** 69 * XML_VCTXT_USE_PCTXT: 70 * 71 * Set if the validation context is part of a parser context. 72 */ 73 #define XML_VCTXT_USE_PCTXT (1u << 1) 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 flags; /* internal flags */ 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 XML_DEPRECATED 287 XMLPUBFUN xmlRefPtr XMLCALL 288 xmlAddRef (xmlValidCtxtPtr ctxt, 289 xmlDocPtr doc, 290 const xmlChar *value, 291 xmlAttrPtr attr); 292 XML_DEPRECATED 293 XMLPUBFUN void XMLCALL 294 xmlFreeRefTable (xmlRefTablePtr table); 295 XML_DEPRECATED 296 XMLPUBFUN int XMLCALL 297 xmlIsRef (xmlDocPtr doc, 298 xmlNodePtr elem, 299 xmlAttrPtr attr); 300 XML_DEPRECATED 301 XMLPUBFUN int XMLCALL 302 xmlRemoveRef (xmlDocPtr doc, 303 xmlAttrPtr attr); 304 XML_DEPRECATED 305 XMLPUBFUN xmlListPtr XMLCALL 306 xmlGetRefs (xmlDocPtr doc, 307 const xmlChar *ID); 308 309 /** 310 * The public function calls related to validity checking. 311 */ 312 #ifdef LIBXML_VALID_ENABLED 313 /* Allocate/Release Validation Contexts */ 314 XMLPUBFUN xmlValidCtxtPtr XMLCALL 315 xmlNewValidCtxt(void); 316 XMLPUBFUN void XMLCALL 317 xmlFreeValidCtxt(xmlValidCtxtPtr); 318 319 XMLPUBFUN int XMLCALL 320 xmlValidateRoot (xmlValidCtxtPtr ctxt, 321 xmlDocPtr doc); 322 XMLPUBFUN int XMLCALL 323 xmlValidateElementDecl (xmlValidCtxtPtr ctxt, 324 xmlDocPtr doc, 325 xmlElementPtr elem); 326 XMLPUBFUN xmlChar * XMLCALL 327 xmlValidNormalizeAttributeValue(xmlDocPtr doc, 328 xmlNodePtr elem, 329 const xmlChar *name, 330 const xmlChar *value); 331 XMLPUBFUN xmlChar * XMLCALL 332 xmlValidCtxtNormalizeAttributeValue(xmlValidCtxtPtr ctxt, 333 xmlDocPtr doc, 334 xmlNodePtr elem, 335 const xmlChar *name, 336 const xmlChar *value); 337 XMLPUBFUN int XMLCALL 338 xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt, 339 xmlDocPtr doc, 340 xmlAttributePtr attr); 341 XMLPUBFUN int XMLCALL 342 xmlValidateAttributeValue(xmlAttributeType type, 343 const xmlChar *value); 344 XMLPUBFUN int XMLCALL 345 xmlValidateNotationDecl (xmlValidCtxtPtr ctxt, 346 xmlDocPtr doc, 347 xmlNotationPtr nota); 348 XMLPUBFUN int XMLCALL 349 xmlValidateDtd (xmlValidCtxtPtr ctxt, 350 xmlDocPtr doc, 351 xmlDtdPtr dtd); 352 XMLPUBFUN int XMLCALL 353 xmlValidateDtdFinal (xmlValidCtxtPtr ctxt, 354 xmlDocPtr doc); 355 XMLPUBFUN int XMLCALL 356 xmlValidateDocument (xmlValidCtxtPtr ctxt, 357 xmlDocPtr doc); 358 XMLPUBFUN int XMLCALL 359 xmlValidateElement (xmlValidCtxtPtr ctxt, 360 xmlDocPtr doc, 361 xmlNodePtr elem); 362 XMLPUBFUN int XMLCALL 363 xmlValidateOneElement (xmlValidCtxtPtr ctxt, 364 xmlDocPtr doc, 365 xmlNodePtr elem); 366 XMLPUBFUN int XMLCALL 367 xmlValidateOneAttribute (xmlValidCtxtPtr ctxt, 368 xmlDocPtr doc, 369 xmlNodePtr elem, 370 xmlAttrPtr attr, 371 const xmlChar *value); 372 XMLPUBFUN int XMLCALL 373 xmlValidateOneNamespace (xmlValidCtxtPtr ctxt, 374 xmlDocPtr doc, 375 xmlNodePtr elem, 376 const xmlChar *prefix, 377 xmlNsPtr ns, 378 const xmlChar *value); 379 XMLPUBFUN int XMLCALL 380 xmlValidateDocumentFinal(xmlValidCtxtPtr ctxt, 381 xmlDocPtr doc); 382 #endif /* LIBXML_VALID_ENABLED */ 383 384 #if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) 385 XMLPUBFUN int XMLCALL 386 xmlValidateNotationUse (xmlValidCtxtPtr ctxt, 387 xmlDocPtr doc, 388 const xmlChar *notationName); 389 #endif /* LIBXML_VALID_ENABLED or LIBXML_SCHEMAS_ENABLED */ 390 391 XMLPUBFUN int XMLCALL 392 xmlIsMixedElement (xmlDocPtr doc, 393 const xmlChar *name); 394 XMLPUBFUN xmlAttributePtr XMLCALL 395 xmlGetDtdAttrDesc (xmlDtdPtr dtd, 396 const xmlChar *elem, 397 const xmlChar *name); 398 XMLPUBFUN xmlAttributePtr XMLCALL 399 xmlGetDtdQAttrDesc (xmlDtdPtr dtd, 400 const xmlChar *elem, 401 const xmlChar *name, 402 const xmlChar *prefix); 403 XMLPUBFUN xmlNotationPtr XMLCALL 404 xmlGetDtdNotationDesc (xmlDtdPtr dtd, 405 const xmlChar *name); 406 XMLPUBFUN xmlElementPtr XMLCALL 407 xmlGetDtdQElementDesc (xmlDtdPtr dtd, 408 const xmlChar *name, 409 const xmlChar *prefix); 410 XMLPUBFUN xmlElementPtr XMLCALL 411 xmlGetDtdElementDesc (xmlDtdPtr dtd, 412 const xmlChar *name); 413 414 #ifdef LIBXML_VALID_ENABLED 415 416 XMLPUBFUN int XMLCALL 417 xmlValidGetPotentialChildren(xmlElementContent *ctree, 418 const xmlChar **names, 419 int *len, 420 int max); 421 422 XMLPUBFUN int XMLCALL 423 xmlValidGetValidElements(xmlNode *prev, 424 xmlNode *next, 425 const xmlChar **names, 426 int max); 427 XMLPUBFUN int XMLCALL 428 xmlValidateNameValue (const xmlChar *value); 429 XMLPUBFUN int XMLCALL 430 xmlValidateNamesValue (const xmlChar *value); 431 XMLPUBFUN int XMLCALL 432 xmlValidateNmtokenValue (const xmlChar *value); 433 XMLPUBFUN int XMLCALL 434 xmlValidateNmtokensValue(const xmlChar *value); 435 436 #ifdef LIBXML_REGEXP_ENABLED 437 /* 438 * Validation based on the regexp support 439 */ 440 XMLPUBFUN int XMLCALL 441 xmlValidBuildContentModel(xmlValidCtxtPtr ctxt, 442 xmlElementPtr elem); 443 444 XMLPUBFUN int XMLCALL 445 xmlValidatePushElement (xmlValidCtxtPtr ctxt, 446 xmlDocPtr doc, 447 xmlNodePtr elem, 448 const xmlChar *qname); 449 XMLPUBFUN int XMLCALL 450 xmlValidatePushCData (xmlValidCtxtPtr ctxt, 451 const xmlChar *data, 452 int len); 453 XMLPUBFUN int XMLCALL 454 xmlValidatePopElement (xmlValidCtxtPtr ctxt, 455 xmlDocPtr doc, 456 xmlNodePtr elem, 457 const xmlChar *qname); 458 #endif /* LIBXML_REGEXP_ENABLED */ 459 #endif /* LIBXML_VALID_ENABLED */ 460 #ifdef __cplusplus 461 } 462 #endif 463 #endif /* __XML_VALID_H__ */ 464