implemented comparisons for Schemas values. fixed some bugs in duration

* relaxng.c: implemented comparisons for Schemas values.
* xmlschemastypes.c include/libxml/xmlschemastypes.h: fixed
  some bugs in duration handling, comparisons for durations
  and decimals, removed all memory leaks pointed out by James
  testsuite. Current status is now
  found 238 test schemas: 197 success 41 failures
  found 1035 test instances: 803 success 130 failures
Daniel
This commit is contained in:
Daniel Veillard 2003-03-28 13:29:53 +00:00
parent 91a1325beb
commit 80b19092f2
4 changed files with 149 additions and 26 deletions

View File

@ -1,3 +1,13 @@
Fri Mar 28 14:24:08 CET 2003 Daniel Veillard <daniel@veillard.com>
* relaxng.c: implemented comparisons for Schemas values.
* xmlschemastypes.c include/libxml/xmlschemastypes.h: fixed
some bugs in duration handling, comparisons for durations
and decimals, removed all memory leaks pointed out by James
testsuite. Current status is now
found 238 test schemas: 197 success 41 failures
found 1035 test instances: 803 success 130 failures
Fri Mar 28 00:41:55 CET 2003 Daniel Veillard <daniel@veillard.com>
* xmlschemas.c include/libxml/xmlschemas.h: fixed bugs and memory

View File

@ -44,6 +44,8 @@ int xmlSchemaCheckFacet (xmlSchemaFacetPtr facet,
xmlSchemaParserCtxtPtr ctxt,
const xmlChar *name);
void xmlSchemaFreeFacet (xmlSchemaFacetPtr facet);
int xmlSchemaCompareValues (xmlSchemaValPtr x,
xmlSchemaValPtr y);
#ifdef __cplusplus
}

View File

@ -2304,6 +2304,20 @@ xmlRelaxNGSchemaFacetCheck (void *data ATTRIBUTE_UNUSED, const xmlChar *type,
return(0);
}
/**
* xmlRelaxNGSchemaFreeValue:
* @data: data needed for the library
* @value: the value to free
*
* Function provided by a type library to free a Schemas value
*
* Returns 1 if yes, 0 if no and -1 in case of error.
*/
static void
xmlRelaxNGSchemaFreeValue (void *data ATTRIBUTE_UNUSED, void *value) {
xmlSchemaFreeValue(value);
}
/**
* xmlRelaxNGSchemaTypeCompare:
* @data: data needed for the library
@ -2311,18 +2325,48 @@ xmlRelaxNGSchemaFacetCheck (void *data ATTRIBUTE_UNUSED, const xmlChar *type,
* @value1: the first value
* @value2: the second value
*
* Compare two values accordingly a type from the W3C XMLSchema
* Compare two values for equality accordingly a type from the W3C XMLSchema
* Datatype library.
*
* Returns 1 if yes, 0 if no and -1 in case of error.
* Returns 1 if equal, 0 if no and -1 in case of error.
*/
static int
xmlRelaxNGSchemaTypeCompare(void *data ATTRIBUTE_UNUSED,
const xmlChar *type ATTRIBUTE_UNUSED,
const xmlChar *value1 ATTRIBUTE_UNUSED,
const xmlChar *value2 ATTRIBUTE_UNUSED) {
TODO
return(1);
int ret;
xmlSchemaTypePtr typ;
xmlSchemaValPtr res1 = NULL, res2 = NULL;
if ((type == NULL) || (value1 == NULL) || (value2 == NULL))
return(-1);
typ = xmlSchemaGetPredefinedType(type,
BAD_CAST "http://www.w3.org/2001/XMLSchema");
if (typ == NULL)
return(-1);
ret = xmlSchemaValPredefTypeNode(typ, value1, &res1, NULL);
if (ret != 0)
return(-1);
if (res1 == NULL)
return(-1);
ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, NULL);
if (ret != 0) {
xmlSchemaFreeValue(res1);
return(-1);
}
if (res1 == NULL) {
xmlSchemaFreeValue(res1);
return(-1);
}
ret = xmlSchemaCompareValues(res1, res2);
xmlSchemaFreeValue(res1);
xmlSchemaFreeValue(res2);
if (ret == -2)
return(-1);
if (ret == 0)
return(1);
return(0);
}
/**
@ -2522,7 +2566,7 @@ xmlRelaxNGInitTypes(void) {
xmlRelaxNGSchemaTypeCheck,
xmlRelaxNGSchemaTypeCompare,
xmlRelaxNGSchemaFacetCheck,
(xmlRelaxNGTypeFree) xmlSchemaFreeValue);
xmlRelaxNGSchemaFreeValue);
xmlRelaxNGRegisterTypeLibrary(
xmlRelaxNGNs,
NULL,

View File

@ -821,6 +821,8 @@ xmlSchemaValidateDates (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
dt->type = t; \
if (val != NULL) \
*val = dt; \
else \
xmlSchemaFreeValue(dt); \
return 0; \
} \
}
@ -943,6 +945,8 @@ xmlSchemaValidateDates (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
if (val != NULL)
*val = dt;
else
xmlSchemaFreeValue(dt);
return 0;
@ -984,6 +988,9 @@ xmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
if (*cur++ != 'P')
return 1;
if (*cur == 0)
return 1;
dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
if (dur == NULL)
return -1;
@ -1053,6 +1060,8 @@ xmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
if (val != NULL)
*val = dur;
else
xmlSchemaFreeValue(dur);
return 0;
@ -1731,16 +1740,20 @@ xmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y)
int order = 1;
unsigned long tmp;
if ((x->value.decimal.sign) && (x->value.decimal.sign))
order = -1;
else if (x->value.decimal.sign)
return (-1);
else if (y->value.decimal.sign)
if ((x->value.decimal.sign) && (x->value.decimal.base != 0)) {
if ((y->value.decimal.sign) && (y->value.decimal.base != 0))
order = -1;
else
return (-1);
} else if ((y->value.decimal.sign) && (y->value.decimal.base != 0)) {
return (1);
}
if (x->value.decimal.frac == y->value.decimal.frac) {
if (x->value.decimal.base < y->value.decimal.base)
return (-1);
return (x->value.decimal.base > y->value.decimal.base);
return (-order);
if (x->value.decimal.base > y->value.decimal.base)
return(order);
return(0);
}
if (y->value.decimal.frac > x->value.decimal.frac) {
swp = y;
@ -1780,7 +1793,8 @@ xmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y)
{
long carry, mon, day;
double sec;
long xmon, xday, myear, lyear, minday, maxday;
int invert = 1;
long xmon, xday, myear, minday, maxday;
static const long dayRange [2][12] = {
{ 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, },
{ 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} };
@ -1824,23 +1838,31 @@ xmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y)
} else if ((day <= 0) && (sec <= 0.0)) {
return -1;
} else {
invert = -1;
xmon = -mon;
xday = day;
}
myear = xmon / 12;
lyear = myear / 4;
minday = (myear * 365) + (lyear != 0 ? lyear - 1 : 0);
maxday = (myear * 365) + (lyear != 0 ? lyear + 1 : 0);
if (myear == 0) {
minday = 0;
maxday = 0;
} else {
maxday = 366 * ((myear + 3) / 4) +
365 * ((myear - 1) % 4);
minday = maxday - 1;
}
xmon = xmon % 12;
minday += dayRange[0][xmon];
maxday += dayRange[1][xmon];
if ((maxday == minday) && (maxday == xday))
return(0); /* can this really happen ? */
if (maxday < xday)
return 1;
else if (minday > xday)
return -1;
return(-invert);
if (minday > xday)
return(invert);
/* indeterminate */
return 2;
@ -2354,16 +2376,44 @@ xmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
* Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
* case of error
*/
static int
int
xmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) {
if ((x == NULL) || (y == NULL))
return(-2);
switch (x->type) {
case XML_SCHEMAS_STRING:
TODO
case XML_SCHEMAS_UNKNOWN:
return(-2);
case XML_SCHEMAS_INTEGER:
case XML_SCHEMAS_NPINTEGER:
case XML_SCHEMAS_NINTEGER:
case XML_SCHEMAS_NNINTEGER:
case XML_SCHEMAS_PINTEGER:
case XML_SCHEMAS_INT:
case XML_SCHEMAS_UINT:
case XML_SCHEMAS_LONG:
case XML_SCHEMAS_ULONG:
case XML_SCHEMAS_SHORT:
case XML_SCHEMAS_USHORT:
case XML_SCHEMAS_BYTE:
case XML_SCHEMAS_UBYTE:
case XML_SCHEMAS_DECIMAL:
if (y->type == XML_SCHEMAS_DECIMAL)
if (y->type == x->type)
return(xmlSchemaCompareDecimals(x, y));
if ((y->type == XML_SCHEMAS_DECIMAL) ||
(y->type == XML_SCHEMAS_INTEGER) ||
(y->type == XML_SCHEMAS_NPINTEGER) ||
(y->type == XML_SCHEMAS_NINTEGER) ||
(y->type == XML_SCHEMAS_NNINTEGER) ||
(y->type == XML_SCHEMAS_PINTEGER) ||
(y->type == XML_SCHEMAS_INT) ||
(y->type == XML_SCHEMAS_UINT) ||
(y->type == XML_SCHEMAS_LONG) ||
(y->type == XML_SCHEMAS_ULONG) ||
(y->type == XML_SCHEMAS_SHORT) ||
(y->type == XML_SCHEMAS_USHORT) ||
(y->type == XML_SCHEMAS_BYTE) ||
(y->type == XML_SCHEMAS_UBYTE))
return(xmlSchemaCompareDecimals(x, y));
return(-2);
case XML_SCHEMAS_DURATION:
@ -2387,9 +2437,26 @@ xmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) {
(y->type == XML_SCHEMAS_DATE) ||
(y->type == XML_SCHEMAS_GYEARMONTH))
return (xmlSchemaCompareDates(x, y));
return (-2);
default:
case XML_SCHEMAS_STRING:
case XML_SCHEMAS_NORMSTRING:
case XML_SCHEMAS_FLOAT:
case XML_SCHEMAS_DOUBLE:
case XML_SCHEMAS_BOOLEAN:
case XML_SCHEMAS_TOKEN:
case XML_SCHEMAS_LANGUAGE:
case XML_SCHEMAS_NMTOKEN:
case XML_SCHEMAS_NMTOKENS:
case XML_SCHEMAS_NAME:
case XML_SCHEMAS_QNAME:
case XML_SCHEMAS_NCNAME:
case XML_SCHEMAS_ID:
case XML_SCHEMAS_IDREF:
case XML_SCHEMAS_IDREFS:
case XML_SCHEMAS_ENTITY:
case XML_SCHEMAS_ENTITIES:
case XML_SCHEMAS_NOTATION:
case XML_SCHEMAS_ANYURI:
TODO
}
return -2;