From 0eafdef9881c396ce4c014359d8f497cc088cfab Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Wed, 10 Apr 2002 16:14:34 +0000 Subject: [PATCH] another patch from Richard Jinks for substring conformance update of the * xpath.c: another patch from Richard Jinks for substring conformance * test/XPath/expr/floats test/XPath/expr/strings result/XPath/expr/floats result/XPath/expr/strings: update of the test suite to check those. Daniel --- ChangeLog | 7 +++++ result/XPath/expr/floats | 8 ++++++ result/XPath/expr/strings | 16 ++++++++++++ test/XPath/expr/floats | 2 ++ test/XPath/expr/strings | 4 +++ xpath.c | 54 +++++++++++++++++++++++---------------- 6 files changed, 69 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index a1df7564..44de2b7d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Wed Apr 10 18:12:52 CEST 2002 Daniel Veillard + + * xpath.c: another patch from Richard Jinks for substring conformance + * test/XPath/expr/floats test/XPath/expr/strings + result/XPath/expr/floats result/XPath/expr/strings: update of the + test suite to check those. + Wed Apr 10 13:29:49 CEST 2002 Daniel Veillard * xpath.c: patch from Richard Jinks for .x float parsing. diff --git a/result/XPath/expr/floats b/result/XPath/expr/floats index 7a44f8df..176081b5 100644 --- a/result/XPath/expr/floats +++ b/result/XPath/expr/floats @@ -15,6 +15,14 @@ Object is a number : 1.23 Expression: 0.123 Object is a number : 0.123 +======================== +Expression: 4. +Object is a number : 4 + +======================== +Expression: .4 +Object is a number : 0.4 + ======================== Expression: 1.23e3 Object is a number : 1230 diff --git a/result/XPath/expr/strings b/result/XPath/expr/strings index 09ccdec0..5ccd7c26 100644 --- a/result/XPath/expr/strings +++ b/result/XPath/expr/strings @@ -75,6 +75,22 @@ Object is a string : 234 Expression: substring("12345",0,3) Object is a string : 12 +======================== +Expression: substring("12345", 0 div 0, 3) +Object is a string : + +======================== +Expression: substring("12345", 1, 0 div 0) +Object is a string : + +======================== +Expression: substring("12345", -42, 1 div 0) +Object is a string : 12345 + +======================== +Expression: substring("12345", -1 div 0, 1 div 0) +Object is a string : + ======================== Expression: string-length("") Object is a number : 0 diff --git a/test/XPath/expr/floats b/test/XPath/expr/floats index 00ac6573..5d052d6a 100644 --- a/test/XPath/expr/floats +++ b/test/XPath/expr/floats @@ -2,6 +2,8 @@ 123 1.23 0.123 +4. +.4 1.23e3 1.23e-3 1 div 0 diff --git a/test/XPath/expr/strings b/test/XPath/expr/strings index c54cdf33..a070f3a3 100644 --- a/test/XPath/expr/strings +++ b/test/XPath/expr/strings @@ -17,5 +17,9 @@ substring("12345",2,3) substring("12345",2) substring("12345",1.5,2.6) substring("12345",0,3) +substring("12345", 0 div 0, 3) +substring("12345", 1, 0 div 0) +substring("12345", -42, 1 div 0) +substring("12345", -1 div 0, 1 div 0) string-length("") string-length("titi") diff --git a/xpath.c b/xpath.c index 9de5bc9d..ad9c3ef8 100644 --- a/xpath.c +++ b/xpath.c @@ -6152,34 +6152,44 @@ xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs) { if (nargs != 3) le = m; - /* - * To meet our requirements, initial index calculations - * must be done before we convert to integer format - * - * First we normalize indices + /* Need to check for the special cases where either + * the index is NaN, the length is NaN, or both + * arguments are infinity (relying on Inf + -Inf = NaN) */ - in -= 1.0; - le += in; - if (in < 0.0) - in = 0.0; - if (le > (double)m) - le = (double)m; + if (!xmlXPathIsNaN(in + le)) { + /* + * To meet our requirements, initial index calculations + * must be done before we convert to integer format + * + * First we normalize indices + */ + in -= 1.0; + le += in; + if (in < 0.0) + in = 0.0; + if (le > (double)m) + le = (double)m; - /* - * Now we go to integer form, rounding up - */ - i = (int) in; - if (((double)i) != in) i++; + /* + * Now we go to integer form, rounding up + */ + i = (int) in; + if (((double)i) != in) i++; - l = (int) le; - if (((double)l) != le) l++; + l = (int) le; + if (((double)l) != le) l++; - if (l > m) l=m; + if (l > m) l=m; - /* number of chars to copy */ - l -= i; + /* number of chars to copy */ + l -= i; + + ret = xmlUTF8Strsub(str->stringval, i, l); + } + else { + ret = NULL; + } - ret = xmlUTF8Strsub(str->stringval, i, l); if (ret == NULL) valuePush(ctxt, xmlXPathNewCString("")); else {