diff options
Diffstat (limited to 'relaxng.c')
-rw-r--r-- | relaxng.c | 70 |
1 files changed, 51 insertions, 19 deletions
@@ -254,6 +254,7 @@ struct _xmlRelaxNGParserCtxt { #define FLAGS_IGNORABLE 1 #define FLAGS_NEGATIVE 2 #define FLAGS_MIXED_CONTENT 4 +#define FLAGS_NOERROR 8 /** * xmlRelaxNGInterleaveGroup: @@ -435,10 +436,12 @@ xmlRngPErrMemory(xmlRelaxNGParserCtxtPtr ctxt, const char *extra) void *data = NULL; if (ctxt != NULL) { - channel = ctxt->error; + if (ctxt->serror != NULL) + schannel = ctxt->serror; + else + channel = ctxt->error; data = ctxt->userData; ctxt->nbErrors++; - schannel = ctxt->serror; } if (extra) __xmlRaiseError(schannel, channel, data, @@ -468,10 +471,12 @@ xmlRngVErrMemory(xmlRelaxNGValidCtxtPtr ctxt, const char *extra) void *data = NULL; if (ctxt != NULL) { - channel = ctxt->error; + if (ctxt->serror != NULL) + schannel = ctxt->serror; + else + channel = ctxt->error; data = ctxt->userData; ctxt->nbErrors++; - schannel = ctxt->serror; } if (extra) __xmlRaiseError(schannel, channel, data, @@ -506,10 +511,12 @@ xmlRngPErr(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node, int error, void *data = NULL; if (ctxt != NULL) { - channel = ctxt->error; + if (ctxt->serror != NULL) + schannel = ctxt->serror; + else + channel = ctxt->error; data = ctxt->userData; ctxt->nbErrors++; - schannel = ctxt->serror; } __xmlRaiseError(schannel, channel, data, NULL, node, XML_FROM_RELAXNGP, @@ -538,10 +545,12 @@ xmlRngVErr(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node, int error, void *data = NULL; if (ctxt != NULL) { - channel = ctxt->error; + if (ctxt->serror != NULL) + schannel = ctxt->serror; + else + channel = ctxt->error; data = ctxt->userData; ctxt->nbErrors++; - schannel = ctxt->serror; } __xmlRaiseError(schannel, channel, data, NULL, node, XML_FROM_RELAXNGV, @@ -1477,14 +1486,14 @@ xmlRelaxNGIncludePop(xmlRelaxNGParserCtxtPtr ctxt) xmlRelaxNGIncludePtr ret; if (ctxt->incNr <= 0) - return (0); + return (NULL); ctxt->incNr--; if (ctxt->incNr > 0) ctxt->inc = ctxt->incTab[ctxt->incNr - 1]; else ctxt->inc = NULL; ret = ctxt->incTab[ctxt->incNr]; - ctxt->incTab[ctxt->incNr] = 0; + ctxt->incTab[ctxt->incNr] = NULL; return (ret); } @@ -1889,14 +1898,14 @@ xmlRelaxNGDocumentPop(xmlRelaxNGParserCtxtPtr ctxt) xmlRelaxNGDocumentPtr ret; if (ctxt->docNr <= 0) - return (0); + return (NULL); ctxt->docNr--; if (ctxt->docNr > 0) ctxt->doc = ctxt->docTab[ctxt->docNr - 1]; else ctxt->doc = NULL; ret = ctxt->docTab[ctxt->docNr]; - ctxt->docTab[ctxt->docNr] = 0; + ctxt->docTab[ctxt->docNr] = NULL; return (ret); } @@ -2220,7 +2229,7 @@ xmlRelaxNGShowValidError(xmlRelaxNGValidCtxtPtr ctxt, { xmlChar *msg; - if (ctxt->error == NULL) + if (ctxt->flags & FLAGS_NOERROR) return; #ifdef DEBUG_ERROR @@ -2332,7 +2341,9 @@ xmlRelaxNGAddValidError(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGValidErr err, const xmlChar * arg1, const xmlChar * arg2, int dup) { - if ((ctxt == NULL) || (ctxt->error == NULL)) + if (ctxt == NULL) + return; + if (ctxt->flags & FLAGS_NOERROR) return; #ifdef DEBUG_ERROR @@ -3739,10 +3750,10 @@ xmlRelaxNGCompareNameClasses(xmlRelaxNGDefinePtr def1, xmlNs ns; xmlRelaxNGValidCtxt ctxt; - ctxt.flags = FLAGS_IGNORABLE; - memset(&ctxt, 0, sizeof(xmlRelaxNGValidCtxt)); + ctxt.flags = FLAGS_IGNORABLE | FLAGS_NOERROR; + if ((def1->type == XML_RELAXNG_ELEMENT) || (def1->type == XML_RELAXNG_ATTRIBUTE)) { if (def2->type == XML_RELAXNG_TEXT) @@ -7469,6 +7480,7 @@ xmlRelaxNGSetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, return; ctxt->error = err; ctxt->warning = warn; + ctxt->serror = NULL; ctxt->userData = ctx; } @@ -8638,8 +8650,6 @@ xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, if (ctxt->errNr > 0) xmlRelaxNGPopErrors(ctxt, 0); } - if (ret == 0) - xmlRelaxNGNextValue(ctxt); break; } case XML_RELAXNG_LIST:{ @@ -10591,7 +10601,8 @@ xmlRelaxNGNewValidCtxt(xmlRelaxNGPtr schema) ret->errMax = 0; ret->err = NULL; ret->errTab = NULL; - ret->idref = schema->idref; + if (schema != NULL) + ret->idref = schema->idref; ret->states = NULL; ret->freeState = NULL; ret->freeStates = NULL; @@ -10660,6 +10671,27 @@ xmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, ctxt->error = err; ctxt->warning = warn; ctxt->userData = ctx; + ctxt->serror = NULL; +} + +/** + * xmlRelaxNGSetValidStructuredErrors: + * @ctxt: a Relax-NG validation context + * @serror: the structured error function + * @ctx: the functions context + * + * Set the structured error callback + */ +void +xmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt, + xmlStructuredErrorFunc serror, void *ctx) +{ + if (ctxt == NULL) + return; + ctxt->serror = serror; + ctxt->error = NULL; + ctxt->warning = NULL; + ctxt->userData = ctx; } /** |