summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Shafer <phil@juniper.net>2010-11-03 19:53:55 (GMT)
committerDaniel Veillard <veillard@redhat.com>2010-11-03 19:53:55 (GMT)
commitee32ad3c0f6dfbb1b0e57db63d16f6455d6416df (patch)
treea4d35c5c67761d0aed5e327e6a4564dfe4214d13
parentad4f0a2dc893cb01af35361c0349227fd6c765b5 (diff)
downloadlibxml2-ee32ad3c0f6dfbb1b0e57db63d16f6455d6416df.tar.gz
libxml2-ee32ad3c0f6dfbb1b0e57db63d16f6455d6416df.tar.xz
629325 XPath rounding errors first cleanup
https://bugzilla.gnome.org/show_bug.cgi?id=629325 not a full solution as Vincent Lefevre pointed out but an incremental improvement over the status-quo
-rw-r--r--xpath.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/xpath.c b/xpath.c
index 3352a5e..4d6826d 100644
--- a/xpath.c
+++ b/xpath.c
@@ -10080,15 +10080,23 @@ xmlXPathCompNumber(xmlXPathParserContextPtr ctxt)
}
#endif
if (CUR == '.') {
+ int v, frac = 0;
+ double fraction = 0;
+
NEXT;
if (((CUR < '0') || (CUR > '9')) && (!ok)) {
XP_ERROR(XPATH_NUMBER_ERROR);
}
- while ((CUR >= '0') && (CUR <= '9')) {
- mult /= 10;
- ret = ret + (CUR - '0') * mult;
+ while ((CUR >= '0') && (CUR <= '9') && (frac < MAX_FRAC)) {
+ v = (CUR - '0');
+ fraction = fraction * 10 + v;
+ frac = frac + 1;
NEXT;
}
+ fraction /= my_pow10[frac];
+ ret = ret + fraction;
+ while ((CUR >= '0') && (CUR <= '9'))
+ NEXT;
}
if ((CUR == 'e') || (CUR == 'E')) {
NEXT;