diff options
author | William M. Brack <wbrack@src.gnome.org> | 2005-03-15 15:50:17 +0000 |
---|---|---|
committer | William M. Brack <wbrack@src.gnome.org> | 2005-03-15 15:50:17 +0000 |
commit | ec3b4b7d7f67760d72fa493f94b6672b45777bbb (patch) | |
tree | 4881323d12f9ac28d2a348e8cca6d4f96974d8ed /xmlschemastypes.c | |
parent | 6c81d0ea8dcb47a8ca15796daa764ff883d985d8 (diff) | |
download | libxml2-ec3b4b7d7f67760d72fa493f94b6672b45777bbb.tar.gz |
a couple of more changes to various decimal-handling routines. Fixes
* xmlschemastypes.c: a couple of more changes to various
decimal-handling routines. Fixes python some problems
turned up by the python tests.
* Makefile.am: change SchemasPythonTests message to warn
that there are 10 'expected' errors (rather than 6) since
we now reject a '+' sign on an unsigned.
Diffstat (limited to 'xmlschemastypes.c')
-rw-r--r-- | xmlschemastypes.c | 84 |
1 files changed, 22 insertions, 62 deletions
diff --git a/xmlschemastypes.c b/xmlschemastypes.c index d7249e08..52727b54 100644 --- a/xmlschemastypes.c +++ b/xmlschemastypes.c @@ -1761,7 +1761,8 @@ xmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value, * * Parse an unsigned long into 3 fields. * - * Returns the number of chars parsed or -1 if overflow of the capacity + * Returns the number of significant digits in the number or + * -1 if overflow of the capacity */ static int xmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, @@ -1770,8 +1771,7 @@ xmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, const xmlChar *tmp, *cur = *str; int ret = 0, i = 0; - while (*cur == '0') { - ret++; + while (*cur == '0') { /* ignore leading zeroes */ cur++; } tmp = cur; @@ -1923,7 +1923,6 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, } if (*cur != 0) goto return1; /* error if any extraneous chars */ - if (val != NULL) { v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); if (v != NULL) { @@ -2637,7 +2636,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, case XML_SCHEMAS_NNINTEGER:{ const xmlChar *cur = value; unsigned long lo, mi, hi; - int sign = 0, total = 0; + int sign = 0; if (cur == NULL) goto return1; @@ -2646,22 +2645,11 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, cur++; } else if (*cur == '+') cur++; - /* Skip leading zeroes. */ - while ((*cur == '0') && ((*(cur + 1)) != 0)) - cur++; - if (*cur != '0') { - total = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); - if (total <= 0) - goto return1; - if (*cur != 0) - goto return1; - } else { - /* Tiny speedup for "0" */ - total = 1; - lo = 0; - mi = 0; - hi = 0; - } + ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); + if (ret == -1) + goto return1; + if (*cur != 0) + goto return1; if (type->builtInType == XML_SCHEMAS_NPINTEGER) { if ((sign == 0) && ((hi != 0) || (mi != 0) || (lo != 0))) @@ -2681,9 +2669,6 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, ((hi != 0) || (mi != 0) || (lo != 0))) goto return1; } - /* - * We can store a value only if no overflow occured - */ if (val != NULL) { v = xmlSchemaNewValue(type->builtInType); if (v != NULL) { @@ -2692,7 +2677,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, v->value.decimal.hi = hi; v->value.decimal.sign = sign; v->value.decimal.frac = 0; - v->value.decimal.total = total; + v->value.decimal.total = ret; *val = v; } } @@ -2704,7 +2689,6 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, case XML_SCHEMAS_INT:{ const xmlChar *cur = value; unsigned long lo, mi, hi; - int total = 0; int sign = 0; if (cur == NULL) @@ -2714,22 +2698,11 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, cur++; } else if (*cur == '+') cur++; - /* Skip leading zeroes. */ - while ((*cur == '0') && ((*(cur + 1)) != 0)) - cur++; - if (*cur != '0') { - total = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); - if (total <= 0) - goto return1; - if (*cur != 0) - goto return1; - } else { - /* Tiny speedup for "0" */ - total = 1; - lo = 0; - mi = 0; - hi = 0; - } + ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); + if (ret < 0) + goto return1; + if (*cur != 0) + goto return1; if (type->builtInType == XML_SCHEMAS_LONG) { if (hi >= 922) { if (hi > 922) @@ -2777,7 +2750,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, v->value.decimal.hi = hi; v->value.decimal.sign = sign; v->value.decimal.frac = 0; - v->value.decimal.total = total; + v->value.decimal.total = ret; *val = v; } } @@ -2789,27 +2762,14 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, case XML_SCHEMAS_UBYTE:{ const xmlChar *cur = value; unsigned long lo, mi, hi; - int total = 0; if (cur == NULL) goto return1; - /* Note that "+" is not allowed. */ - /* Skip leading zeroes. */ - while ((*cur == '0') && ((*(cur + 1)) != 0)) - cur++; - if (*cur != '0') { - total = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); - if (total <= 0) - goto return1; - if (*cur != 0) - goto return1; - } else { - /* Tiny speedup for "0" */ - total = 1; - lo = 0; - mi = 0; - hi = 0; - } + ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); + if (ret < 0) + goto return1; + if (*cur != 0) + goto return1; if (type->builtInType == XML_SCHEMAS_ULONG) { if (hi >= 1844) { if (hi > 1844) @@ -2849,7 +2809,7 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, v->value.decimal.hi = hi; v->value.decimal.sign = 0; v->value.decimal.frac = 0; - v->value.decimal.total = total; + v->value.decimal.total = ret; *val = v; } } |