GitLab repository storage has been migrated to hashed layout. Please contact Infrastructure team if you notice any issues with repositories or hooks.

Commit 80b19092 authored by Daniel Veillard's avatar Daniel Veillard

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
parent 91a1325b
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
......
......@@ -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
}
......
......@@ -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,
......
......@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment