mirror of
https://github.com/GNOME/libxml2.git
synced 2025-03-19 18:50:25 +08:00
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:
parent
91a1325beb
commit
80b19092f2
10
ChangeLog
10
ChangeLog
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
54
relaxng.c
54
relaxng.c
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user