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