mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-08-07 06:43:02 +03:00
xmlXPathNodeSetSort now uses Shell's sorting algorithm
Fixed whitespace handling in xmlXPathStringEvalNumber
This commit is contained in:
26
xpath.c
26
xpath.c
@@ -592,18 +592,26 @@ xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) {
|
|||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
xmlXPathNodeSetSort(xmlNodeSetPtr set) {
|
xmlXPathNodeSetSort(xmlNodeSetPtr set) {
|
||||||
int i, j;
|
int i, j, incr, len, rc;
|
||||||
xmlNodePtr tmp;
|
xmlNodePtr tmp;
|
||||||
|
|
||||||
if (set == NULL)
|
if (set == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0;i < set->nodeNr -1;i++) {
|
/* Use Shell's sort to sort the node-set */
|
||||||
for (j = i + 1; j < set->nodeNr; j++) {
|
len = set->nodeNr;
|
||||||
if (xmlXPathCmpNodes(set->nodeTab[i], set->nodeTab[j]) == -1) {
|
for (incr = len / 2; incr > 0; incr /= 2) {
|
||||||
tmp = set->nodeTab[i];
|
for (i = incr; i < len; i++) {
|
||||||
set->nodeTab[i] = set->nodeTab[j];
|
j = i - incr;
|
||||||
set->nodeTab[j] = tmp;
|
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 ok = 0;
|
||||||
int isneg = 0;
|
int isneg = 0;
|
||||||
|
|
||||||
while (*cur == ' ') cur++;
|
while (IS_BLANK(*cur)) cur++;
|
||||||
if ((*cur != '.') && ((*cur < '0') || (*cur > '9')) && (*cur != '-')) {
|
if ((*cur != '.') && ((*cur < '0') || (*cur > '9')) && (*cur != '-')) {
|
||||||
return(xmlXPathNAN);
|
return(xmlXPathNAN);
|
||||||
}
|
}
|
||||||
@@ -4757,7 +4765,7 @@ xmlXPathStringEvalNumber(const xmlChar *str) {
|
|||||||
cur++;
|
cur++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (*cur == ' ') cur++;
|
while (IS_BLANK(*cur)) cur++;
|
||||||
if (*cur != 0) return(xmlXPathNAN);
|
if (*cur != 0) return(xmlXPathNAN);
|
||||||
if (isneg) ret = -ret;
|
if (isneg) ret = -ret;
|
||||||
return(ret);
|
return(ret);
|
||||||
|
Reference in New Issue
Block a user