Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(166)

Side by Side Diff: third_party/libxml/src/relaxng.c

Issue 1193533007: Upgrade to libxml 2.9.2 and libxslt 1.1.28 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: no iconv Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/libxml/src/pattern.c ('k') | third_party/libxml/src/runsuite.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * relaxng.c : implementation of the Relax-NG handling and validity checking 2 * relaxng.c : implementation of the Relax-NG handling and validity checking
3 * 3 *
4 * See Copyright for the status of this software. 4 * See Copyright for the status of this software.
5 * 5 *
6 * Daniel Veillard <veillard@redhat.com> 6 * Daniel Veillard <veillard@redhat.com>
7 */ 7 */
8 8
9 /** 9 /**
10 * TODO: 10 * TODO:
(...skipping 21 matching lines...) Expand all
32 #include <libxml/xmlautomata.h> 32 #include <libxml/xmlautomata.h>
33 #include <libxml/xmlregexp.h> 33 #include <libxml/xmlregexp.h>
34 #include <libxml/xmlschemastypes.h> 34 #include <libxml/xmlschemastypes.h>
35 35
36 /* 36 /*
37 * The Relax-NG namespace 37 * The Relax-NG namespace
38 */ 38 */
39 static const xmlChar *xmlRelaxNGNs = (const xmlChar *) 39 static const xmlChar *xmlRelaxNGNs = (const xmlChar *)
40 "http://relaxng.org/ns/structure/1.0"; 40 "http://relaxng.org/ns/structure/1.0";
41 41
42 #define IS_RELAXNG(node, type)» » » » » » \ 42 #define IS_RELAXNG(node, typ)» » » » » » \
43 ((node != NULL) && (node->ns != NULL) && \ 43 ((node != NULL) && (node->ns != NULL) && \
44 (xmlStrEqual(node->name, (const xmlChar *) type)) &&» » \ 44 (node->type == XML_ELEMENT_NODE) &&»» » » » \
45 (xmlStrEqual(node->name, (const xmlChar *) typ)) &&»» \
45 (xmlStrEqual(node->ns->href, xmlRelaxNGNs))) 46 (xmlStrEqual(node->ns->href, xmlRelaxNGNs)))
46 47
47 48
48 #if 0 49 #if 0
49 #define DEBUG 1 50 #define DEBUG 1
50 51
51 #define DEBUG_GRAMMAR 1 52 #define DEBUG_GRAMMAR 1
52 53
53 #define DEBUG_CONTENT 1 54 #define DEBUG_CONTENT 1
54 55
55 #define DEBUG_TYPE 1 56 #define DEBUG_TYPE 1
56 57
57 #define DEBUG_VALID 1 58 #define DEBUG_VALID 1
58 59
59 #define DEBUG_INTERLEAVE 1 60 #define DEBUG_INTERLEAVE 1
60 61
61 #define DEBUG_LIST 1 62 #define DEBUG_LIST 1
62 63
63 #define DEBUG_INCLUDE 1 64 #define DEBUG_INCLUDE 1
64 65
65 #define DEBUG_ERROR 1 66 #define DEBUG_ERROR 1
66 67
67 #define DEBUG_COMPILE 1 68 #define DEBUG_COMPILE 1
68 69
69 #define DEBUG_PROGRESSIVE 1 70 #define DEBUG_PROGRESSIVE 1
70 #endif 71 #endif
71 72
72 #define MAX_ERROR 5 73 #define MAX_ERROR 5
73 74
74 #define TODO » » » » » » » » \ 75 #define TODO» » » » » » » » \
75 xmlGenericError(xmlGenericErrorContext, \ 76 xmlGenericError(xmlGenericErrorContext, \
76 "Unimplemented block at %s:%d\n", \ 77 "Unimplemented block at %s:%d\n", \
77 __FILE__, __LINE__); 78 __FILE__, __LINE__);
78 79
79 typedef struct _xmlRelaxNGSchema xmlRelaxNGSchema; 80 typedef struct _xmlRelaxNGSchema xmlRelaxNGSchema;
80 typedef xmlRelaxNGSchema *xmlRelaxNGSchemaPtr; 81 typedef xmlRelaxNGSchema *xmlRelaxNGSchemaPtr;
81 82
82 typedef struct _xmlRelaxNGDefine xmlRelaxNGDefine; 83 typedef struct _xmlRelaxNGDefine xmlRelaxNGDefine;
83 typedef xmlRelaxNGDefine *xmlRelaxNGDefinePtr; 84 typedef xmlRelaxNGDefine *xmlRelaxNGDefinePtr;
84 85
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 xmlChar *href; /* the normalized href value */ 415 xmlChar *href; /* the normalized href value */
415 xmlDocPtr doc; /* the associated XML document */ 416 xmlDocPtr doc; /* the associated XML document */
416 xmlRelaxNGDefinePtr content; /* the definitions */ 417 xmlRelaxNGDefinePtr content; /* the definitions */
417 xmlRelaxNGPtr schema; /* the schema */ 418 xmlRelaxNGPtr schema; /* the schema */
418 int externalRef; /* 1 if an external ref */ 419 int externalRef; /* 1 if an external ref */
419 }; 420 };
420 421
421 422
422 /************************************************************************ 423 /************************************************************************
423 * * 424 * *
424 * » » Some factorized error routines» » » » * 425 *» » Some factorized error routines» » » » *
425 * * 426 * *
426 ************************************************************************/ 427 ************************************************************************/
427 428
428 /** 429 /**
429 * xmlRngPErrMemory: 430 * xmlRngPErrMemory:
430 * @ctxt: an Relax-NG parser context 431 * @ctxt: an Relax-NG parser context
431 * @extra: extra informations 432 * @extra: extra informations
432 * 433 *
433 * Handle a redefinition of attribute error 434 * Handle a redefinition of attribute error
434 */ 435 */
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 ctxt->nbErrors++; 558 ctxt->nbErrors++;
558 } 559 }
559 __xmlRaiseError(schannel, channel, data, 560 __xmlRaiseError(schannel, channel, data,
560 NULL, node, XML_FROM_RELAXNGV, 561 NULL, node, XML_FROM_RELAXNGV,
561 error, XML_ERR_ERROR, NULL, 0, 562 error, XML_ERR_ERROR, NULL, 0,
562 (const char *) str1, (const char *) str2, NULL, 0, 0, 563 (const char *) str1, (const char *) str2, NULL, 0, 0,
563 msg, str1, str2); 564 msg, str1, str2);
564 } 565 }
565 566
566 /************************************************************************ 567 /************************************************************************
567 * » » » » » » » » » * 568 *» » » » » » » » » *
568 * » » Preliminary type checking interfaces» » » * 569 *» » Preliminary type checking interfaces» » » *
569 * » » » » » » » » » * 570 *» » » » » » » » » *
570 ************************************************************************/ 571 ************************************************************************/
571 572
572 /** 573 /**
573 * xmlRelaxNGTypeHave: 574 * xmlRelaxNGTypeHave:
574 * @data: data needed for the library 575 * @data: data needed for the library
575 * @type: the type name 576 * @type: the type name
576 * @value: the value to check 577 * @value: the value to check
577 * 578 *
578 * Function provided by a type library to check if a type is exported 579 * Function provided by a type library to check if a type is exported
579 * 580 *
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 const xmlChar *namespace; /* the datatypeLibrary value */ 648 const xmlChar *namespace; /* the datatypeLibrary value */
648 void *data; /* data needed for the library */ 649 void *data; /* data needed for the library */
649 xmlRelaxNGTypeHave have; /* the export function */ 650 xmlRelaxNGTypeHave have; /* the export function */
650 xmlRelaxNGTypeCheck check; /* the checking function */ 651 xmlRelaxNGTypeCheck check; /* the checking function */
651 xmlRelaxNGTypeCompare comp; /* the compare function */ 652 xmlRelaxNGTypeCompare comp; /* the compare function */
652 xmlRelaxNGFacetCheck facet; /* the facet check function */ 653 xmlRelaxNGFacetCheck facet; /* the facet check function */
653 xmlRelaxNGTypeFree freef; /* the freeing function */ 654 xmlRelaxNGTypeFree freef; /* the freeing function */
654 }; 655 };
655 656
656 /************************************************************************ 657 /************************************************************************
657 * » » » » » » » » » * 658 *» » » » » » » » » *
658 * » » » Allocation functions» » » » * 659 *» » » Allocation functions» » » » *
659 * » » » » » » » » » * 660 *» » » » » » » » » *
660 ************************************************************************/ 661 ************************************************************************/
661 static void xmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar); 662 static void xmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar);
662 static void xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define); 663 static void xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define);
663 static void xmlRelaxNGNormExtSpace(xmlChar * value); 664 static void xmlRelaxNGNormExtSpace(xmlChar * value);
664 static void xmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema); 665 static void xmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema);
665 static int xmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt 666 static int xmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt
666 ATTRIBUTE_UNUSED, 667 ATTRIBUTE_UNUSED,
667 xmlRelaxNGValidStatePtr state1, 668 xmlRelaxNGValidStatePtr state1,
668 xmlRelaxNGValidStatePtr state2); 669 xmlRelaxNGValidStatePtr state2);
669 static void xmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt, 670 static void xmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt,
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
1087 * 1088 *
1088 * Return 1 in case of success and 0 if this is a duplicate and -1 on error 1089 * Return 1 in case of success and 0 if this is a duplicate and -1 on error
1089 */ 1090 */
1090 static int 1091 static int
1091 xmlRelaxNGAddStates(xmlRelaxNGValidCtxtPtr ctxt, 1092 xmlRelaxNGAddStates(xmlRelaxNGValidCtxtPtr ctxt,
1092 xmlRelaxNGStatesPtr states, 1093 xmlRelaxNGStatesPtr states,
1093 xmlRelaxNGValidStatePtr state) 1094 xmlRelaxNGValidStatePtr state)
1094 { 1095 {
1095 int i; 1096 int i;
1096 1097
1097 if (state == NULL) { 1098 if (state == NULL || states == NULL) {
1098 return (-1); 1099 return (-1);
1099 } 1100 }
1100 if (states->nbState >= states->maxState) { 1101 if (states->nbState >= states->maxState) {
1101 xmlRelaxNGValidStatePtr *tmp; 1102 xmlRelaxNGValidStatePtr *tmp;
1102 int size; 1103 int size;
1103 1104
1104 size = states->maxState * 2; 1105 size = states->maxState * 2;
1105 tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState, 1106 tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState,
1106 (size) * 1107 (size) *
1107 sizeof 1108 sizeof
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
1390 if ((ctxt == NULL) || (ctxt->freeState == NULL)) { 1391 if ((ctxt == NULL) || (ctxt->freeState == NULL)) {
1391 if (state->attrs != NULL) 1392 if (state->attrs != NULL)
1392 xmlFree(state->attrs); 1393 xmlFree(state->attrs);
1393 xmlFree(state); 1394 xmlFree(state);
1394 } else { 1395 } else {
1395 xmlRelaxNGAddStatesUniq(ctxt, ctxt->freeState, state); 1396 xmlRelaxNGAddStatesUniq(ctxt, ctxt->freeState, state);
1396 } 1397 }
1397 } 1398 }
1398 1399
1399 /************************************************************************ 1400 /************************************************************************
1400 * » » » » » » » » » * 1401 *» » » » » » » » » *
1401 * » » » Semi internal functions»» » » * 1402 *» » » Semi internal functions»» » » *
1402 * » » » » » » » » » * 1403 *» » » » » » » » » *
1403 ************************************************************************/ 1404 ************************************************************************/
1404 1405
1405 /** 1406 /**
1406 * xmlRelaxParserSetFlag: 1407 * xmlRelaxParserSetFlag:
1407 * @ctxt: a RelaxNG parser context 1408 * @ctxt: a RelaxNG parser context
1408 * @flags: a set of flags values 1409 * @flags: a set of flags values
1409 * 1410 *
1410 * Semi private function used to pass informations to a parser context 1411 * Semi private function used to pass informations to a parser context
1411 * which are a combination of xmlRelaxNGParserFlag . 1412 * which are a combination of xmlRelaxNGParserFlag .
1412 * 1413 *
1413 * Returns 0 if success and -1 in case of error 1414 * Returns 0 if success and -1 in case of error
1414 */ 1415 */
1415 int 1416 int
1416 xmlRelaxParserSetFlag(xmlRelaxNGParserCtxtPtr ctxt, int flags) 1417 xmlRelaxParserSetFlag(xmlRelaxNGParserCtxtPtr ctxt, int flags)
1417 { 1418 {
1418 if (ctxt == NULL) return(-1); 1419 if (ctxt == NULL) return(-1);
1419 if (flags & XML_RELAXNGP_FREE_DOC) { 1420 if (flags & XML_RELAXNGP_FREE_DOC) {
1420 ctxt->crng |= XML_RELAXNGP_FREE_DOC; 1421 ctxt->crng |= XML_RELAXNGP_FREE_DOC;
1421 flags -= XML_RELAXNGP_FREE_DOC; 1422 flags -= XML_RELAXNGP_FREE_DOC;
1422 } 1423 }
1423 if (flags & XML_RELAXNGP_CRNG) { 1424 if (flags & XML_RELAXNGP_CRNG) {
1424 ctxt->crng |= XML_RELAXNGP_CRNG; 1425 ctxt->crng |= XML_RELAXNGP_CRNG;
1425 flags -= XML_RELAXNGP_CRNG; 1426 flags -= XML_RELAXNGP_CRNG;
1426 } 1427 }
1427 if (flags != 0) return(-1); 1428 if (flags != 0) return(-1);
1428 return(0); 1429 return(0);
1429 } 1430 }
1430 1431
1431 /************************************************************************ 1432 /************************************************************************
1432 * » » » » » » » » » * 1433 *» » » » » » » » » *
1433 * » » » Document functions» » » » * 1434 *» » » Document functions» » » » *
1434 * » » » » » » » » » * 1435 *» » » » » » » » » *
1435 ************************************************************************/ 1436 ************************************************************************/
1436 static xmlDocPtr xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, 1437 static xmlDocPtr xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt,
1437 xmlDocPtr doc); 1438 xmlDocPtr doc);
1438 1439
1439 /** 1440 /**
1440 * xmlRelaxNGIncludePush: 1441 * xmlRelaxNGIncludePush:
1441 * @ctxt: the parser context 1442 * @ctxt: the parser context
1442 * @value: the element doc 1443 * @value: the element doc
1443 * 1444 *
1444 * Pushes a new include on top of the include stack 1445 * Pushes a new include on top of the include stack
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1554 1555
1555 if ((inc != NULL) && (inc->doc != NULL) && 1556 if ((inc != NULL) && (inc->doc != NULL) &&
1556 (inc->doc->children != NULL)) { 1557 (inc->doc->children != NULL)) {
1557 1558
1558 if (xmlStrEqual 1559 if (xmlStrEqual
1559 (inc->doc->children->name, BAD_CAST "grammar")) { 1560 (inc->doc->children->name, BAD_CAST "grammar")) {
1560 #ifdef DEBUG_INCLUDE 1561 #ifdef DEBUG_INCLUDE
1561 href = xmlGetProp(tmp, BAD_CAST "href"); 1562 href = xmlGetProp(tmp, BAD_CAST "href");
1562 #endif 1563 #endif
1563 if (xmlRelaxNGRemoveRedefine(ctxt, href, 1564 if (xmlRelaxNGRemoveRedefine(ctxt, href,
1564 inc->doc->children-> 1565 xmlDocGetRootElement(inc->doc)- >children,
1565 children, name) == 1) { 1566 name) == 1) {
1566 found = 1; 1567 found = 1;
1567 } 1568 }
1568 #ifdef DEBUG_INCLUDE 1569 #ifdef DEBUG_INCLUDE
1569 if (href != NULL) 1570 if (href != NULL)
1570 xmlFree(href); 1571 xmlFree(href);
1571 #endif 1572 #endif
1572 } 1573 }
1573 } 1574 }
1574 } 1575 }
1575 tmp = tmp2; 1576 tmp = tmp2;
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after
2000 ctxt->doc = NULL; 2001 ctxt->doc = NULL;
2001 return (NULL); 2002 return (NULL);
2002 } 2003 }
2003 2004
2004 xmlRelaxNGDocumentPop(ctxt); 2005 xmlRelaxNGDocumentPop(ctxt);
2005 2006
2006 return (ret); 2007 return (ret);
2007 } 2008 }
2008 2009
2009 /************************************************************************ 2010 /************************************************************************
2010 * » » » » » » » » » * 2011 *» » » » » » » » » *
2011 * » » » Error functions»» » » » * 2012 *» » » Error functions»» » » » *
2012 * » » » » » » » » » * 2013 *» » » » » » » » » *
2013 ************************************************************************/ 2014 ************************************************************************/
2014 2015
2015 #define VALID_ERR(a) xmlRelaxNGAddValidError(ctxt, a, NULL, NULL, 0); 2016 #define VALID_ERR(a) xmlRelaxNGAddValidError(ctxt, a, NULL, NULL, 0);
2016 #define VALID_ERR2(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 0); 2017 #define VALID_ERR2(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 0);
2017 #define VALID_ERR3(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 0); 2018 #define VALID_ERR3(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 0);
2018 #define VALID_ERR2P(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 1); 2019 #define VALID_ERR2P(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 1);
2019 #define VALID_ERR3P(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 1); 2020 #define VALID_ERR3P(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 1);
2020 2021
2021 static const char * 2022 static const char *
2022 xmlRelaxNGDefName(xmlRelaxNGDefinePtr def) 2023 xmlRelaxNGDefName(xmlRelaxNGDefinePtr def)
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
2353 if (ctxt->flags & FLAGS_NOERROR) 2354 if (ctxt->flags & FLAGS_NOERROR)
2354 return; 2355 return;
2355 2356
2356 #ifdef DEBUG_ERROR 2357 #ifdef DEBUG_ERROR
2357 xmlGenericError(xmlGenericErrorContext, "Adding error %d\n", err); 2358 xmlGenericError(xmlGenericErrorContext, "Adding error %d\n", err);
2358 #endif 2359 #endif
2359 /* 2360 /*
2360 * generate the error directly 2361 * generate the error directly
2361 */ 2362 */
2362 if (((ctxt->flags & FLAGS_IGNORABLE) == 0) || 2363 if (((ctxt->flags & FLAGS_IGNORABLE) == 0) ||
2363 » (ctxt->flags & FLAGS_NEGATIVE)) { 2364 » (ctxt->flags & FLAGS_NEGATIVE)) {
2364 xmlNodePtr node, seq; 2365 xmlNodePtr node, seq;
2365 2366
2366 /* 2367 /*
2367 * Flush first any stacked error which might be the 2368 * Flush first any stacked error which might be the
2368 * real cause of the problem. 2369 * real cause of the problem.
2369 */ 2370 */
2370 if (ctxt->errNr != 0) 2371 if (ctxt->errNr != 0)
2371 xmlRelaxNGDumpValidError(ctxt); 2372 xmlRelaxNGDumpValidError(ctxt);
2372 if (ctxt->state != NULL) { 2373 if (ctxt->state != NULL) {
2373 node = ctxt->state->node; 2374 node = ctxt->state->node;
2374 seq = ctxt->state->seq; 2375 seq = ctxt->state->seq;
2375 } else { 2376 } else {
2376 node = seq = NULL; 2377 node = seq = NULL;
2377 } 2378 }
2378 if ((node == NULL) && (seq == NULL)) { 2379 if ((node == NULL) && (seq == NULL)) {
2379 node = ctxt->pnode; 2380 node = ctxt->pnode;
2380 } 2381 }
2381 xmlRelaxNGShowValidError(ctxt, err, node, seq, arg1, arg2); 2382 xmlRelaxNGShowValidError(ctxt, err, node, seq, arg1, arg2);
2382 } 2383 }
2383 /* 2384 /*
2384 * Stack the error for later processing if needed 2385 * Stack the error for later processing if needed
2385 */ 2386 */
2386 else { 2387 else {
2387 xmlRelaxNGValidErrorPush(ctxt, err, arg1, arg2, dup); 2388 xmlRelaxNGValidErrorPush(ctxt, err, arg1, arg2, dup);
2388 } 2389 }
2389 } 2390 }
2390 2391
2391 2392
2392 /************************************************************************ 2393 /************************************************************************
2393 * » » » » » » » » » * 2394 *» » » » » » » » » *
2394 * » » » Type library hooks» » » » * 2395 *» » » Type library hooks» » » » *
2395 * » » » » » » » » » * 2396 *» » » » » » » » » *
2396 ************************************************************************/ 2397 ************************************************************************/
2397 static xmlChar *xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, 2398 static xmlChar *xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt,
2398 const xmlChar * str); 2399 const xmlChar * str);
2399 2400
2400 /** 2401 /**
2401 * xmlRelaxNGSchemaTypeHave: 2402 * xmlRelaxNGSchemaTypeHave:
2402 * @data: data needed for the library 2403 * @data: data needed for the library
2403 * @type: the type name 2404 * @type: the type name
2404 * 2405 *
2405 * Check if the given type is provided by 2406 * Check if the given type is provided by
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
2587 ret = xmlSchemaValPredefTypeNode(typ, value1, &res1, ctxt1); 2588 ret = xmlSchemaValPredefTypeNode(typ, value1, &res1, ctxt1);
2588 if (ret != 0) 2589 if (ret != 0)
2589 return (-1); 2590 return (-1);
2590 if (res1 == NULL) 2591 if (res1 == NULL)
2591 return (-1); 2592 return (-1);
2592 } else { 2593 } else {
2593 res1 = (xmlSchemaValPtr) comp1; 2594 res1 = (xmlSchemaValPtr) comp1;
2594 } 2595 }
2595 ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, ctxt2); 2596 ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, ctxt2);
2596 if (ret != 0) { 2597 if (ret != 0) {
2597 » if ((comp1 == NULL) && (res1 != NULL)) 2598 » if (res1 != (xmlSchemaValPtr) comp1)
2598 xmlSchemaFreeValue(res1); 2599 xmlSchemaFreeValue(res1);
2599 return (-1); 2600 return (-1);
2600 } 2601 }
2601 if (res1 == NULL) {
2602 return (-1);
2603 }
2604 ret = xmlSchemaCompareValues(res1, res2); 2602 ret = xmlSchemaCompareValues(res1, res2);
2605 if (res1 != (xmlSchemaValPtr) comp1) 2603 if (res1 != (xmlSchemaValPtr) comp1)
2606 xmlSchemaFreeValue(res1); 2604 xmlSchemaFreeValue(res1);
2607 xmlSchemaFreeValue(res2); 2605 xmlSchemaFreeValue(res2);
2608 if (ret == -2) 2606 if (ret == -2)
2609 return (-1); 2607 return (-1);
2610 if (ret == 0) 2608 if (ret == 0)
2611 return (1); 2609 return (1);
2612 return (0); 2610 return (0);
2613 } 2611 }
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
2840 { 2838 {
2841 xmlSchemaCleanupTypes(); 2839 xmlSchemaCleanupTypes();
2842 if (xmlRelaxNGTypeInitialized == 0) 2840 if (xmlRelaxNGTypeInitialized == 0)
2843 return; 2841 return;
2844 xmlHashFree(xmlRelaxNGRegisteredTypes, (xmlHashDeallocator) 2842 xmlHashFree(xmlRelaxNGRegisteredTypes, (xmlHashDeallocator)
2845 xmlRelaxNGFreeTypeLibrary); 2843 xmlRelaxNGFreeTypeLibrary);
2846 xmlRelaxNGTypeInitialized = 0; 2844 xmlRelaxNGTypeInitialized = 0;
2847 } 2845 }
2848 2846
2849 /************************************************************************ 2847 /************************************************************************
2850 * » » » » » » » » » * 2848 *» » » » » » » » » *
2851 * » » Compiling element content into regexp» » » * 2849 *» » Compiling element content into regexp» » » *
2852 * » » » » » » » » » * 2850 *» » » » » » » » » *
2853 * Sometime the element content can be compiled into a pure regexp, * 2851 * Sometime the element content can be compiled into a pure regexp, *
2854 * This allows a faster execution and streamability at that level * 2852 * This allows a faster execution and streamability at that level *
2855 * » » » » » » » » » * 2853 *» » » » » » » » » *
2856 ************************************************************************/ 2854 ************************************************************************/
2857 2855
2858 /* from automata.c but not exported */ 2856 /* from automata.c but not exported */
2859 void xmlAutomataSetFlags(xmlAutomataPtr am, int flags); 2857 void xmlAutomataSetFlags(xmlAutomataPtr am, int flags);
2860 2858
2861 2859
2862 static int xmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt, 2860 static int xmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt,
2863 xmlRelaxNGDefinePtr def); 2861 xmlRelaxNGDefinePtr def);
2864 2862
2865 /** 2863 /**
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
3052 * thing of exploring both choices. 3050 * thing of exploring both choices.
3053 */ 3051 */
3054 xmlAutomataSetFlags(ctxt->am, 1); 3052 xmlAutomataSetFlags(ctxt->am, 1);
3055 3053
3056 ctxt->state = xmlAutomataGetInitState(ctxt->am); 3054 ctxt->state = xmlAutomataGetInitState(ctxt->am);
3057 while (list != NULL) { 3055 while (list != NULL) {
3058 xmlRelaxNGCompile(ctxt, list); 3056 xmlRelaxNGCompile(ctxt, list);
3059 list = list->next; 3057 list = list->next;
3060 } 3058 }
3061 xmlAutomataSetFinalState(ctxt->am, ctxt->state); 3059 xmlAutomataSetFinalState(ctxt->am, ctxt->state);
3062 def->contModel = xmlAutomataCompile(ctxt->am); 3060 if (xmlAutomataIsDeterminist(ctxt->am))
3063 xmlRegexpIsDeterminist(def->contModel); 3061 def->contModel = xmlAutomataCompile(ctxt->am);
3064 3062
3065 xmlFreeAutomata(ctxt->am); 3063 xmlFreeAutomata(ctxt->am);
3066 ctxt->state = oldstate; 3064 ctxt->state = oldstate;
3067 ctxt->am = oldam; 3065 ctxt->am = oldam;
3068 } 3066 }
3069 break; 3067 break;
3070 case XML_RELAXNG_ELEMENT: 3068 case XML_RELAXNG_ELEMENT:
3071 if ((ctxt->am != NULL) && (def->name != NULL)) { 3069 if ((ctxt->am != NULL) && (def->name != NULL)) {
3072 ctxt->state = xmlAutomataNewTransition2(ctxt->am, 3070 ctxt->state = xmlAutomataNewTransition2(ctxt->am,
3073 ctxt->state, NULL, 3071 ctxt->state, NULL,
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
3318 case XML_RELAXNG_ATTRIBUTE: 3316 case XML_RELAXNG_ATTRIBUTE:
3319 case XML_RELAXNG_INTERLEAVE: 3317 case XML_RELAXNG_INTERLEAVE:
3320 case XML_RELAXNG_NOT_ALLOWED: 3318 case XML_RELAXNG_NOT_ALLOWED:
3321 ret = 0; 3319 ret = 0;
3322 break; 3320 break;
3323 } 3321 }
3324 return (ret); 3322 return (ret);
3325 } 3323 }
3326 3324
3327 /************************************************************************ 3325 /************************************************************************
3328 * » » » » » » » » » * 3326 *» » » » » » » » » *
3329 * » » » Parsing functions» » » » * 3327 *» » » Parsing functions» » » » *
3330 * » » » » » » » » » * 3328 *» » » » » » » » » *
3331 ************************************************************************/ 3329 ************************************************************************/
3332 3330
3333 static xmlRelaxNGDefinePtr xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr 3331 static xmlRelaxNGDefinePtr xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr
3334 ctxt, xmlNodePtr node); 3332 ctxt, xmlNodePtr node);
3335 static xmlRelaxNGDefinePtr xmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr 3333 static xmlRelaxNGDefinePtr xmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr
3336 ctxt, xmlNodePtr node); 3334 ctxt, xmlNodePtr node);
3337 static xmlRelaxNGDefinePtr xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr 3335 static xmlRelaxNGDefinePtr xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr
3338 ctxt, xmlNodePtr nodes, 3336 ctxt, xmlNodePtr nodes,
3339 int group); 3337 int group);
3340 static xmlRelaxNGDefinePtr xmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr 3338 static xmlRelaxNGDefinePtr xmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr
(...skipping 3254 matching lines...) Expand 10 before | Expand all | Expand 10 after
6595 ctxt->grammar = ret; 6593 ctxt->grammar = ret;
6596 if (ctxt->grammar == NULL) { 6594 if (ctxt->grammar == NULL) {
6597 xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_CONTENT, 6595 xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_CONTENT,
6598 "Failed to parse <grammar> content\n", NULL, NULL); 6596 "Failed to parse <grammar> content\n", NULL, NULL);
6599 } else if (ctxt->grammar->start == NULL) { 6597 } else if (ctxt->grammar->start == NULL) {
6600 xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_NO_START, 6598 xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_NO_START,
6601 "Element <grammar> has no <start>\n", NULL, NULL); 6599 "Element <grammar> has no <start>\n", NULL, NULL);
6602 } 6600 }
6603 6601
6604 /* 6602 /*
6605 * Apply 4.17 mergingd rules to defines and starts 6603 * Apply 4.17 merging rules to defines and starts
6606 */ 6604 */
6607 xmlRelaxNGCombineStart(ctxt, ret); 6605 xmlRelaxNGCombineStart(ctxt, ret);
6608 if (ret->defs != NULL) { 6606 if (ret->defs != NULL) {
6609 xmlHashScan(ret->defs, (xmlHashScanner) xmlRelaxNGCheckCombine, 6607 xmlHashScan(ret->defs, (xmlHashScanner) xmlRelaxNGCheckCombine,
6610 ctxt); 6608 ctxt);
6611 } 6609 }
6612 6610
6613 /* 6611 /*
6614 * link together defines and refs in this grammar 6612 * link together defines and refs in this grammar
6615 */ 6613 */
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
6647 return (NULL); 6645 return (NULL);
6648 6646
6649 schema = xmlRelaxNGNewRelaxNG(ctxt); 6647 schema = xmlRelaxNGNewRelaxNG(ctxt);
6650 if (schema == NULL) 6648 if (schema == NULL)
6651 return (NULL); 6649 return (NULL);
6652 6650
6653 olddefine = ctxt->define; 6651 olddefine = ctxt->define;
6654 ctxt->define = NULL; 6652 ctxt->define = NULL;
6655 if (IS_RELAXNG(node, "grammar")) { 6653 if (IS_RELAXNG(node, "grammar")) {
6656 schema->topgrammar = xmlRelaxNGParseGrammar(ctxt, node->children); 6654 schema->topgrammar = xmlRelaxNGParseGrammar(ctxt, node->children);
6655 if (schema->topgrammar == NULL) {
6656 xmlRelaxNGFree(schema);
6657 return (NULL);
6658 }
6657 } else { 6659 } else {
6658 xmlRelaxNGGrammarPtr tmp, ret; 6660 xmlRelaxNGGrammarPtr tmp, ret;
6659 6661
6660 schema->topgrammar = ret = xmlRelaxNGNewGrammar(ctxt); 6662 schema->topgrammar = ret = xmlRelaxNGNewGrammar(ctxt);
6661 if (schema->topgrammar == NULL) { 6663 if (schema->topgrammar == NULL) {
6662 return (schema); 6664 xmlRelaxNGFree(schema);
6665 return (NULL);
6663 } 6666 }
6664 /* 6667 /*
6665 * Link the new grammar in the tree 6668 * Link the new grammar in the tree
6666 */ 6669 */
6667 ret->parent = ctxt->grammar; 6670 ret->parent = ctxt->grammar;
6668 if (ctxt->grammar != NULL) { 6671 if (ctxt->grammar != NULL) {
6669 tmp = ctxt->grammar->children; 6672 tmp = ctxt->grammar->children;
6670 if (tmp == NULL) { 6673 if (tmp == NULL) {
6671 ctxt->grammar->children = ret; 6674 ctxt->grammar->children = ret;
6672 } else { 6675 } else {
(...skipping 25 matching lines...) Expand all
6698 #ifdef DEBUG 6701 #ifdef DEBUG
6699 if (schema == NULL) 6702 if (schema == NULL)
6700 xmlGenericError(xmlGenericErrorContext, 6703 xmlGenericError(xmlGenericErrorContext,
6701 "xmlRelaxNGParseDocument() failed\n"); 6704 "xmlRelaxNGParseDocument() failed\n");
6702 #endif 6705 #endif
6703 6706
6704 return (schema); 6707 return (schema);
6705 } 6708 }
6706 6709
6707 /************************************************************************ 6710 /************************************************************************
6708 * » » » » » » » » » * 6711 *» » » » » » » » » *
6709 * » » » Reading RelaxNGs» » » » * 6712 *» » » Reading RelaxNGs» » » » *
6710 * » » » » » » » » » * 6713 *» » » » » » » » » *
6711 ************************************************************************/ 6714 ************************************************************************/
6712 6715
6713 /** 6716 /**
6714 * xmlRelaxNGNewParserCtxt: 6717 * xmlRelaxNGNewParserCtxt:
6715 * @URL: the location of the schema 6718 * @URL: the location of the schema
6716 * 6719 *
6717 * Create an XML RelaxNGs parse context for that file/resource expected 6720 * Create an XML RelaxNGs parse context for that file/resource expected
6718 * to contain an XML RelaxNGs file. 6721 * to contain an XML RelaxNGs file.
6719 * 6722 *
6720 * Returns the parser context or NULL in case of error 6723 * Returns the parser context or NULL in case of error
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after
7309 "Found anyName/except//anyName forbidden cons truct\n", 7312 "Found anyName/except//anyName forbidden cons truct\n",
7310 NULL, NULL); 7313 NULL, NULL);
7311 } else if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) { 7314 } else if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) {
7312 xmlRngPErr(ctxt, cur, 7315 xmlRngPErr(ctxt, cur,
7313 XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME, 7316 XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME,
7314 "Found nsName/except//anyName forbidden const ruct\n", 7317 "Found nsName/except//anyName forbidden const ruct\n",
7315 NULL, NULL); 7318 NULL, NULL);
7316 } 7319 }
7317 } 7320 }
7318 /* 7321 /*
7319 * Thisd is not an else since "include" is transformed 7322 * This is not an else since "include" is transformed
7320 * into a div 7323 * into a div
7321 */ 7324 */
7322 if (xmlStrEqual(cur->name, BAD_CAST "div")) { 7325 if (xmlStrEqual(cur->name, BAD_CAST "div")) {
7323 xmlChar *ns; 7326 xmlChar *ns;
7324 xmlNodePtr child, ins, tmp; 7327 xmlNodePtr child, ins, tmp;
7325 7328
7326 /* 7329 /*
7327 * implements rule 4.11 7330 * implements rule 4.11
7328 */ 7331 */
7329 7332
7330 ns = xmlGetProp(cur, BAD_CAST "ns"); 7333 ns = xmlGetProp(cur, BAD_CAST "ns");
7331 7334
7332 child = cur->children; 7335 child = cur->children;
7333 ins = cur; 7336 ins = cur;
7334 while (child != NULL) { 7337 while (child != NULL) {
7335 if (ns != NULL) { 7338 if (ns != NULL) {
7336 if (!xmlHasProp(child, BAD_CAST "ns")) { 7339 if (!xmlHasProp(child, BAD_CAST "ns")) {
7337 xmlSetProp(child, BAD_CAST "ns", ns); 7340 xmlSetProp(child, BAD_CAST "ns", ns);
7338 } 7341 }
7339 } 7342 }
7340 tmp = child->next; 7343 tmp = child->next;
7341 xmlUnlinkNode(child); 7344 xmlUnlinkNode(child);
7342 ins = xmlAddNextSibling(ins, child); 7345 ins = xmlAddNextSibling(ins, child);
7343 child = tmp; 7346 child = tmp;
7344 } 7347 }
7345 if (ns != NULL) 7348 if (ns != NULL)
7346 xmlFree(ns); 7349 xmlFree(ns);
7347 /* 7350 /*
7348 » » * Since we are about to delete cur, if it's nsDef is non-NU LL we 7351 » » * Since we are about to delete cur, if its nsDef is non-NUL L we
7349 * need to preserve it (it contains the ns definitions for t he 7352 * need to preserve it (it contains the ns definitions for t he
7350 * children we just moved). We'll just stick it on to the e nd 7353 * children we just moved). We'll just stick it on to the e nd
7351 * of cur->parent's list, since it's never going to be re-se rialized 7354 * of cur->parent's list, since it's never going to be re-se rialized
7352 * (bug 143738). 7355 * (bug 143738).
7353 */ 7356 */
7354 » » if (cur->nsDef != NULL) { 7357 » » if ((cur->nsDef != NULL) && (cur->parent != NULL)) {
7355 xmlNsPtr parDef = (xmlNsPtr)&cur->parent->nsDef; 7358 xmlNsPtr parDef = (xmlNsPtr)&cur->parent->nsDef;
7356 while (parDef->next != NULL) 7359 while (parDef->next != NULL)
7357 parDef = parDef->next; 7360 parDef = parDef->next;
7358 parDef->next = cur->nsDef; 7361 parDef->next = cur->nsDef;
7359 cur->nsDef = NULL; 7362 cur->nsDef = NULL;
7360 } 7363 }
7361 delete = cur; 7364 delete = cur;
7362 goto skip_children; 7365 goto skip_children;
7363 } 7366 }
7364 } 7367 }
7365 } 7368 }
7366 /* 7369 /*
7367 * Simplification 4.2 whitespaces 7370 * Simplification 4.2 whitespaces
7368 */ 7371 */
7369 else if ((cur->type == XML_TEXT_NODE) || 7372 else if ((cur->type == XML_TEXT_NODE) ||
7370 (cur->type == XML_CDATA_SECTION_NODE)) { 7373 (cur->type == XML_CDATA_SECTION_NODE)) {
7371 if (IS_BLANK_NODE(cur)) { 7374 if (IS_BLANK_NODE(cur)) {
7372 if (cur->parent->type == XML_ELEMENT_NODE) { 7375 if ((cur->parent != NULL) &&
7376 » » (cur->parent->type == XML_ELEMENT_NODE)) {
7373 if ((!xmlStrEqual(cur->parent->name, BAD_CAST "value")) 7377 if ((!xmlStrEqual(cur->parent->name, BAD_CAST "value"))
7374 && 7378 &&
7375 (!xmlStrEqual 7379 (!xmlStrEqual
7376 (cur->parent->name, BAD_CAST "param"))) 7380 (cur->parent->name, BAD_CAST "param")))
7377 delete = cur; 7381 delete = cur;
7378 } else { 7382 } else {
7379 delete = cur; 7383 delete = cur;
7380 goto skip_children; 7384 goto skip_children;
7381 } 7385 }
7382 } 7386 }
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
7514 } 7518 }
7515 7519
7516 /* 7520 /*
7517 * Then do the parsing for good 7521 * Then do the parsing for good
7518 */ 7522 */
7519 root = xmlDocGetRootElement(doc); 7523 root = xmlDocGetRootElement(doc);
7520 if (root == NULL) { 7524 if (root == NULL) {
7521 xmlRngPErr(ctxt, (xmlNodePtr) doc, 7525 xmlRngPErr(ctxt, (xmlNodePtr) doc,
7522 XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n", 7526 XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n",
7523 (ctxt->URL ? ctxt->URL : BAD_CAST "schemas"), NULL); 7527 (ctxt->URL ? ctxt->URL : BAD_CAST "schemas"), NULL);
7524 » 7528
7525 xmlFreeDoc(ctxt->document); 7529 xmlFreeDoc(ctxt->document);
7526 ctxt->document = NULL; 7530 ctxt->document = NULL;
7527 return (NULL); 7531 return (NULL);
7528 } 7532 }
7529 ret = xmlRelaxNGParseDocument(ctxt, root); 7533 ret = xmlRelaxNGParseDocument(ctxt, root);
7530 if (ret == NULL) { 7534 if (ret == NULL) {
7531 xmlFreeDoc(ctxt->document); 7535 xmlFreeDoc(ctxt->document);
7532 ctxt->document = NULL; 7536 ctxt->document = NULL;
7533 return (NULL); 7537 return (NULL);
7534 } 7538 }
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
7656 return; 7660 return;
7657 ctxt->serror = serror; 7661 ctxt->serror = serror;
7658 ctxt->error = NULL; 7662 ctxt->error = NULL;
7659 ctxt->warning = NULL; 7663 ctxt->warning = NULL;
7660 ctxt->userData = ctx; 7664 ctxt->userData = ctx;
7661 } 7665 }
7662 7666
7663 #ifdef LIBXML_OUTPUT_ENABLED 7667 #ifdef LIBXML_OUTPUT_ENABLED
7664 7668
7665 /************************************************************************ 7669 /************************************************************************
7666 * » » » » » » » » » * 7670 *» » » » » » » » » *
7667 * » » » Dump back a compiled form» » » * 7671 *» » » Dump back a compiled form» » » *
7668 * » » » » » » » » » * 7672 *» » » » » » » » » *
7669 ************************************************************************/ 7673 ************************************************************************/
7670 static void xmlRelaxNGDumpDefine(FILE * output, 7674 static void xmlRelaxNGDumpDefine(FILE * output,
7671 xmlRelaxNGDefinePtr define); 7675 xmlRelaxNGDefinePtr define);
7672 7676
7673 /** 7677 /**
7674 * xmlRelaxNGDumpDefines: 7678 * xmlRelaxNGDumpDefines:
7675 * @output: the file output 7679 * @output: the file output
7676 * @defines: a list of define structures 7680 * @defines: a list of define structures
7677 * 7681 *
7678 * Dump a RelaxNG structure back 7682 * Dump a RelaxNG structure back
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
7799 case XML_RELAXNG_NOOP: 7803 case XML_RELAXNG_NOOP:
7800 xmlRelaxNGDumpDefines(output, define->content); 7804 xmlRelaxNGDumpDefines(output, define->content);
7801 break; 7805 break;
7802 } 7806 }
7803 } 7807 }
7804 7808
7805 /** 7809 /**
7806 * xmlRelaxNGDumpGrammar: 7810 * xmlRelaxNGDumpGrammar:
7807 * @output: the file output 7811 * @output: the file output
7808 * @grammar: a grammar structure 7812 * @grammar: a grammar structure
7809 * @top: is this a top grammar 7813 * @top: is this a top grammar
7810 * 7814 *
7811 * Dump a RelaxNG structure back 7815 * Dump a RelaxNG structure back
7812 */ 7816 */
7813 static void 7817 static void
7814 xmlRelaxNGDumpGrammar(FILE * output, xmlRelaxNGGrammarPtr grammar, int top) 7818 xmlRelaxNGDumpGrammar(FILE * output, xmlRelaxNGGrammarPtr grammar, int top)
7815 { 7819 {
7816 if (grammar == NULL) 7820 if (grammar == NULL)
7817 return; 7821 return;
7818 7822
7819 fprintf(output, "<grammar"); 7823 fprintf(output, "<grammar");
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
7892 } 7896 }
7893 if (schema->doc == NULL) { 7897 if (schema->doc == NULL) {
7894 fprintf(output, "no document\n"); 7898 fprintf(output, "no document\n");
7895 } else { 7899 } else {
7896 xmlDocDump(output, schema->doc); 7900 xmlDocDump(output, schema->doc);
7897 } 7901 }
7898 } 7902 }
7899 #endif /* LIBXML_OUTPUT_ENABLED */ 7903 #endif /* LIBXML_OUTPUT_ENABLED */
7900 7904
7901 /************************************************************************ 7905 /************************************************************************
7902 * » » » » » » » » » * 7906 *» » » » » » » » » *
7903 * » » Validation of compiled content» » » » * 7907 *» » Validation of compiled content» » » » *
7904 * » » » » » » » » » * 7908 *» » » » » » » » » *
7905 ************************************************************************/ 7909 ************************************************************************/
7906 static int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, 7910 static int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt,
7907 xmlRelaxNGDefinePtr define); 7911 xmlRelaxNGDefinePtr define);
7908 7912
7909 /** 7913 /**
7910 * xmlRelaxNGValidateCompiledCallback: 7914 * xmlRelaxNGValidateCompiledCallback:
7911 * @exec: the regular expression instance 7915 * @exec: the regular expression instance
7912 * @token: the token which matched 7916 * @token: the token which matched
7913 * @transdata: callback data, the define for the subelement if available 7917 * @transdata: callback data, the define for the subelement if available
7914 @ @inputdata: callback data, the Relax NG validation context 7918 @ @inputdata: callback data, the Relax NG validation context
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
8037 * regexp validation, e.g. for attribute values. 8041 * regexp validation, e.g. for attribute values.
8038 */ 8042 */
8039 if ((ret == 0) && (ctxt->perr != 0)) { 8043 if ((ret == 0) && (ctxt->perr != 0)) {
8040 ret = ctxt->perr; 8044 ret = ctxt->perr;
8041 } 8045 }
8042 ctxt->perr = oldperr; 8046 ctxt->perr = oldperr;
8043 return (ret); 8047 return (ret);
8044 } 8048 }
8045 8049
8046 /************************************************************************ 8050 /************************************************************************
8047 * » » » » » » » » » * 8051 *» » » » » » » » » *
8048 * » » Progressive validation of when possible»» » * 8052 *» » Progressive validation of when possible»» » *
8049 * » » » » » » » » » * 8053 *» » » » » » » » » *
8050 ************************************************************************/ 8054 ************************************************************************/
8051 static int xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt, 8055 static int xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt,
8052 xmlRelaxNGDefinePtr defines); 8056 xmlRelaxNGDefinePtr defines);
8053 static int xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, 8057 static int xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt,
8054 int dolog); 8058 int dolog);
8055 static void xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt); 8059 static void xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt);
8056 8060
8057 /** 8061 /**
8058 * xmlRelaxNGElemPush: 8062 * xmlRelaxNGElemPush:
8059 * @ctxt: the validation context 8063 * @ctxt: the validation context
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
8339 xmlGenericError(xmlGenericErrorContext, "PushElem %s failed\n", 8343 xmlGenericError(xmlGenericErrorContext, "PushElem %s failed\n",
8340 elem->name); 8344 elem->name);
8341 #endif 8345 #endif
8342 return (ret); 8346 return (ret);
8343 } 8347 }
8344 8348
8345 /** 8349 /**
8346 * xmlRelaxNGValidatePushCData: 8350 * xmlRelaxNGValidatePushCData:
8347 * @ctxt: the RelaxNG validation context 8351 * @ctxt: the RelaxNG validation context
8348 * @data: some character data read 8352 * @data: some character data read
8349 * @len: the lenght of the data 8353 * @len: the length of the data
8350 * 8354 *
8351 * check the CData parsed for validation in the current stack 8355 * check the CData parsed for validation in the current stack
8352 * 8356 *
8353 * returns 1 if no validation problem was found or -1 otherwise 8357 * returns 1 if no validation problem was found or -1 otherwise
8354 */ 8358 */
8355 int 8359 int
8356 xmlRelaxNGValidatePushCData(xmlRelaxNGValidCtxtPtr ctxt, 8360 xmlRelaxNGValidatePushCData(xmlRelaxNGValidCtxtPtr ctxt,
8357 const xmlChar * data, int len ATTRIBUTE_UNUSED) 8361 const xmlChar * data, int len ATTRIBUTE_UNUSED)
8358 { 8362 {
8359 int ret = 1; 8363 int ret = 1;
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
8473 ctxt->state = NULL; 8477 ctxt->state = NULL;
8474 #ifdef DEBUG_PROGRESSIVE 8478 #ifdef DEBUG_PROGRESSIVE
8475 if (ret < 0) 8479 if (ret < 0)
8476 xmlGenericError(xmlGenericErrorContext, "FullElem %s failed\n", 8480 xmlGenericError(xmlGenericErrorContext, "FullElem %s failed\n",
8477 elem->name); 8481 elem->name);
8478 #endif 8482 #endif
8479 return (ret); 8483 return (ret);
8480 } 8484 }
8481 8485
8482 /************************************************************************ 8486 /************************************************************************
8483 * » » » » » » » » » * 8487 *» » » » » » » » » *
8484 * » » Generic interpreted validation implementation» » * 8488 *» » Generic interpreted validation implementation» » *
8485 * » » » » » » » » » * 8489 *» » » » » » » » » *
8486 ************************************************************************/ 8490 ************************************************************************/
8487 static int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, 8491 static int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt,
8488 xmlRelaxNGDefinePtr define); 8492 xmlRelaxNGDefinePtr define);
8489 8493
8490 /** 8494 /**
8491 * xmlRelaxNGSkipIgnored: 8495 * xmlRelaxNGSkipIgnored:
8492 * @ctxt: a schema validation context 8496 * @ctxt: a schema validation context
8493 * @node: the top node. 8497 * @node: the top node.
8494 * 8498 *
8495 * Skip ignorable nodes in that context 8499 * Skip ignorable nodes in that context
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
8877 } 8881 }
8878 case XML_RELAXNG_ONEORMORE: 8882 case XML_RELAXNG_ONEORMORE:
8879 ret = xmlRelaxNGValidateValueList(ctxt, define->content); 8883 ret = xmlRelaxNGValidateValueList(ctxt, define->content);
8880 if (ret != 0) { 8884 if (ret != 0) {
8881 break; 8885 break;
8882 } 8886 }
8883 /* no break on purpose */ 8887 /* no break on purpose */
8884 case XML_RELAXNG_ZEROORMORE:{ 8888 case XML_RELAXNG_ZEROORMORE:{
8885 xmlChar *cur, *temp; 8889 xmlChar *cur, *temp;
8886 8890
8891 if ((ctxt->state->value == NULL) ||
8892 (*ctxt->state->value == 0)) {
8893 ret = 0;
8894 break;
8895 }
8887 oldflags = ctxt->flags; 8896 oldflags = ctxt->flags;
8888 ctxt->flags |= FLAGS_IGNORABLE; 8897 ctxt->flags |= FLAGS_IGNORABLE;
8889 cur = ctxt->state->value; 8898 cur = ctxt->state->value;
8890 temp = NULL; 8899 temp = NULL;
8891 while ((cur != NULL) && (cur != ctxt->state->endvalue) && 8900 while ((cur != NULL) && (cur != ctxt->state->endvalue) &&
8892 (temp != cur)) { 8901 (temp != cur)) {
8893 temp = cur; 8902 temp = cur;
8894 ret = 8903 ret =
8895 xmlRelaxNGValidateValueList(ctxt, define->content); 8904 xmlRelaxNGValidateValueList(ctxt, define->content);
8896 if (ret != 0) { 8905 if (ret != 0) {
8897 ctxt->state->value = temp; 8906 ctxt->state->value = temp;
8898 ret = 0; 8907 ret = 0;
8899 break; 8908 break;
8900 } 8909 }
8901 cur = ctxt->state->value; 8910 cur = ctxt->state->value;
8902 } 8911 }
8903 ctxt->flags = oldflags; 8912 ctxt->flags = oldflags;
8904 if (ctxt->errNr > 0) 8913 if (ctxt->errNr > 0)
8905 xmlRelaxNGPopErrors(ctxt, 0); 8914 xmlRelaxNGPopErrors(ctxt, 0);
8906 break; 8915 break;
8907 } 8916 }
8917 case XML_RELAXNG_OPTIONAL:{
8918 xmlChar *temp;
8919
8920 if ((ctxt->state->value == NULL) ||
8921 (*ctxt->state->value == 0)) {
8922 ret = 0;
8923 break;
8924 }
8925 oldflags = ctxt->flags;
8926 ctxt->flags |= FLAGS_IGNORABLE;
8927 temp = ctxt->state->value;
8928 ret = xmlRelaxNGValidateValue(ctxt, define->content);
8929 ctxt->flags = oldflags;
8930 if (ret != 0) {
8931 ctxt->state->value = temp;
8932 if (ctxt->errNr > 0)
8933 xmlRelaxNGPopErrors(ctxt, 0);
8934 ret = 0;
8935 break;
8936 }
8937 if (ctxt->errNr > 0)
8938 xmlRelaxNGPopErrors(ctxt, 0);
8939 break;
8940 }
8908 case XML_RELAXNG_EXCEPT:{ 8941 case XML_RELAXNG_EXCEPT:{
8909 xmlRelaxNGDefinePtr list; 8942 xmlRelaxNGDefinePtr list;
8910 8943
8911 list = define->content; 8944 list = define->content;
8912 while (list != NULL) { 8945 while (list != NULL) {
8913 ret = xmlRelaxNGValidateValue(ctxt, list); 8946 ret = xmlRelaxNGValidateValue(ctxt, list);
8914 if (ret == 0) { 8947 if (ret == 0) {
8915 ret = -1; 8948 ret = -1;
8916 break; 8949 break;
8917 } else 8950 } else
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
9013 9046
9014 list = define->content; 9047 list = define->content;
9015 while (list != NULL) { 9048 while (list != NULL) {
9016 ret = xmlRelaxNGAttributeMatch(ctxt, list, prop); 9049 ret = xmlRelaxNGAttributeMatch(ctxt, list, prop);
9017 if (ret == 1) 9050 if (ret == 1)
9018 return (0); 9051 return (0);
9019 if (ret < 0) 9052 if (ret < 0)
9020 return (ret); 9053 return (ret);
9021 list = list->next; 9054 list = list->next;
9022 } 9055 }
9056 } else if (define->type == XML_RELAXNG_CHOICE) {
9057 xmlRelaxNGDefinePtr list;
9058
9059 list = define->nameClass;
9060 while (list != NULL) {
9061 ret = xmlRelaxNGAttributeMatch(ctxt, list, prop);
9062 if (ret == 1)
9063 return (1);
9064 if (ret < 0)
9065 return (ret);
9066 list = list->next;
9067 }
9068 return (0);
9023 } else { 9069 } else {
9024 TODO} 9070 TODO}
9025 return (1); 9071 return (1);
9026 } 9072 }
9027 9073
9028 /** 9074 /**
9029 * xmlRelaxNGValidateAttribute: 9075 * xmlRelaxNGValidateAttribute:
9030 * @ctxt: a Relax-NG validation context 9076 * @ctxt: a Relax-NG validation context
9031 * @define: the definition to verify 9077 * @define: the definition to verify
9032 * 9078 *
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
9372 } 9418 }
9373 if (ret != 0) { 9419 if (ret != 0) {
9374 VALID_ERR(XML_RELAXNG_ERR_INTERSEQ); 9420 VALID_ERR(XML_RELAXNG_ERR_INTERSEQ);
9375 ret = -1; 9421 ret = -1;
9376 goto done; 9422 goto done;
9377 } 9423 }
9378 lastelem = cur; 9424 lastelem = cur;
9379 oldstate = ctxt->state; 9425 oldstate = ctxt->state;
9380 for (i = 0; i < nbgroups; i++) { 9426 for (i = 0; i < nbgroups; i++) {
9381 ctxt->state = xmlRelaxNGCopyValidState(ctxt, oldstate); 9427 ctxt->state = xmlRelaxNGCopyValidState(ctxt, oldstate);
9428 if (ctxt->state == NULL) {
9429 ret = -1;
9430 break;
9431 }
9382 group = partitions->groups[i]; 9432 group = partitions->groups[i];
9383 if (lasts[i] != NULL) { 9433 if (lasts[i] != NULL) {
9384 last = lasts[i]->next; 9434 last = lasts[i]->next;
9385 lasts[i]->next = NULL; 9435 lasts[i]->next = NULL;
9386 } 9436 }
9387 ctxt->state->seq = list[i]; 9437 ctxt->state->seq = list[i];
9388 ret = xmlRelaxNGValidateDefinition(ctxt, group->rule); 9438 ret = xmlRelaxNGValidateDefinition(ctxt, group->rule);
9389 if (ret != 0) 9439 if (ret != 0)
9390 break; 9440 break;
9391 if (ctxt->state != NULL) { 9441 if (ctxt->state != NULL) {
(...skipping 1414 matching lines...) Expand 10 before | Expand all | Expand 10 after
10806 } 10856 }
10807 if (cur->next != NULL) { 10857 if (cur->next != NULL) {
10808 cur = cur->next; 10858 cur = cur->next;
10809 break; 10859 break;
10810 } 10860 }
10811 } while (cur != NULL); 10861 } while (cur != NULL);
10812 } 10862 }
10813 return; 10863 return;
10814 } 10864 }
10815 /************************************************************************ 10865 /************************************************************************
10816 * » » » » » » » » » * 10866 *» » » » » » » » » *
10817 * » » » Validation interfaces» » » » * 10867 *» » » Validation interfaces» » » » *
10818 * » » » » » » » » » * 10868 *» » » » » » » » » *
10819 ************************************************************************/ 10869 ************************************************************************/
10820 10870
10821 /** 10871 /**
10822 * xmlRelaxNGNewValidCtxt: 10872 * xmlRelaxNGNewValidCtxt:
10823 * @schema: a precompiled XML RelaxNGs 10873 * @schema: a precompiled XML RelaxNGs
10824 * 10874 *
10825 * Create an XML RelaxNGs validation context based on the given schema 10875 * Create an XML RelaxNGs validation context based on the given schema
10826 * 10876 *
10827 * Returns the validation context or NULL in case of error 10877 * Returns the validation context or NULL in case of error
10828 */ 10878 */
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
10994 * TODO: build error codes 11044 * TODO: build error codes
10995 */ 11045 */
10996 if (ret == -1) 11046 if (ret == -1)
10997 return (1); 11047 return (1);
10998 return (ret); 11048 return (ret);
10999 } 11049 }
11000 11050
11001 #define bottom_relaxng 11051 #define bottom_relaxng
11002 #include "elfgcchack.h" 11052 #include "elfgcchack.h"
11003 #endif /* LIBXML_SCHEMAS_ENABLED */ 11053 #endif /* LIBXML_SCHEMAS_ENABLED */
OLDNEW
« no previous file with comments | « third_party/libxml/src/pattern.c ('k') | third_party/libxml/src/runsuite.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698