Index: Source/core/xml/XSLTUnicodeSort.cpp |
diff --git a/Source/core/xml/XSLTUnicodeSort.cpp b/Source/core/xml/XSLTUnicodeSort.cpp |
index 83342cb69002d795ac43c3a6401dae0e1293a612..c6d7486d4e0f7032f8418080141bfda42f491d95 100644 |
--- a/Source/core/xml/XSLTUnicodeSort.cpp |
+++ b/Source/core/xml/XSLTUnicodeSort.cpp |
@@ -36,7 +36,13 @@ |
namespace WebCore { |
-// Based on default implementation from libxslt 1.1.22 and xsltICUSort.c example. |
+inline const xmlChar* toXMLChar(const char* string) |
+{ |
+ return reinterpret_cast<const xmlChar*>(string); |
+} |
+ |
+// Based on default implementation from libxslt 1.1.22 and xsltICUSort.c |
+// example. |
void xsltUnicodeSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts, int nbsorts) |
{ |
#ifdef XSLT_REFACTORED |
@@ -44,124 +50,110 @@ void xsltUnicodeSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts, in |
#else |
xsltStylePreCompPtr comp; |
#endif |
- xmlXPathObjectPtr *resultsTab[XSLT_MAX_SORT]; |
- xmlXPathObjectPtr *results = NULL, *res; |
- xmlNodeSetPtr list = NULL; |
- int descending, number, desc, numb; |
- int len = 0; |
- int i, j, incr; |
- int tst; |
+ xmlXPathObjectPtr* resultsTab[XSLT_MAX_SORT]; |
+ xmlXPathObjectPtr* results = 0; |
+ xmlNodeSetPtr list = 0; |
int depth; |
xmlNodePtr node; |
- xmlXPathObjectPtr tmp; |
int tempstype[XSLT_MAX_SORT], temporder[XSLT_MAX_SORT]; |
- if ((ctxt == NULL) || (sorts == NULL) || (nbsorts <= 0) || |
- (nbsorts >= XSLT_MAX_SORT)) |
+ if (!ctxt || !sorts || nbsorts <= 0 || nbsorts >= XSLT_MAX_SORT) |
return; |
- if (sorts[0] == NULL) |
+ if (!sorts[0]) |
return; |
comp = static_cast<xsltStylePreComp*>(sorts[0]->psvi); |
- if (comp == NULL) |
+ if (!comp) |
return; |
list = ctxt->nodeList; |
- if ((list == NULL) || (list->nodeNr <= 1)) |
- return; /* nothing to do */ |
+ if (!list || list->nodeNr <= 1) |
+ return; // Nothing to do. |
- for (j = 0; j < nbsorts; j++) { |
+ for (int j = 0; j < nbsorts; ++j) { |
comp = static_cast<xsltStylePreComp*>(sorts[j]->psvi); |
tempstype[j] = 0; |
- if ((comp->stype == NULL) && (comp->has_stype != 0)) { |
- comp->stype = |
- xsltEvalAttrValueTemplate(ctxt, sorts[j], |
- (const xmlChar *) "data-type", |
- XSLT_NAMESPACE); |
- if (comp->stype != NULL) { |
+ if (!comp->stype && comp->has_stype) { |
+ comp->stype = xsltEvalAttrValueTemplate(ctxt, sorts[j], toXMLChar("data-type"), XSLT_NAMESPACE); |
+ if (comp->stype) { |
tempstype[j] = 1; |
- if (xmlStrEqual(comp->stype, (const xmlChar *) "text")) |
+ if (xmlStrEqual(comp->stype, toXMLChar("text"))) { |
comp->number = 0; |
- else if (xmlStrEqual(comp->stype, (const xmlChar *) "number")) |
+ } else if (xmlStrEqual(comp->stype, toXMLChar("number"))) { |
comp->number = 1; |
- else { |
- xsltTransformError(ctxt, NULL, sorts[j], |
- "xsltDoSortFunction: no support for data-type = %s\n", |
- comp->stype); |
- comp->number = 0; /* use default */ |
+ } else { |
+ xsltTransformError(ctxt, 0, sorts[j], "xsltDoSortFunction: no support for data-type = %s\n", comp->stype); |
+ comp->number = 0; // Use default. |
} |
} |
} |
temporder[j] = 0; |
- if ((comp->order == NULL) && (comp->has_order != 0)) { |
- comp->order = xsltEvalAttrValueTemplate(ctxt, sorts[j], |
- (const xmlChar *) "order", |
- XSLT_NAMESPACE); |
- if (comp->order != NULL) { |
+ if (!comp->order && comp->has_order) { |
+ comp->order = xsltEvalAttrValueTemplate(ctxt, sorts[j], toXMLChar("order"), XSLT_NAMESPACE); |
+ if (comp->order) { |
temporder[j] = 1; |
- if (xmlStrEqual(comp->order, (const xmlChar *) "ascending")) |
+ if (xmlStrEqual(comp->order, toXMLChar("ascending"))) { |
comp->descending = 0; |
- else if (xmlStrEqual(comp->order, |
- (const xmlChar *) "descending")) |
+ } else if (xmlStrEqual(comp->order, toXMLChar("descending"))) { |
comp->descending = 1; |
- else { |
- xsltTransformError(ctxt, NULL, sorts[j], |
- "xsltDoSortFunction: invalid value %s for order\n", |
- comp->order); |
- comp->descending = 0; /* use default */ |
+ } else { |
+ xsltTransformError(ctxt, 0, sorts[j], "xsltDoSortFunction: invalid value %s for order\n", comp->order); |
+ comp->descending = 0; // Use default. |
} |
} |
} |
} |
- len = list->nodeNr; |
+ int len = list->nodeNr; |
resultsTab[0] = xsltComputeSortResult(ctxt, sorts[0]); |
- for (i = 1;i < XSLT_MAX_SORT;i++) |
- resultsTab[i] = NULL; |
+ for (int i = 1; i < XSLT_MAX_SORT; ++i) |
+ resultsTab[i] = 0; |
results = resultsTab[0]; |
comp = static_cast<xsltStylePreComp*>(sorts[0]->psvi); |
- descending = comp->descending; |
- number = comp->number; |
- if (results == NULL) |
+ int descending = comp->descending; |
+ int number = comp->number; |
+ if (!results) |
return; |
- // We are passing a language identifier to a function that expects a locale identifier. |
- // The implementation of Collator should be lenient, and accept both "en-US" and "en_US", for example. |
- // This lets an author to really specify sorting rules, e.g. "de_DE@collation=phonebook", which isn't |
+ // We are passing a language identifier to a function that expects a locale |
+ // identifier. The implementation of Collator should be lenient, and accept |
+ // both "en-US" and "en_US", for example. This lets an author to really |
+ // specify sorting rules, e.g. "de_DE@collation=phonebook", which isn't |
// possible with language alone. |
- Collator collator(comp->has_lang ? (const char*)comp->lang : "en"); |
+ Collator collator(comp->has_lang ? reinterpret_cast<const char*>(comp->lang) : "en"); |
collator.setOrderLowerFirst(comp->lower_first); |
- /* Shell's sort of node-set */ |
- for (incr = len / 2; incr > 0; incr /= 2) { |
- for (i = incr; i < len; i++) { |
- j = i - incr; |
- if (results[i] == NULL) |
+ // Shell's sort of node-set. |
+ for (int incr = len / 2; incr > 0; incr /= 2) { |
+ for (int i = incr; i < len; ++i) { |
+ int j = i - incr; |
+ if (!results[i]) |
continue; |
while (j >= 0) { |
- if (results[j] == NULL) |
+ int tst; |
+ if (!results[j]) { |
tst = 1; |
- else { |
+ } else { |
if (number) { |
- /* We make NaN smaller than number in accordance |
- with XSLT spec */ |
+ // We make NaN smaller than number in accordance with |
+ // XSLT spec. |
if (xmlXPathIsNaN(results[j]->floatval)) { |
if (xmlXPathIsNaN(results[j + incr]->floatval)) |
tst = 0; |
else |
tst = -1; |
- } else if (xmlXPathIsNaN(results[j + incr]->floatval)) |
+ } else if (xmlXPathIsNaN(results[j + incr]->floatval)) { |
tst = 1; |
- else if (results[j]->floatval == |
- results[j + incr]->floatval) |
+ } else if (results[j]->floatval == results[j + incr]->floatval) { |
tst = 0; |
- else if (results[j]->floatval > |
- results[j + incr]->floatval) |
+ } else if (results[j]->floatval > results[j + incr]->floatval) { |
tst = 1; |
- else tst = -1; |
+ } else { |
+ tst = -1; |
+ } |
} else { |
Vector<UChar> string1; |
Vector<UChar> string2; |
@@ -173,52 +165,45 @@ void xsltUnicodeSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts, in |
tst = -tst; |
} |
if (tst == 0) { |
- /* |
- * Okay we need to use multi level sorts |
- */ |
+ // Okay we need to use multi level sorts. |
depth = 1; |
while (depth < nbsorts) { |
- if (sorts[depth] == NULL) |
+ if (!sorts[depth]) |
break; |
comp = static_cast<xsltStylePreComp*>(sorts[depth]->psvi); |
- if (comp == NULL) |
+ if (!comp) |
break; |
- desc = comp->descending; |
- numb = comp->number; |
+ int desc = comp->descending; |
+ int numb = comp->number; |
- /* |
- * Compute the result of the next level for the |
- * full set, this might be optimized ... or not |
- */ |
- if (resultsTab[depth] == NULL) |
- resultsTab[depth] = xsltComputeSortResult(ctxt, |
- sorts[depth]); |
- res = resultsTab[depth]; |
- if (res == NULL) |
+ // Compute the result of the next level for the full |
+ // set, this might be optimized ... or not |
+ if (!resultsTab[depth]) |
+ resultsTab[depth] = xsltComputeSortResult(ctxt, sorts[depth]); |
+ xmlXPathObjectPtr* res = resultsTab[depth]; |
+ if (!res) |
break; |
- if (res[j] == NULL) { |
- if (res[j+incr] != NULL) |
+ if (!res[j]) { |
+ if (res[j + incr]) |
tst = 1; |
} else { |
if (numb) { |
- /* We make NaN smaller than number in |
- accordance with XSLT spec */ |
+ // We make NaN smaller than number in accordance |
+ // with XSLT spec. |
if (xmlXPathIsNaN(res[j]->floatval)) { |
- if (xmlXPathIsNaN(res[j + |
- incr]->floatval)) |
+ if (xmlXPathIsNaN(res[j + incr]->floatval)) |
tst = 0; |
else |
tst = -1; |
- } else if (xmlXPathIsNaN(res[j + incr]-> |
- floatval)) |
+ } else if (xmlXPathIsNaN(res[j + incr]->floatval)) { |
tst = 1; |
- else if (res[j]->floatval == res[j + incr]-> |
- floatval) |
+ } else if (res[j]->floatval == res[j + incr]->floatval) { |
tst = 0; |
- else if (res[j]->floatval > |
- res[j + incr]->floatval) |
+ } else if (res[j]->floatval > res[j + incr]->floatval) { |
tst = 1; |
- else tst = -1; |
+ } else { |
+ tst = -1; |
+ } |
} else { |
Vector<UChar> string1; |
Vector<UChar> string2; |
@@ -230,10 +215,8 @@ void xsltUnicodeSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts, in |
tst = -tst; |
} |
- /* |
- * if we still can't differenciate at this level |
- * try one level deeper. |
- */ |
+ // if we still can't differenciate at this level try one |
+ // level deeper. |
if (tst != 0) |
break; |
depth++; |
@@ -243,7 +226,7 @@ void xsltUnicodeSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts, in |
tst = results[j]->index > results[j + incr]->index; |
} |
if (tst > 0) { |
- tmp = results[j]; |
+ xmlXPathObjectPtr tmp = results[j]; |
results[j] = results[j + incr]; |
results[j + incr] = tmp; |
node = list->nodeTab[j]; |
@@ -251,37 +234,38 @@ void xsltUnicodeSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts, in |
list->nodeTab[j + incr] = node; |
depth = 1; |
while (depth < nbsorts) { |
- if (sorts[depth] == NULL) |
+ if (!sorts[depth]) |
break; |
- if (resultsTab[depth] == NULL) |
+ if (!resultsTab[depth]) |
break; |
- res = resultsTab[depth]; |
+ xmlXPathObjectPtr* res = resultsTab[depth]; |
tmp = res[j]; |
res[j] = res[j + incr]; |
res[j + incr] = tmp; |
depth++; |
} |
j -= incr; |
- } else |
+ } else { |
break; |
+ } |
} |
} |
} |
- for (j = 0; j < nbsorts; j++) { |
+ for (int j = 0; j < nbsorts; ++j) { |
comp = static_cast<xsltStylePreComp*>(sorts[j]->psvi); |
if (tempstype[j] == 1) { |
- /* The data-type needs to be recomputed each time */ |
- xmlFree((void *)(comp->stype)); |
- comp->stype = NULL; |
+ // The data-type needs to be recomputed each time. |
+ xmlFree(const_cast<xmlChar*>(comp->stype)); |
+ comp->stype = 0; |
} |
if (temporder[j] == 1) { |
- /* The order needs to be recomputed each time */ |
- xmlFree((void *)(comp->order)); |
- comp->order = NULL; |
+ // The order needs to be recomputed each time. |
+ xmlFree(const_cast<xmlChar*>(comp->order)); |
+ comp->order = 0; |
} |
- if (resultsTab[j] != NULL) { |
- for (i = 0;i < len;i++) |
+ if (resultsTab[j]) { |
+ for (int i = 0; i < len; ++i) |
xmlXPathFreeObject(resultsTab[j][i]); |
xmlFree(resultsTab[j]); |
} |