From 081543fd01051b44bb5b6abcebf3831be83c4f4e Mon Sep 17 00:00:00 2001 From: Bjorn Reese Date: Sun, 18 Feb 2001 16:49:41 +0000 Subject: [PATCH] xmlXPathNodeSetSort now uses Shell's sorting algorithm Fixed whitespace handling in xmlXPathStringEvalNumber --- xpath.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/xpath.c b/xpath.c index 0786a6d0..148ebe2b 100644 --- a/xpath.c +++ b/xpath.c @@ -592,18 +592,26 @@ xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) { */ void xmlXPathNodeSetSort(xmlNodeSetPtr set) { - int i, j; + int i, j, incr, len, rc; xmlNodePtr tmp; if (set == NULL) return; - for (i = 0;i < set->nodeNr -1;i++) { - for (j = i + 1; j < set->nodeNr; j++) { - if (xmlXPathCmpNodes(set->nodeTab[i], set->nodeTab[j]) == -1) { - tmp = set->nodeTab[i]; - set->nodeTab[i] = set->nodeTab[j]; - set->nodeTab[j] = tmp; + /* Use Shell's sort to sort the node-set */ + len = set->nodeNr; + for (incr = len / 2; incr > 0; incr /= 2) { + for (i = incr; i < len; i++) { + j = i - incr; + while (j >= 0) { + rc = xmlXPathCmpNodes(set->nodeTab[j], set->nodeTab[j + incr]); + if (rc != 1 && rc != -2) { + tmp = set->nodeTab[j]; + set->nodeTab[j] = set->nodeTab[j + incr]; + set->nodeTab[j + incr] = tmp; + j -= incr; + } else + break; } } } @@ -4733,7 +4741,7 @@ xmlXPathStringEvalNumber(const xmlChar *str) { int ok = 0; int isneg = 0; - while (*cur == ' ') cur++; + while (IS_BLANK(*cur)) cur++; if ((*cur != '.') && ((*cur < '0') || (*cur > '9')) && (*cur != '-')) { return(xmlXPathNAN); } @@ -4757,7 +4765,7 @@ xmlXPathStringEvalNumber(const xmlChar *str) { cur++; } } - while (*cur == ' ') cur++; + while (IS_BLANK(*cur)) cur++; if (*cur != 0) return(xmlXPathNAN); if (isneg) ret = -ret; return(ret);