diff options
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | SAX.c | 12 | ||||
-rw-r--r-- | relaxng.c | 84 | ||||
-rw-r--r-- | valid.c | 2 | ||||
-rw-r--r-- | xmlschemastypes.c | 498 |
5 files changed, 410 insertions, 198 deletions
@@ -1,3 +1,15 @@ +Sun Mar 30 23:04:18 CEST 2003 Daniel Veillard <daniel@veillard.com> + + * relaxng.c xmlschemastypes.c: more work on XML Schemas datatypes + and facets support. Currently only schemas with binHex or + base64 don't compile. A few error left in the test suite: + found 1035 test instances: 919 success 23 failures + most are gdate or gdateyear failing check, and a few cases where + James clark tests results are strange. + * valid.c: allow to reuse the Notation checking routine without + having a validation context. + * SAX.c: removed a #if 0 + Sat Mar 29 17:35:05 CET 2003 Daniel Veillard <daniel@veillard.com> * xinclude.c: forgot to apply one check from #106931 patch @@ -661,18 +661,6 @@ unparsedEntityDecl(void *ctx, const xmlChar *name, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n", name, publicId, systemId, notationName); #endif -#if 0 - Done in xmlValidateDtdFinal now. - if (ctxt->validate && ctxt->wellFormed && ctxt->myDoc) { - int ret; - ret = xmlValidateNotationUse(&ctxt->vctxt, ctxt->myDoc, - notationName); - if (ret == 0) { - ctxt->wellFormed = 0; - ctxt->valid = 0; - } - } -#endif if (ctxt->inSubset == 1) { ent = xmlAddDocEntity(ctxt->myDoc, name, XML_EXTERNAL_GENERAL_UNPARSED_ENTITY, @@ -445,7 +445,10 @@ typedef void (*xmlRelaxNGTypeFree) (void *data, void *result); */ typedef int (*xmlRelaxNGTypeCompare) (void *data, const xmlChar *type, const xmlChar *value1, - const xmlChar *value2); + xmlNodePtr ctxt1, + void *comp1, + const xmlChar *value2, + xmlNodePtr ctxt2); typedef struct _xmlRelaxNGTypeLibrary xmlRelaxNGTypeLibrary; typedef xmlRelaxNGTypeLibrary *xmlRelaxNGTypeLibraryPtr; struct _xmlRelaxNGTypeLibrary { @@ -779,6 +782,14 @@ xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define) if (define == NULL) return; + if ((define->type == XML_RELAXNG_VALUE) && + (define->attrs != NULL)) { + xmlRelaxNGTypeLibraryPtr lib; + + lib = (xmlRelaxNGTypeLibraryPtr) define->data; + if ((lib != NULL) && (lib->freef != NULL)) + lib->freef(lib->data, (void *) define->attrs); + } if ((define->data != NULL) && (define->type == XML_RELAXNG_INTERLEAVE)) xmlRelaxNGFreePartition((xmlRelaxNGPartitionPtr) define->data); @@ -2336,9 +2347,12 @@ xmlRelaxNGSchemaFreeValue (void *data ATTRIBUTE_UNUSED, void *value) { */ static int xmlRelaxNGSchemaTypeCompare(void *data ATTRIBUTE_UNUSED, - const xmlChar *type ATTRIBUTE_UNUSED, - const xmlChar *value1 ATTRIBUTE_UNUSED, - const xmlChar *value2 ATTRIBUTE_UNUSED) { + const xmlChar *type, + const xmlChar *value1, + xmlNodePtr ctxt1, + void *comp1, + const xmlChar *value2, + xmlNodePtr ctxt2) { int ret; xmlSchemaTypePtr typ; xmlSchemaValPtr res1 = NULL, res2 = NULL; @@ -2349,12 +2363,16 @@ xmlRelaxNGSchemaTypeCompare(void *data ATTRIBUTE_UNUSED, 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 (comp1 == NULL) { + ret = xmlSchemaValPredefTypeNode(typ, value1, &res1, ctxt1); + if (ret != 0) + return(-1); + if (res1 == NULL) + return(-1); + } else { + res1 = (xmlSchemaValPtr) comp1; + } + ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, ctxt2); if (ret != 0) { xmlSchemaFreeValue(res1); return(-1); @@ -2364,7 +2382,8 @@ xmlRelaxNGSchemaTypeCompare(void *data ATTRIBUTE_UNUSED, return(-1); } ret = xmlSchemaCompareValues(res1, res2); - xmlSchemaFreeValue(res1); + if (res1 != (xmlSchemaValPtr) comp1) + xmlSchemaFreeValue(res1); xmlSchemaFreeValue(res2); if (ret == -2) return(-1); @@ -2437,9 +2456,12 @@ xmlRelaxNGDefaultTypeCheck(void *data ATTRIBUTE_UNUSED, */ static int xmlRelaxNGDefaultTypeCompare(void *data ATTRIBUTE_UNUSED, - const xmlChar *type ATTRIBUTE_UNUSED, - const xmlChar *value1 ATTRIBUTE_UNUSED, - const xmlChar *value2 ATTRIBUTE_UNUSED) { + const xmlChar *type, + const xmlChar *value1, + xmlNodePtr ctxt1 ATTRIBUTE_UNUSED, + void *comp1 ATTRIBUTE_UNUSED, + const xmlChar *value2, + xmlNodePtr ctxt2 ATTRIBUTE_UNUSED) { int ret = -1; if (xmlStrEqual(type, BAD_CAST "string")) { @@ -2850,7 +2872,7 @@ xmlRelaxNGParseValue(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) { xmlRelaxNGTypeLibraryPtr lib; xmlChar *type; xmlChar *library; - int tmp; + int success = 0; def = xmlRelaxNGNewDefine(ctxt, node); if (def == NULL) @@ -2892,8 +2914,8 @@ xmlRelaxNGParseValue(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) { library); ctxt->nbErrors++; } else { - tmp = lib->have(lib->data, def->name); - if (tmp != 1) { + success = lib->have(lib->data, def->name); + if (success != 1) { if (ctxt->error != NULL) ctxt->error(ctxt->userData, "Error type '%s' is not exported by type library '%s'\n", @@ -2912,13 +2934,27 @@ xmlRelaxNGParseValue(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) { ctxt->error(ctxt->userData, "Expecting a single text value for <value>content\n"); ctxt->nbErrors++; - } else { + } else if (def != NULL) { def->value = xmlNodeGetContent(node); if (def->value == NULL) { if (ctxt->error != NULL) ctxt->error(ctxt->userData, "Element <value> has no content\n"); ctxt->nbErrors++; + } else if ((lib != NULL) && (lib->check != NULL) && (success == 1)) { + void *val = NULL; + + success = lib->check(lib->data, def->name, def->value, &val, node); + if (success != 1) { + if (ctxt->error != NULL) + ctxt->error(ctxt->userData, + "Value '%s' is not acceptable for type '%s'\n", + def->value, def->name); + ctxt->nbErrors++; + } else { + if (val != NULL) + def->attrs = val; + } } } /* TODO check ahead of time that the value is okay per the type */ @@ -5355,7 +5391,7 @@ xmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt, cur->parent = parent; if (cur->content != NULL) xmlRelaxNGSimplify(ctxt, cur->content, cur); - if (cur->attrs != NULL) + if ((cur->type != XML_RELAXNG_VALUE) && (cur->attrs != NULL)) xmlRelaxNGSimplify(ctxt, cur->attrs, cur); if (cur->nameClass != NULL) xmlRelaxNGSimplify(ctxt, cur->nameClass, cur); @@ -7232,10 +7268,12 @@ xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGTypeLibraryPtr lib; lib = (xmlRelaxNGTypeLibraryPtr) define->data; - if ((lib != NULL) && (lib->comp != NULL)) - ret = lib->comp(lib->data, define->name, value, - define->value); - else + if ((lib != NULL) && (lib->comp != NULL)) { + ret = lib->comp(lib->data, define->name, + define->value, define->node, + (void *) define->attrs, + value, ctxt->state->node); + } else ret = -1; if (ret < 0) { VALID_ERR2(XML_RELAXNG_ERR_TYPECMP, define->name); @@ -2977,7 +2977,7 @@ xmlValidateNotationUse(xmlValidCtxtPtr ctxt, xmlDocPtr doc, if ((notaDecl == NULL) && (doc->extSubset != NULL)) notaDecl = xmlGetDtdNotationDesc(doc->extSubset, notationName); - if (notaDecl == NULL) { + if ((notaDecl == NULL) && (ctxt != NULL)) { VERROR(ctxt->userData, "NOTATION %s is not declared\n", notationName); return(0); diff --git a/xmlschemastypes.c b/xmlschemastypes.c index c871479d..ba969840 100644 --- a/xmlschemastypes.c +++ b/xmlschemastypes.c @@ -117,19 +117,29 @@ typedef struct _xmlSchemaValDecimal xmlSchemaValDecimal; typedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr; struct _xmlSchemaValDecimal { /* would use long long but not portable */ - unsigned long base; + unsigned long lo; + unsigned long mi; + unsigned long hi; unsigned int extra; unsigned int sign:1; int frac:7; int total:8; }; +typedef struct _xmlSchemaValQName xmlSchemaValQName; +typedef xmlSchemaValQName *xmlSchemaValQNamePtr; +struct _xmlSchemaValQName { + xmlChar *name; + xmlChar *uri; +}; + struct _xmlSchemaVal { xmlSchemaValType type; union { xmlSchemaValDecimal decimal; xmlSchemaValDate date; xmlSchemaValDuration dur; + xmlSchemaValQName qname; float f; double d; int b; @@ -188,6 +198,7 @@ static xmlSchemaTypePtr xmlSchemaTypeIdrefDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL; @@ -293,7 +304,7 @@ xmlSchemaInitTypes(void) xmlSchemaTypeUnsignedIntDef = xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT);; xmlSchemaTypeUnsignedShortDef = - xmlSchemaInitBasicType("insignedShort", XML_SCHEMAS_USHORT);; + xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT);; xmlSchemaTypeUnsignedByteDef = xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE);; xmlSchemaTypePositiveIntegerDef = @@ -314,6 +325,8 @@ xmlSchemaInitTypes(void) XML_SCHEMAS_ENTITY); xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES", XML_SCHEMAS_ENTITIES); + xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION", + XML_SCHEMAS_NOTATION); xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name", XML_SCHEMAS_NAME); xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName", @@ -379,7 +392,6 @@ xmlSchemaFreeValue(xmlSchemaValPtr value) { 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: @@ -391,6 +403,12 @@ xmlSchemaFreeValue(xmlSchemaValPtr value) { if (value->value.str != NULL) xmlFree(value->value.str); break; + case XML_SCHEMAS_QNAME: + if (value->value.qname.uri != NULL) + xmlFree(value->value.qname.uri); + if (value->value.qname.name != NULL) + xmlFree(value->value.qname.name); + break; default: break; } @@ -1241,6 +1259,56 @@ xmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value, } /** + * xmlSchemaParseUInt: + * @str: pointer to the string R/W + * @llo: pointer to the low result + * @lmi: pointer to the mid result + * @lhi: pointer to the high result + * + * Parse an unsigned long into 3 fields. + * + * Returns the number of chars parsed or -1 if overflow of the capacity + */ +static int +xmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, + unsigned long *lmi, unsigned long *lhi) { + unsigned long lo = 0, mi = 0, hi = 0; + const xmlChar *tmp, *cur = *str; + int ret = 0, i = 0; + + while (*cur == '0') { + ret++; + cur++; + } + tmp = cur; + while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) { + i++;tmp++;ret++; + } + if (i > 24) { + *str = tmp; + return(-1); + } + while (i > 16) { + hi = hi * 10 + (*cur++ - '0'); + i--; + } + while (i > 8) { + mi = mi * 10 + (*cur++ - '0'); + i--; + } + while (i > 0) { + lo = lo * 10 + (*cur++ - '0'); + i--; + } + + *str = cur; + *llo = lo; + *lmi = mi; + *lhi = hi; + return(ret); +} + +/** * xmlSchemaValAtomicType: * @type: the predefined type * @value: the value to check @@ -1319,7 +1387,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar *value, if (val != NULL) { v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); if (v != NULL) { - v->value.decimal.base = base; + v->value.decimal.lo = base; v->value.decimal.sign = neg; v->value.decimal.frac = frac; v->value.decimal.total = frac + len; @@ -1561,12 +1629,49 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar *value, TODO; } goto done; - case XML_SCHEMAS_QNAME: + case XML_SCHEMAS_QNAME: { + xmlChar *uri = NULL; + xmlChar *local = NULL; + ret = xmlValidateQName(value, 1); + if ((ret == 0) && (node != NULL)) { + xmlChar *prefix; + local = xmlSplitQName2(value, &prefix); + if (prefix != NULL) { + xmlNsPtr ns; + + ns = xmlSearchNs(node->doc, node, prefix); + if (ns == NULL) + ret = 1; + else if (val != NULL) + uri = xmlStrdup(ns->href); + } + if ((local != NULL) && ((val == NULL) || (ret != 0))) + xmlFree(local); + if (prefix != NULL) + xmlFree(prefix); + } if ((ret == 0) && (val != NULL)) { - TODO; + v = xmlSchemaNewValue(XML_SCHEMAS_QNAME); + if (v != NULL) { + if (local != NULL) + v->value.qname.name = local; + else + v->value.qname.name = xmlStrdup(value); + if (uri != NULL) + v->value.qname.uri = uri; + + *val = v; + } else { + if (local != NULL) + xmlFree(local); + if (uri != NULL) + xmlFree(uri); + goto error; + } } goto done; + } case XML_SCHEMAS_NCNAME: ret = xmlValidateNCName(value, 1); if ((ret == 0) && (val != NULL)) { @@ -1687,9 +1792,58 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar *value, attr->atype = XML_ATTRIBUTE_ENTITIES; } goto done; - case XML_SCHEMAS_NOTATION: - TODO; - break; + case XML_SCHEMAS_NOTATION: { + xmlChar *uri = NULL; + xmlChar *local = NULL; + + ret = xmlValidateQName(value, 1); + if ((ret == 0) && (node != NULL)) { + xmlChar *prefix; + local = xmlSplitQName2(value, &prefix); + if (prefix != NULL) { + xmlNsPtr ns; + + ns = xmlSearchNs(node->doc, node, prefix); + if (ns == NULL) + ret = 1; + else if (val != NULL) + uri = xmlStrdup(ns->href); + } + if ((local != NULL) && ((val == NULL) || (ret != 0))) + xmlFree(local); + if (prefix != NULL) + xmlFree(prefix); + } + if ((node == NULL) || (node->doc == NULL)) + ret = 3; + if (ret == 0) { + ret = xmlValidateNotationUse(NULL, node->doc, value); + if (ret == 1) + ret = 0; + else + ret = 1; + } + if ((ret == 0) && (val != NULL)) { + v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); + if (v != NULL) { + if (local != NULL) + v->value.qname.name = local; + else + v->value.qname.name = xmlStrdup(value); + if (uri != NULL) + v->value.qname.uri = uri; + + *val = v; + } else { + if (local != NULL) + xmlFree(local); + if (uri != NULL) + xmlFree(uri); + goto error; + } + } + goto done; + } case XML_SCHEMAS_ANYURI: { xmlURIPtr uri; @@ -1702,10 +1856,13 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar *value, xmlFreeURI(uri); goto return0; } - case XML_SCHEMAS_INTEGER: { + case XML_SCHEMAS_INTEGER: + case XML_SCHEMAS_PINTEGER: + case XML_SCHEMAS_NPINTEGER: + case XML_SCHEMAS_NINTEGER: + case XML_SCHEMAS_NNINTEGER: { const xmlChar *cur = value; - unsigned long base = 0; - int total = 0; + unsigned long lo, mi, hi; int sign = 0; if (cur == NULL) goto return1; @@ -1714,34 +1871,53 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar *value, cur++; } else if (*cur == '+') cur++; - while (*cur == '0') { - total++; - cur++; - } - while ((*cur >= '0') && (*cur <= '9')) { - base = base * 10 + (*cur - '0'); - total++; - cur++; - } + ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); + if (ret == 0) + goto return1; if (*cur != 0) goto return1; - if ((sign == 1) && (total == 0)) - goto return1; - if (val != NULL) { - v = xmlSchemaNewValue(XML_SCHEMAS_INTEGER); + if (type->flags == XML_SCHEMAS_NPINTEGER) { + if ((sign == 0) && + ((hi != 0) || (mi != 0) || (lo != 0))) + goto return1; + } else if (type->flags == XML_SCHEMAS_PINTEGER) { + if (sign == 1) + goto return1; + if ((hi == 0) && (mi == 0) && (lo == 0)) + goto return1; + } else if (type->flags == XML_SCHEMAS_NINTEGER) { + if (sign == 0) + goto return1; + if ((hi == 0) && (mi == 0) && (lo == 0)) + goto return1; + } else if (type->flags == XML_SCHEMAS_NNINTEGER) { + if ((sign == 1) && + ((hi != 0) || (mi != 0) || (lo != 0))) + goto return1; + } + /* + * We can store a value only if no overflow occured + */ + if ((ret > 0) && (val != NULL)) { + v = xmlSchemaNewValue(type->flags); if (v != NULL) { - v->value.decimal.base = base; + v->value.decimal.lo = lo; + v->value.decimal.mi = lo; + v->value.decimal.hi = lo; v->value.decimal.sign = sign; v->value.decimal.frac = 0; - v->value.decimal.total = total; + v->value.decimal.total = cur - value; *val = v; } } goto return0; } - case XML_SCHEMAS_NPINTEGER: { + case XML_SCHEMAS_LONG: + case XML_SCHEMAS_BYTE: + case XML_SCHEMAS_SHORT: + case XML_SCHEMAS_INT: { const xmlChar *cur = value; - unsigned long base = 0; + unsigned long lo, mi, hi; int total = 0; int sign = 0; if (cur == NULL) @@ -1749,56 +1925,59 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar *value, if (*cur == '-') { sign = 1; cur++; - } - while ((*cur >= '0') && (*cur <= '9')) { - base = base * 10 + (*cur - '0'); - total++; + } else if (*cur == '+') cur++; - } + ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); + if (ret <= 0) + goto return1; if (*cur != 0) goto return1; - if ((sign != 1) && (base != 0)) - goto return1; - if (val != NULL) { - v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); - if (v != NULL) { - v->value.decimal.base = base; - v->value.decimal.sign = 0; - v->value.decimal.frac = 0; - v->value.decimal.total = total; - *val = v; + if (type->flags == XML_SCHEMAS_LONG) { + if (hi >= 922) { + if (hi > 922) + goto return1; + if (mi >= 33720368) { + if (mi > 33720368) + goto return1; + if ((sign == 0) && (lo > 54775807)) + goto return1; + if ((sign == 1) && (lo > 54775808)) + goto return1; + } } + } else if (type->flags == XML_SCHEMAS_INT) { + if (hi != 0) + goto return1; + if (mi >= 21) { + if (mi > 21) + goto return1; + if ((sign == 0) && (lo > 47483647)) + goto return1; + if ((sign == 1) && (lo > 47483648)) + goto return1; + } + } else if (type->flags == XML_SCHEMAS_SHORT) { + if ((mi != 0) || (hi != 0)) + goto return1; + if ((sign == 1) && (lo > 32768)) + goto return1; + if ((sign == 0) && (lo > 32767)) + goto return1; + } else if (type->flags == XML_SCHEMAS_BYTE) { + if ((mi != 0) || (hi != 0)) + goto return1; + if ((sign == 1) && (lo > 128)) + goto return1; + if ((sign == 0) && (lo > 127)) + goto return1; } - goto return0; - } - case XML_SCHEMAS_NINTEGER: - TODO; - break; - case XML_SCHEMAS_NNINTEGER: { - const xmlChar *cur = value; - unsigned long base = 0; - int total = 0; - int sign = 0; - if (cur == NULL) - goto return1; - if (*cur == '-') { - sign = 1; - cur++; - } - while ((*cur >= '0') && (*cur <= '9')) { - base = base * 10 + (*cur - '0'); - total++; - cur++; - } - if (*cur != 0) - goto return1; - if ((sign == 1) && (base != 0)) - goto return1; if (val != NULL) { - v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); + v = xmlSchemaNewValue(type->flags); if (v != NULL) { - v->value.decimal.base = base; - v->value.decimal.sign = 0; + v->value.decimal.lo = lo; + v->value.decimal.mi = lo; + v->value.decimal.hi = lo; + v->value.decimal.sign = sign; v->value.decimal.frac = 0; v->value.decimal.total = total; *val = v; @@ -1806,63 +1985,58 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar *value, } goto return0; } - case XML_SCHEMAS_PINTEGER: { + case XML_SCHEMAS_UINT: + case XML_SCHEMAS_ULONG: + case XML_SCHEMAS_USHORT: + case XML_SCHEMAS_UBYTE: { const xmlChar *cur = value; - unsigned long base = 0; + unsigned long lo, mi, hi; int total = 0; if (cur == NULL) goto return1; - if (*cur == '+') - cur++; - while ((*cur >= '0') && (*cur <= '9')) { - base = base * 10 + (*cur - '0'); - total++; - cur++; - } + ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); + if (ret <= 0) + goto return1; if (*cur != 0) goto return1; - if (val != NULL) { - v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); - if (v != NULL) { - v->value.decimal.base = base; - v->value.decimal.sign = 0; - v->value.decimal.frac = 0; - v->value.decimal.total = total; - *val = v; + if (type->flags == XML_SCHEMAS_ULONG) { + if (hi >= 1844) { + if (hi > 1844) + goto return1; + if (mi >= 67440737) { + if (mi > 67440737) + goto return1; + if (lo > 9551615) + goto return1; + } } + } else if (type->flags == XML_SCHEMAS_UINT) { + if (hi != 0) + goto return1; + if (mi >= 42) { + if (mi > 42) + goto return1; + if (lo > 94967295) + goto return1; + } + } else if (type->flags == XML_SCHEMAS_USHORT) { + if ((mi != 0) || (hi != 0)) + goto return1; + if (lo > 65535) + goto return1; + } else if (type->flags == XML_SCHEMAS_UBYTE) { + if ((mi != 0) || (hi != 0)) + goto return1; + if (lo > 255) + goto return1; } - goto return0; - } - case XML_SCHEMAS_INT: { - const xmlChar *cur = value; - unsigned long base = 0; - int total = 0; - int sign = 0; - if (cur == NULL) - goto return1; - if (*cur == '-') { - sign = 1; - cur++; - } else if (*cur == '+') - cur++; - while (*cur == '0') { - total++; - cur++; - } - while ((*cur >= '0') && (*cur <= '9')) { - base = base * 10 + (*cur - '0'); - total++; - cur++; - } - if (*cur != 0) - goto return1; - if ((sign == 1) && (total == 0)) - goto return1; if (val != NULL) { - v = xmlSchemaNewValue(XML_SCHEMAS_INT); + v = xmlSchemaNewValue(type->flags); if (v != NULL) { - v->value.decimal.base = base; - v->value.decimal.sign = sign; + v->value.decimal.lo = lo; + v->value.decimal.mi = mi; + v->value.decimal.hi = hi; + v->value.decimal.sign = 0; v->value.decimal.frac = 0; v->value.decimal.total = total; *val = v; @@ -1870,27 +2044,6 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar *value, } goto return0; } - case XML_SCHEMAS_UINT: - TODO; - break; - case XML_SCHEMAS_LONG: - TODO; - break; - case XML_SCHEMAS_ULONG: - TODO; - break; - case XML_SCHEMAS_SHORT: - TODO; - break; - case XML_SCHEMAS_USHORT: - TODO; - break; - case XML_SCHEMAS_BYTE: - TODO; - break; - case XML_SCHEMAS_UBYTE: - TODO; - break; } done: @@ -1960,21 +2113,38 @@ static int xmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y) { xmlSchemaValPtr swp; - int order = 1; + int order = 1, p; unsigned long tmp; - if ((x->value.decimal.sign) && (x->value.decimal.base != 0)) { - if ((y->value.decimal.sign) && (y->value.decimal.base != 0)) + if ((x->value.decimal.sign) && + ((x->value.decimal.lo != 0) || + (x->value.decimal.mi != 0) || + (x->value.decimal.hi != 0))) { + if ((y->value.decimal.sign) && + ((y->value.decimal.lo != 0) || + (y->value.decimal.mi != 0) || + (y->value.decimal.hi != 0))) order = -1; else return (-1); - } else if ((y->value.decimal.sign) && (y->value.decimal.base != 0)) { + } else if ((y->value.decimal.sign) && + ((y->value.decimal.lo != 0) || + (y->value.decimal.mi != 0) || + (y->value.decimal.hi != 0))) { return (1); } if (x->value.decimal.frac == y->value.decimal.frac) { - if (x->value.decimal.base < y->value.decimal.base) + if (x->value.decimal.hi < y->value.decimal.hi) + return (-order); + if (x->value.decimal.hi < y->value.decimal.hi) + return (order); + if (x->value.decimal.mi < y->value.decimal.mi) + return (-order); + if (x->value.decimal.mi < y->value.decimal.mi) + return (order); + if (x->value.decimal.lo < y->value.decimal.lo) return (-order); - if (x->value.decimal.base > y->value.decimal.base) + if (x->value.decimal.lo > y->value.decimal.lo) return(order); return(0); } @@ -1984,19 +2154,16 @@ xmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y) x = swp; order = -order; } - tmp = - x->value.decimal.base / powten[x->value.decimal.frac - - y->value.decimal.frac]; - if (tmp > y->value.decimal.base) + p = powten[x->value.decimal.frac - y->value.decimal.frac]; + tmp = x->value.decimal.lo / p; + if (tmp > y->value.decimal.lo) return (order); - if (tmp < y->value.decimal.base) + if (tmp < y->value.decimal.lo) return (-order); - tmp = - y->value.decimal.base * powten[x->value.decimal.frac - - y->value.decimal.frac]; - if (x->value.decimal.base < tmp) + tmp = y->value.decimal.lo * p; + if (x->value.decimal.lo < tmp) return (-order); - if (x->value.decimal.base == tmp) + if (x->value.decimal.lo == tmp) return (0); return (order); } @@ -2791,7 +2958,6 @@ xmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) { case XML_SCHEMAS_LANGUAGE: case XML_SCHEMAS_NMTOKEN: case XML_SCHEMAS_NAME: - case XML_SCHEMAS_QNAME: case XML_SCHEMAS_NCNAME: case XML_SCHEMAS_ID: case XML_SCHEMAS_IDREF: @@ -2812,7 +2978,14 @@ xmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) { (y->type == XML_SCHEMAS_ANYURI)) return (xmlSchemaCompareNormStrings(x, y)); return (-2); - + case XML_SCHEMAS_QNAME: + if (y->type == XML_SCHEMAS_QNAME) { + if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) && + (xmlStrEqual(x->value.qname.uri, y->value.qname.uri))) + return(0); + return(2); + } + return (-2); case XML_SCHEMAS_FLOAT: case XML_SCHEMAS_DOUBLE: if ((y->type == XML_SCHEMAS_FLOAT) || @@ -2969,7 +3142,8 @@ xmlSchemaValidateFacet(xmlSchemaTypePtr base ATTRIBUTE_UNUSED, unsigned int len = 0; if ((facet->val == NULL) || - (facet->val->type != XML_SCHEMAS_DECIMAL) || + ((facet->val->type != XML_SCHEMAS_DECIMAL) && + (facet->val->type != XML_SCHEMAS_NNINTEGER)) || (facet->val->value.decimal.frac != 0)) { return(-1); } @@ -2991,13 +3165,13 @@ xmlSchemaValidateFacet(xmlSchemaTypePtr base ATTRIBUTE_UNUSED, TODO } if (facet->type == XML_SCHEMA_FACET_LENGTH) { - if (len != facet->val->value.decimal.base) + if (len != facet->val->value.decimal.lo) return(1); } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { - if (len < facet->val->value.decimal.base) + if (len < facet->val->value.decimal.lo) return(1); } else { - if (len > facet->val->value.decimal.base) + if (len > facet->val->value.decimal.lo) return(1); } break; |