Index: xmlschemastypes.c =================================================================== RCS file: /cvs/gnome/libxml2/xmlschemastypes.c,v retrieving revision 1.41 diff -c -r1.41 xmlschemastypes.c *** xmlschemastypes.c 15 Jul 2003 13:34:05 -0000 1.41 --- xmlschemastypes.c 26 Jul 2003 16:48:41 -0000 *************** *** 29,34 **** --- 29,36 ---- #include #endif + #define NUMBER + #define DEBUG #define TODO \ *************** *** 86,95 **** --- 88,100 ---- XML_SCHEMAS_HEXBINARY } xmlSchemaValType; + #if defined(NUMBER) + #else static unsigned long powten[10] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000L, 100000000L, 1000000000L }; + #endif /* Date value */ typedef struct _xmlSchemaValDate xmlSchemaValDate; *************** *** 134,143 **** --- 139,165 ---- xmlChar *uri; }; + #if defined(NUMBER) + typedef struct _xmlSchemaValNumber xmlSchemaValNumber; + typedef xmlSchemaValNumber *xmlSchemaValNumberPtr; + struct _xmlSchemaValNumber { + xmlChar *istr; + xmlChar *fstr; + unsigned int sign:1; + unsigned int fsize:31; + unsigned int isize; + unsigned int total; + }; + #endif + struct _xmlSchemaVal { xmlSchemaValType type; union { + #if defined(NUMBER) + xmlSchemaValNumber number; + #else xmlSchemaValDecimal decimal; + #endif xmlSchemaValDate date; xmlSchemaValDuration dur; xmlSchemaValQName qname; *************** *** 413,418 **** --- 435,462 ---- if (value->value.qname.name != NULL) xmlFree(value->value.qname.name); break; + #if defined(NUMBER) + case XML_SCHEMAS_HEXBINARY: + case XML_SCHEMAS_DECIMAL: + case XML_SCHEMAS_INTEGER: + case XML_SCHEMAS_PINTEGER: + case XML_SCHEMAS_NPINTEGER: + case XML_SCHEMAS_NINTEGER: + case XML_SCHEMAS_NNINTEGER: + case XML_SCHEMAS_LONG: + case XML_SCHEMAS_BYTE: + case XML_SCHEMAS_SHORT: + case XML_SCHEMAS_INT: + case XML_SCHEMAS_ULONG: + case XML_SCHEMAS_UBYTE: + case XML_SCHEMAS_USHORT: + case XML_SCHEMAS_UINT: + if (value->value.number.istr != NULL) + xmlFree(value->value.number.istr); + if (value->value.number.fstr != NULL) + xmlFree(value->value.number.fstr); + break; + #endif default: break; } *************** *** 1314,1319 **** --- 1358,1423 ---- return(-1); } + + #if defined(NUMBER) + /** + * xmlSchemaParseNumber: + * @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 + xmlSchemaParseNumber(const xmlChar **istr, int *idig, + const xmlChar **fstr, int *fdig, int *iszero) { + const xmlChar *tmp, *ftmp = 0, *cur = *istr; + int ret = 0, i = 0, j = 0, z = 1; + + /* remove leading zeros */ + while (*cur == '0') { + cur++; + } + /* insure there is at least one zero */ + if ((*cur == 0) || (*cur == '.')) { + cur--; + if (*cur != '0') + return(-1); + } + + tmp = cur; + while ((*tmp >= '0') && (*tmp <= '9')) { + if (*tmp != '0') + z = 0; + i++;tmp++;ret++; + } + + ftmp = tmp; + if (*tmp == '.') { + tmp++; + /*ftmp = tmp;*/ + while ((*tmp >= '0') && (*tmp <= '9')) { + if (*tmp != '0') + z = 0; + j++;tmp++;ret++; + } + } + + if (*tmp != 0) + return(-1); + + *istr = cur; + *idig = i; + *fstr = ftmp; + *fdig = j; + *iszero = z; + return(ret); + } + #else + /** * xmlSchemaParseUInt: * @str: pointer to the string R/W *************** *** 1363,1368 **** --- 1467,1514 ---- *lhi = hi; return(ret); } + #endif + + #if defined(NUMBER) + /** + * _xmlSchemaCompareIntStr: + * @x: a first decimal value + * @y: a second decimal value + * + * Compare 2 decimals + * assume the paser sets - zero to + zero + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error + */ + static int + _xmlSchemaCompareIntStr(int xsign, const xmlChar *xstr, unsigned int xlen, + int ysign, const xmlChar *ystr, unsigned int ylen) { + int ret = 1, sign_adjust = (xsign ? -1 : 1); + + if (xsign == ysign) { + #if 0 + int xlen, ylen; + + /* compare string lengths */ + xlen = xmlStrlen(xstr); + ylen = xmlStrlen(ystr); + #endif + + if (xlen == ylen) { + + /* compare string values */ + ret = xmlStrcmp(xstr, ystr); + + if (ret == 0) + return(0); + } + if (xlen < ylen) + ret = -1; + } + + return(ret * sign_adjust); + } + #endif /** * xmlSchemaValAtomicType: *************** *** 1412,1417 **** --- 1558,1610 ---- TODO goto return0; case XML_SCHEMAS_DECIMAL: { + #if defined(NUMBER) + const xmlChar *cur = value, *fstr; + xmlChar *iptr, *fptr = NULL; + int idig, fdig, total, iszero; + int neg = 0; + if (cur == NULL) + goto return1; + if (*cur == '+') + cur++; + else if (*cur == '-') { + neg = 1; + cur++; + } + total = xmlSchemaParseNumber(&cur, &idig, &fstr, &fdig, &iszero); + if (total < 0) + goto return1; + if (idig == 0) + goto return1; + + iptr = xmlStrndup(cur, idig); + if (iptr == NULL) + goto return1; + + if (fdig > 0) { + if (*fstr == '.') + fstr++; + + fptr = xmlStrndup(fstr, fdig); + if (fptr == NULL) { + xmlFree(iptr); + goto return1; + } + } + + if (val != NULL) { + v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); + if (v != NULL) { + v->value.number.sign = neg; + v->value.number.istr = iptr; + v->value.number.fstr = fptr; + v->value.number.isize = idig; + v->value.number.fsize = fdig; + v->value.number.total = total; + *val = v; + } + } + #else const xmlChar *cur = value, *tmp; int frac = 0, len, neg = 0; unsigned long base = 0; *************** *** 1450,1455 **** --- 1643,1649 ---- *val = v; } } + #endif goto return0; } case XML_SCHEMAS_TIME: *************** *** 1919,1924 **** --- 2113,2171 ---- goto return0; } case XML_SCHEMAS_HEXBINARY: { + #if defined(NUMBER) + const xmlChar *tmp, *cur = value; + xmlChar *base; + int total, i = 0; + + while ((cur[0] == '0') && (cur[1] == '0') && (cur[2] != 0)) + cur += 2; + + tmp = cur; + while (((*tmp >= '0') && (*tmp <= '9')) || + ((*tmp >= 'A') && (*tmp <= 'F')) || + ((*tmp >= 'a') && (*tmp <= 'f'))) { + i++;tmp++; + } + + if (*tmp != 0) + goto return1; + if ((i % 2) != 0) + goto return1; + + tmp = xmlMalloc(i+1); + if (tmp == NULL) + goto return1; + + total = i / 2; /* number of octets */ + + base = (xmlChar *)tmp; + while (i > 0) { + if (((*cur >= '0') && (*cur <= '9')) || + ((*cur >= 'A') && (*cur <= 'F'))) { + *base = *cur; + } else if ((*cur >= 'a') && (*cur <= 'f')) { + *base = *cur - ('a' - 'A'); + } + + cur++;base++; + i--; + } + *base = 0; + + if (val != NULL) { + v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); + if (v != NULL) { + v->value.number.istr = (xmlChar *)tmp; + v->value.number.total = total; + v->value.number.isize = total; + *val = v; + } else { + goto error; + } + } + goto return0; + #else const xmlChar *tmp, *cur = value; int total, i = 0; unsigned long lo = 0, mi = 0, hi = 0; *************** *** 1980,1991 **** --- 2227,2290 ---- } } goto return0; + #endif } case XML_SCHEMAS_INTEGER: case XML_SCHEMAS_PINTEGER: case XML_SCHEMAS_NPINTEGER: case XML_SCHEMAS_NINTEGER: case XML_SCHEMAS_NNINTEGER: { + #if defined(NUMBER) + const xmlChar *cur = value, *fstr; + xmlChar *iptr, *fptr = NULL; + int idig, fdig, total, iszero; + int neg = 0; + if (cur == NULL) + goto return1; + if (*cur == '+') + cur++; + else if (*cur == '-') { + neg = 1; + cur++; + } + total = xmlSchemaParseNumber(&cur, &idig, &fstr, &fdig, &iszero); + if (total < 0) + goto return1; + if (idig == 0) + goto return1; + if ((fdig > 0) || (*fstr == '.')) + goto return1; + if (type->flags == XML_SCHEMAS_NPINTEGER) { + if ((neg == 0) && (!iszero)) + goto return1; + } else if (type->flags == XML_SCHEMAS_PINTEGER) { + if ((neg == 1) || (iszero)) + goto return1; + } else if (type->flags == XML_SCHEMAS_NINTEGER) { + if ((neg == 0) || (iszero)) + goto return1; + } else if (type->flags == XML_SCHEMAS_NNINTEGER) { + if ((neg == 1) && (!iszero)) + goto return1; + } + + iptr = xmlStrndup(cur, idig); + if (iptr == NULL) + goto return1; + + if (val != NULL) { + v = xmlSchemaNewValue(type->flags); + if (v != NULL) { + v->value.number.sign = neg; + v->value.number.istr = iptr; + v->value.number.fstr = fptr; + v->value.number.isize = idig; + v->value.number.fsize = fdig; + v->value.number.total = total; + *val = v; + } + } + #else const xmlChar *cur = value; unsigned long lo, mi, hi; int sign = 0; *************** *** 2035,2046 **** --- 2334,2419 ---- *val = v; } } + #endif goto return0; } case XML_SCHEMAS_LONG: case XML_SCHEMAS_BYTE: case XML_SCHEMAS_SHORT: case XML_SCHEMAS_INT: { + #if defined(NUMBER) + const xmlChar *cur = value, *fstr; + xmlChar *iptr, *fptr = NULL; + int idig, fdig, total, iszero; + int neg = 0; + if (cur == NULL) + goto return1; + if (*cur == '+') + cur++; + else if (*cur == '-') { + neg = 1; + cur++; + } + total = xmlSchemaParseNumber(&cur, &idig, &fstr, &fdig, &iszero); + if (total < 0) + goto return1; + if (idig == 0) + goto return1; + if ((fdig > 0) || (*fstr == '.')) + goto return1; + else { + const xmlChar lpos[] = "9223372036854775807"; + const xmlChar lneg[] = "9223372036854775808"; + const xmlChar ipos[] = "2147483647"; + const xmlChar ineg[] = "2147483648"; + const xmlChar spos[] = "32767"; + const xmlChar sneg[] = "32768"; + const xmlChar bpos[] = "127"; + const xmlChar bneg[] = "128"; + const xmlChar *pstr, *nstr; + int ret; + unsigned int len; + + if (type->flags == XML_SCHEMAS_LONG) { + pstr = lpos; nstr = lneg; len = xmlStrlen(lpos); + } + else if (type->flags == XML_SCHEMAS_INT) { + pstr = ipos; nstr = ineg; len = xmlStrlen(ipos); + } + else if (type->flags == XML_SCHEMAS_SHORT) { + pstr = spos; nstr = sneg; len = xmlStrlen(spos); + } + else if (type->flags == XML_SCHEMAS_BYTE) { + pstr = bpos; nstr = bneg; len = xmlStrlen(bpos); + } + else + goto return1; + + ret = _xmlSchemaCompareIntStr(neg, cur, idig, 0, pstr, len); + if (ret > 0) + goto return1; + ret = _xmlSchemaCompareIntStr(neg, cur, idig, 1, nstr, len); + if (ret < 0) + goto return1; + } + + iptr = xmlStrndup(cur, idig); + if (iptr == NULL) + goto return1; + + if (val != NULL) { + v = xmlSchemaNewValue(type->flags); + if (v != NULL) { + v->value.number.sign = neg; + v->value.number.istr = iptr; + v->value.number.fstr = fptr; + v->value.number.isize = idig; + v->value.number.fsize = fdig; + v->value.number.total = total; + *val = v; + } + } + #else const xmlChar *cur = value; unsigned long lo, mi, hi; int total = 0; *************** *** 2108,2119 **** --- 2481,2556 ---- *val = v; } } + #endif goto return0; } case XML_SCHEMAS_UINT: case XML_SCHEMAS_ULONG: case XML_SCHEMAS_USHORT: case XML_SCHEMAS_UBYTE: { + #if defined(NUMBER) + const xmlChar *cur = value, *fstr; + xmlChar *iptr, *fptr = NULL; + int idig, fdig, total, iszero; + if (cur == NULL) + goto return1; + if (*cur == '+') + cur++; + else if (*cur == '-') + goto return1; + + total = xmlSchemaParseNumber(&cur, &idig, &fstr, &fdig, &iszero); + if (total < 0) + goto return1; + if (idig == 0) + goto return1; + if ((fdig > 0) || (*fstr == '.')) + goto return1; + else { + const xmlChar lpos[] = "1844674407379551615"; + const xmlChar ipos[] = "4294967295"; + const xmlChar spos[] = "65535"; + const xmlChar bpos[] = "255"; + const xmlChar *pstr; + int ret; + unsigned int len; + + if (type->flags == XML_SCHEMAS_ULONG) { + pstr = lpos; len = xmlStrlen(lpos); + } + else if (type->flags == XML_SCHEMAS_UINT) { + pstr = ipos; len = xmlStrlen(ipos); + } + else if (type->flags == XML_SCHEMAS_UBYTE) { + pstr = spos; len = xmlStrlen(spos); + } + else if (type->flags == XML_SCHEMAS_UBYTE) { + pstr = bpos; len = xmlStrlen(bpos); + } + else + goto return1; + + ret = _xmlSchemaCompareIntStr(0, cur, idig, 0, pstr, len); + if (ret > 0) + goto return1; + } + + iptr = xmlStrndup(cur, idig); + if (iptr == NULL) + goto return1; + + if (val != NULL) { + v = xmlSchemaNewValue(type->flags); + if (v != NULL) { + v->value.number.istr = iptr; + v->value.number.fstr = fptr; + v->value.number.isize = idig; + v->value.number.fsize = fdig; + v->value.number.total = total; + *val = v; + } + } + #else const xmlChar *cur = value; unsigned long lo, mi, hi; int total = 0; *************** *** 2167,2172 **** --- 2604,2610 ---- *val = v; } } + #endif goto return0; } } *************** *** 2225,2230 **** --- 2663,2807 ---- return(xmlSchemaValPredefTypeNode(type, value, val, NULL)); } + #if defined(NUMBER) + /** + * xmlSchemaCompareNumbers: + * @x: a first number value + * @y: a second number value + * + * Compare 2 numbers + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error + */ + static int + xmlSchemaCompareNumbers(xmlSchemaValPtr x, xmlSchemaValPtr y) + { + /* xmlSchemaValPtr swp; + int order = 1, p, ret; + unsigned long tmp; + const xmlChar zero[2] = { '0', 0 }; + */ + int ret, xlen, ylen; + + if ((x->value.number.istr == NULL) || (y->value.number.istr == NULL)) + return(-2); + + #if 0 + /* + * assume the paser sets zero to + zero + */ + if (x->value.number.sign != y->value.number.sign) { + if (x->value.number.sign == 1) + return(-1); + else + return(1); + #if 0 + if (xmlStrEqual(x->value.number.istr, &zero)) { + + if (xmlStrEqual(y->value.number.istr, &zero)) + return(0); + + if (y->value.number.sign == 1) + return(1); + + return(-1); + } + else if (xmlStrEqual(y->value.number.istr, &zero)) { + if (x->value.number.sign == 1) + return(-1); + else + return(1); + } + #endif + } + + /* compare string lengths */ + xlen = xmlStrlen(x->value.number.istr); + ylen = xmlStrlen(y->value.number.istr); + + if (xlen != ylen) { + if (xlen < ylen) { + if (y->value.number.sign) + return(1); + else + return(-1); + } + if (x->value.number.sign) + return(1); + else + return(-1); + } + + /* compare string values */ + ret = xmlStrcmp(x->value.number.istr, y->value.number.istr); + + if (ret == -1) { + if (y->value.number.sign) + return(1); + else + return(-1); + } + else if (ret == 1) { + if (x->value.number.sign) + return(-1); + else + return(1); + } + + #endif + ret = _xmlSchemaCompareIntStr(x->value.number.sign, + x->value.number.istr, + x->value.number.isize, + y->value.number.sign, + y->value.number.istr, + y->value.number.isize); + if (ret != 0) + return(ret); + + /* integer portion is equal */ + + if ((x->value.number.fstr == NULL) || + (y->value.number.fstr == NULL)) { + + if (x->value.number.sign) + return(-1); + return(1); + } + + xlen = x->value.number.fsize; + ylen = y->value.number.fsize; + + ret = xmlStrncmp( + x->value.number.istr, + x->value.number.istr, + (xlen < ylen ? xlen : ylen)); + + if (ret == -1) { + if (y->value.number.sign) + return(1); + return(-1); + } + else if (ret == 1) { + if (x->value.number.sign) + return(-1); + return(1); + } + + if (xlen < ylen) { + if (y->value.number.sign) + return(1); + return(-1); + } + else if (xlen > ylen) { + if (x->value.number.sign) + return(-1); + return(1); + } + + return(0); + } + #else + /** * xmlSchemaCompareDecimals: * @x: a first decimal value *************** *** 2292,2297 **** --- 2869,2875 ---- return (0); return (order); } + #endif /** * xmlSchemaCompareDurations: *************** *** 3041,3047 **** --- 3619,3629 ---- case XML_SCHEMAS_UBYTE: case XML_SCHEMAS_DECIMAL: if (y->type == x->type) + #if defined(NUMBER) + return(xmlSchemaCompareNumbers(x, y)); + #else return(xmlSchemaCompareDecimals(x, y)); + #endif if ((y->type == XML_SCHEMAS_DECIMAL) || (y->type == XML_SCHEMAS_INTEGER) || (y->type == XML_SCHEMAS_NPINTEGER) || *************** *** 3056,3062 **** --- 3638,3648 ---- (y->type == XML_SCHEMAS_USHORT) || (y->type == XML_SCHEMAS_BYTE) || (y->type == XML_SCHEMAS_UBYTE)) + #if defined(NUMBER) + return(xmlSchemaCompareNumbers(x, y)); + #else return(xmlSchemaCompareDecimals(x, y)); + #endif return(-2); case XML_SCHEMAS_DURATION: if (y->type == XML_SCHEMAS_DURATION) *************** *** 3130,3136 **** --- 3716,3726 ---- return (-2); case XML_SCHEMAS_HEXBINARY: if (y->type == XML_SCHEMAS_HEXBINARY) + #if defined(NUMBER) + return (xmlSchemaCompareNumbers(x, y)); + #else return (xmlSchemaCompareDecimals(x, y)); + #endif return (-2); case XML_SCHEMAS_STRING: case XML_SCHEMAS_IDREFS: *************** *** 3188,3193 **** --- 3778,3815 ---- return(ret); } + #if defined(NUMBER) + /** + * xmlSchemaValNumber2ULong + * @number: pointer to xmlSchemaValNumber type + * @result: pointer to result of conversion + * + * Convert the integer portion of the number string to an unsigned long + * value. This function assumes the integer string in the Number type + * is decimal and the Number is non-negative. + * + * Returns 0 if successful, -1 if API error, or positive error code + * on conversion error. + */ + int xmlSchemaValNumber2ULong(xmlSchemaValNumberPtr number, + unsigned long *result) + { + unsigned long base = 0; + + if (number == NULL || result == NULL) + return (-1); + if (number->sign || (number->fsize > 0) || (number->istr == NULL)) + return (-1); + + if (sscanf((const char *)number->istr, "%lu", &base) != 1) + return (1); + + *result = base; + + return (0); + } + #endif + /** * xmlSchemaValidateFacet: * @base: the base type *************** *** 3269,3284 **** case XML_SCHEMA_FACET_MAXLENGTH: case XML_SCHEMA_FACET_MINLENGTH: { unsigned int len = 0; if ((facet->val == NULL) || ((facet->val->type != XML_SCHEMAS_DECIMAL) && (facet->val->type != XML_SCHEMAS_NNINTEGER)) || ! (facet->val->value.decimal.frac != 0)) { return(-1); } if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) len = val->value.decimal.total; else { switch (base->flags) { case XML_SCHEMAS_IDREF: case XML_SCHEMAS_NORMSTRING: --- 3891,3924 ---- case XML_SCHEMA_FACET_MAXLENGTH: case XML_SCHEMA_FACET_MINLENGTH: { unsigned int len = 0; + unsigned long facet_len = 0; if ((facet->val == NULL) || ((facet->val->type != XML_SCHEMAS_DECIMAL) && (facet->val->type != XML_SCHEMAS_NNINTEGER)) || ! #if defined(NUMBER) ! (facet->val->value.number.fsize != 0)) ! #else ! (facet->val->value.decimal.frac != 0)) ! #endif ! { return(-1); } + #if defined(NUMBER) + if (xmlSchemaValNumber2ULong(&facet->val->value.number, &facet_len) != 0) + return (-1); + #else + facet_len = facet->val->value.decimal.lo; + #endif + #if 0 if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) + #if 1 + len = val->value.number.total; + #else len = val->value.decimal.total; + #endif else { + #endif switch (base->flags) { case XML_SCHEMAS_IDREF: case XML_SCHEMAS_NORMSTRING: *************** *** 3292,3323 **** break; case XML_SCHEMAS_STRING: len = xmlUTF8Strlen(value); ! break; default: TODO } } if (facet->type == XML_SCHEMA_FACET_LENGTH) { ! if (len != facet->val->value.decimal.lo) return(1); } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { ! if (len < facet->val->value.decimal.lo) return(1); } else { ! if (len > facet->val->value.decimal.lo) return(1); } break; } - case XML_SCHEMA_FACET_TOTALDIGITS: case XML_SCHEMA_FACET_FRACTIONDIGITS: if ((facet->val == NULL) || ((facet->val->type != XML_SCHEMAS_DECIMAL) && (facet->val->type != XML_SCHEMAS_NNINTEGER)) || ! (facet->val->value.decimal.frac != 0)) { return(-1); } if ((val == NULL) || ((val->type != XML_SCHEMAS_DECIMAL) && (val->type != XML_SCHEMAS_INTEGER) && --- 3932,3998 ---- break; case XML_SCHEMAS_STRING: len = xmlUTF8Strlen(value); ! break; ! #if defined(NUMBER) ! case XML_SCHEMAS_HEXBINARY: ! case XML_SCHEMAS_DECIMAL: ! case XML_SCHEMAS_INTEGER: ! case XML_SCHEMAS_PINTEGER: ! case XML_SCHEMAS_NPINTEGER: ! case XML_SCHEMAS_NINTEGER: ! case XML_SCHEMAS_NNINTEGER: ! case XML_SCHEMAS_LONG: ! case XML_SCHEMAS_BYTE: ! case XML_SCHEMAS_SHORT: ! case XML_SCHEMAS_INT: ! case XML_SCHEMAS_ULONG: ! case XML_SCHEMAS_UBYTE: ! case XML_SCHEMAS_USHORT: ! case XML_SCHEMAS_UINT: ! len = val->value.number.total; ! break; ! #endif default: TODO } + #if 0 } + #endif if (facet->type == XML_SCHEMA_FACET_LENGTH) { ! if (len != facet_len) return(1); } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { ! if (len < facet_len) return(1); } else { ! if (len > facet_len) return(1); } break; } case XML_SCHEMA_FACET_FRACTIONDIGITS: + if (val->type != XML_SCHEMAS_DECIMAL) + return(1); + case XML_SCHEMA_FACET_TOTALDIGITS: { + unsigned long facet_len = 0; if ((facet->val == NULL) || ((facet->val->type != XML_SCHEMAS_DECIMAL) && (facet->val->type != XML_SCHEMAS_NNINTEGER)) || ! #if defined(NUMBER) ! (facet->val->value.number.fsize != 0)) ! #else ! (facet->val->value.decimal.frac != 0)) ! #endif ! { return(-1); } + #if defined(NUMBER) + if (xmlSchemaValNumber2ULong(&facet->val->value.number, &facet_len) != 0) + return(-1); + #else + facet_len = facet->val->value.decimal.lo; + #endif if ((val == NULL) || ((val->type != XML_SCHEMAS_DECIMAL) && (val->type != XML_SCHEMAS_INTEGER) && *************** *** 3335,3348 **** (val->type != XML_SCHEMAS_UBYTE))) { return(-1); } if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { ! if (val->value.decimal.total > facet->val->value.decimal.lo) return(1); } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { ! if (val->value.decimal.frac > facet->val->value.decimal.lo) return(1); } break; default: TODO --- 4010,4035 ---- (val->type != XML_SCHEMAS_UBYTE))) { return(-1); } + #if defined(NUMBER) if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { ! if (val->value.number.total > facet_len) return(1); } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { ! if (val->value.number.fsize > facet_len) return(1); } + #else + if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { + if (val->value.decimal.total > facet_len) + return(1); + + } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { + if (val->value.decimal.frac > facet_len) + return(1); + } + #endif + } break; default: TODO