patch from Richard Jinks for XPath substring() function new set of tests
* xpath.c: patch from Richard Jinks for XPath substring() function
* result/XPath/expr/strings test/XPath/expr/strings: new set of tests
Daniel
diff --git a/xpath.c b/xpath.c
index c166c82..f4f79b3 100644
--- a/xpath.c
+++ b/xpath.c
@@ -6162,37 +6162,47 @@
/*
* If last pos not present, calculate last position
*/
- if (nargs != 3)
- le = m;
+ if (nargs != 3) {
+ le = (double)m;
+ if (in < 1.0)
+ in = 1.0;
+ }
/* 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)
*/
- if (!xmlXPathIsNaN(in + le)) {
+ if (!xmlXPathIsNaN(in + le) && !xmlXPathIsInf(in)) {
/*
- * To meet our requirements, initial index calculations
- * must be done before we convert to integer format
+ * To meet the requirements of the spec, the arguments
+ * must be converted to integer format before
+ * initial index calculations are done
*
- * 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
+ * First we go to integer form, rounding up
+ * and checking for special cases
*/
i = (int) in;
- if (((double)i) != in) i++;
-
- l = (int) le;
- if (((double)l) != le) l++;
+ if (((double)i)+0.5 <= in) i++;
- if (l > m) l=m;
+ if (xmlXPathIsInf(le) == 1) {
+ l = m;
+ if (i < 1)
+ i = 1;
+ }
+ else if (xmlXPathIsInf(le) == -1 || le < 0.0)
+ l = 0;
+ else {
+ l = (int) le;
+ if (((double)l)+0.5 <= le) l++;
+ }
+
+ /* Now we normalize inidices */
+ i -= 1;
+ l += i;
+ if (i < 0)
+ i = 0;
+ if (l > m)
+ l = m;
/* number of chars to copy */
l -= i;