From 0e460da346bfb2cc9d5d6cb4be8f851c18bfb81e Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Wed, 30 Mar 2005 22:47:10 +0000 Subject: [PATCH] another patch from Brent Hendricks to add new handlers with the various * python/generator.py python/libxml.py: another patch from Brent Hendricks to add new handlers with the various validity contexts * python/tests/Makefile.am python/tests/validDTD.py python/tests/validRNG.py python/tests/validSchemas.py: also added the regression tests he provided Daniel --- ChangeLog | 8 ++++ pattern.c | 2 +- python/generator.py | 3 ++ python/libxml.py | 39 +++++++++++++++++ python/libxml2class.txt | 12 ++++-- python/tests/Makefile.am | 5 ++- python/tests/validDTD.py | 59 +++++++++++++++++++++++++ python/tests/validRNG.py | 76 +++++++++++++++++++++++++++++++++ python/tests/validSchemas.py | 83 ++++++++++++++++++++++++++++++++++++ xmlschemas.c | 36 ++++++++-------- 10 files changed, 299 insertions(+), 24 deletions(-) create mode 100755 python/tests/validDTD.py create mode 100755 python/tests/validRNG.py create mode 100755 python/tests/validSchemas.py diff --git a/ChangeLog b/ChangeLog index 0be29c81..1acaf684 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Thu Mar 31 00:45:18 CEST 2005 Daniel Veillard + + * python/generator.py python/libxml.py: another patch from Brent + Hendricks to add new handlers with the various validity contexts + * python/tests/Makefile.am python/tests/validDTD.py + python/tests/validRNG.py python/tests/validSchemas.py: also + added the regression tests he provided + Wed Mar 30 09:39:27 CEST 2005 Daniel Veillard * python/generator.py python/libxml.c: applied patch from Brent diff --git a/pattern.c b/pattern.c index 041039ef..ee3bcbdb 100644 --- a/pattern.c +++ b/pattern.c @@ -1082,7 +1082,7 @@ xmlCompileStepPattern(xmlPatParserContextPtr ctxt) { ctxt->error = 1; goto error; } - xmlFree(name); + /* NOT REACHED xmlFree(name); */ } } else if (CUR == '*') { if (name != NULL) { diff --git a/python/generator.py b/python/generator.py index 0856d76d..6144e549 100755 --- a/python/generator.py +++ b/python/generator.py @@ -747,6 +747,9 @@ classes_ancestor = { "inputBuffer": "ioReadWrapper", "parserCtxt": "parserCtxtCore", "xmlTextReader": "xmlTextReaderCore", + "ValidCtxt": "ValidCtxtCore", + "SchemaValidCtxt": "SchemaValidCtxtCore", + "relaxNgValidCtxt": "relaxNgValidCtxtCore", } classes_destructors = { "parserCtxt": "xmlFreeParserCtxt", diff --git a/python/libxml.py b/python/libxml.py index bde8aba4..2eca71e8 100644 --- a/python/libxml.py +++ b/python/libxml.py @@ -587,6 +587,45 @@ class parserCtxtCore: return libxml2mod.addLocalCatalog(self._o, uri) +class ValidCtxtCore: + + def __init__(self, *args, **kw): + pass + + def setValidityErrorHandler(self, err_func, warn_func, arg=None): + """ + Register error and warning handlers for DTD validation. + These will be called back as f(msg,arg) + """ + libxml2mod.xmlSetValidErrors(self._o, err_func, warn_func, arg) + + +class SchemaValidCtxtCore: + + def __init__(self, *args, **kw): + pass + + def setValidityErrorHandler(self, err_func, warn_func, arg=None): + """ + Register error and warning handlers for Schema validation. + These will be called back as f(msg,arg) + """ + libxml2mod.xmlSchemaSetValidErrors(self._o, err_func, warn_func, arg) + + +class relaxNgValidCtxtCore: + + def __init__(self, *args, **kw): + pass + + def setValidityErrorHandler(self, err_func, warn_func, arg=None): + """ + Register error and warning handlers for RelaxNG validation. + These will be called back as f(msg,arg) + """ + libxml2mod.xmlRelaxNGSetValidErrors(self._o, err_func, warn_func, arg) + + def _xmlTextReaderErrorFunc((f,arg),msg,severity,locator): """Intermediate callback to wrap the locator""" return f(arg,msg,severity,xmlTextReaderLocator(locator)) diff --git a/python/libxml2class.txt b/python/libxml2class.txt index f8146897..c8a2de1f 100644 --- a/python/libxml2class.txt +++ b/python/libxml2class.txt @@ -694,7 +694,9 @@ Class xmlReg() regexpExec() regexpIsDeterminist() regexpPrint() -Class relaxNgValidCtxt() + + +Class relaxNgValidCtxt(relaxNgValidCtxtCore) # functions from module relaxng relaxNGValidateDoc() @@ -885,7 +887,9 @@ Class SchemaParserCtxt() # functions from module xmlschemas schemaParse() -Class ValidCtxt() + + +Class ValidCtxt(ValidCtxtCore) # functions from module valid validCtxtNormalizeAttributeValue() @@ -1111,7 +1115,9 @@ Class inputBuffer(ioReadWrapper) # functions from module xmlreader newTextReader() -Class SchemaValidCtxt() + + +Class SchemaValidCtxt(SchemaValidCtxtCore) # functions from module xmlschemas schemaSetValidOptions() diff --git a/python/tests/Makefile.am b/python/tests/Makefile.am index f41cd6d1..c6d03e99 100644 --- a/python/tests/Makefile.am +++ b/python/tests/Makefile.am @@ -39,7 +39,10 @@ PYTESTS= \ tstLastError.py \ indexes.py \ dtdvalid.py \ - tstmem.py + tstmem.py \ + validDTD.py \ + validSchemas.py \ + validRNG.py XMLS= \ tst.xml \ diff --git a/python/tests/validDTD.py b/python/tests/validDTD.py new file mode 100755 index 00000000..1222f9fb --- /dev/null +++ b/python/tests/validDTD.py @@ -0,0 +1,59 @@ +#!/usr/bin/python -u +import libxml2 +import sys + +ARG = 'test string' + +class ErrorHandler: + + def __init__(self): + self.errors = [] + + def handler(self, msg, data): + if data != ARG: + raise Exception, "Error handler did not receive correct argument" + self.errors.append(msg) + + +# Memory debug specific +libxml2.debugMemory(1) + +dtd="""""" +valid=""" +""" + +invalid=""" +""" + +dtd = libxml2.parseDTD(None, 'test.dtd') +ctxt = libxml2.newValidCtxt() +e = ErrorHandler() +ctxt.setValidityErrorHandler(e.handler, e.handler, ARG) + +# Test valid document +doc = libxml2.parseDoc(valid) +ret = doc.validateDtd(ctxt, dtd) +if ret != 1 or e.errors: + print "error doing DTD validation" + sys.exit(1) +doc.freeDoc() + +# Test invalid document +doc = libxml2.parseDoc(invalid) +ret = doc.validateDtd(ctxt, dtd) +if ret != 0 or not e.errors: + print "Error: document supposed to be invalid" +doc.freeDoc() + +dtd.freeDtd() +del dtd +del ctxt + +# Memory debug specific +libxml2.cleanupParser() +if libxml2.debugMemory(1) == 0: + print "OK" +else: + print "Memory leak %d bytes" % (libxml2.debugMemory(1)) + libxml2.dumpMemory() + diff --git a/python/tests/validRNG.py b/python/tests/validRNG.py new file mode 100755 index 00000000..7022efe9 --- /dev/null +++ b/python/tests/validRNG.py @@ -0,0 +1,76 @@ +#!/usr/bin/python -u +import libxml2 +import sys + +ARG = 'test string' + +class ErrorHandler: + + def __init__(self): + self.errors = [] + + def handler(self, msg, data): + if data != ARG: + raise Exception, "Error handler did not receive correct argument" + self.errors.append(msg) + +# Memory debug specific +libxml2.debugMemory(1) + +schema=""" + + A foo element. + + + + + + + +""" + +valid=""" +""" + +invalid=""" +bad""" + +rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema)) +rngs = rngp.relaxNGParse() +ctxt = rngs.relaxNGNewValidCtxt() +e = ErrorHandler() +ctxt.setValidityErrorHandler(e.handler, e.handler, ARG) + +# Test valid document +doc = libxml2.parseDoc(valid) +ret = doc.relaxNGValidateDoc(ctxt) +if ret != 0 or e.errors: + print "error doing RelaxNG validation" + sys.exit(1) +doc.freeDoc() + +# Test invalid document +doc = libxml2.parseDoc(invalid) +ret = doc.relaxNGValidateDoc(ctxt) +if ret == 0 or not e.errors: + print "Error: document supposed to be RelaxNG invalid" + sys.exit(1) +doc.freeDoc() + +del rngp +del rngs +del ctxt +libxml2.relaxNGCleanupTypes() + +# Memory debug specific +libxml2.cleanupParser() +if libxml2.debugMemory(1) == 0: + print "OK" +else: + print "Memory leak %d bytes" % (libxml2.debugMemory(1)) + libxml2.dumpMemory() + diff --git a/python/tests/validSchemas.py b/python/tests/validSchemas.py new file mode 100755 index 00000000..d4d62b24 --- /dev/null +++ b/python/tests/validSchemas.py @@ -0,0 +1,83 @@ +#!/usr/bin/python -u +import libxml2 +import sys + +ARG = 'test string' + +class ErrorHandler: + + def __init__(self): + self.errors = [] + + def handler(self, msg, data): + if data != ARG: + raise Exception, "Error handler did not receive correct argument" + self.errors.append(msg) + +# Memory debug specific +libxml2.debugMemory(1) + +schema=""" + + + + + + + + + + + +""" + +valid=""" + + Raymond + G + Bayliss + +""" + +invalid=""" + + G + Bayliss + +""" + +e = ErrorHandler() +ctxt_parser = libxml2.schemaNewMemParserCtxt(schema, len(schema)) +ctxt_schema = ctxt_parser.schemaParse() +ctxt_valid = ctxt_schema.schemaNewValidCtxt() +ctxt_valid.setValidityErrorHandler(e.handler, e.handler, ARG) + +# Test valid document +doc = libxml2.parseDoc(valid) +ret = doc.schemaValidateDoc(ctxt_valid) +if ret != 0 or e.errors: + print "error doing schema validation" + sys.exit(1) +doc.freeDoc() + +# Test invalid document +doc = libxml2.parseDoc(invalid) +ret = doc.schemaValidateDoc(ctxt_valid) +if ret == 0 or not e.errors: + print "Error: document supposer to be schema invalid" + sys.exit(1) +doc.freeDoc() + +del ctxt_parser +del ctxt_schema +del ctxt_valid +libxml2.schemaCleanupTypes() + +# Memory debug specific +libxml2.cleanupParser() +if libxml2.debugMemory(1) == 0: + print "OK" +else: + print "Memory leak %d bytes" % (libxml2.debugMemory(1)) + libxml2.dumpMemory() + diff --git a/xmlschemas.c b/xmlschemas.c index 7c31eb00..7d520059 100644 --- a/xmlschemas.c +++ b/xmlschemas.c @@ -19677,27 +19677,25 @@ xmlSchemaValidateElementByComplexType(xmlSchemaValidCtxtPtr ctxt, if (ret == 0) { xmlRegExecNextValues(ctxt->regexp, &nbval, &nbneg, &values[0], &terminal); - if (nbval + nbneg != 0) { - /* - * If a next value still exists, I does not have to - * mean that there's an element missing, since it - * might be an optional element. So double check it. - */ - ret = xmlRegExecPushString(ctxt->regexp, - NULL, NULL); - if (ret <= 0) { - ret = 1; - xmlSchemaVComplexTypeElemErr(ctxt, - XML_SCHEMAV_ELEMENT_CONTENT, - elem, type, "Missing child element(s)", - nbval, nbneg, values); - } else - ret = 0; + /* + * If a next value still exists, I does not have to + * mean that there's an element missing, since it + * might be an optional element. So double check it. + */ + ret = xmlRegExecPushString(ctxt->regexp, + NULL, NULL); + if (ret <= 0) { + ret = 1; + xmlSchemaVComplexTypeElemErr(ctxt, + XML_SCHEMAV_ELEMENT_CONTENT, + elem, type, "Missing child element(s)", + nbval, nbneg, values); + } else + ret = 0; #ifdef DEBUG_AUTOMATA - xmlGenericError(xmlGenericErrorContext, - "====> %s : %d\n", elem->name, ret); + xmlGenericError(xmlGenericErrorContext, + "====> %s : %d\n", elem->name, ret); #endif - } #ifdef DEBUG_CONTENT if (ret == 0) xmlGenericError(xmlGenericErrorContext,