summaryrefslogtreecommitdiff
path: root/javascript/libs
diff options
context:
space:
mode:
authorwjames5 <will@tekimaki.com>2007-11-11 18:47:11 +0000
committerwjames5 <will@tekimaki.com>2007-11-11 18:47:11 +0000
commitd63ac7a6ddc775280cc58c3654c02b0d8b0f8b3d (patch)
tree8d77202bcb96feb17c43fcffba57daf1e2f57460 /javascript/libs
parentc7eba7c31822ed08664e61dd1eabc8edeef030fc (diff)
downloadutil-d63ac7a6ddc775280cc58c3654c02b0d8b0f8b3d.tar.gz
util-d63ac7a6ddc775280cc58c3654c02b0d8b0f8b3d.tar.bz2
util-d63ac7a6ddc775280cc58c3654c02b0d8b0f8b3d.zip
natural comparison library for sorting lists nicely - works wonders
Diffstat (limited to 'javascript/libs')
-rw-r--r--javascript/libs/natcompare.js156
1 files changed, 156 insertions, 0 deletions
diff --git a/javascript/libs/natcompare.js b/javascript/libs/natcompare.js
new file mode 100644
index 0000000..9988643
--- /dev/null
+++ b/javascript/libs/natcompare.js
@@ -0,0 +1,156 @@
+/*
+natcompare.js -- Perform 'natural order' comparisons of strings in JavaScript.
+Copyright (C) 2005 by SCK-CEN (Belgian Nucleair Research Centre)
+Written by Kristof Coomans <kristof[dot]coomans[at]sckcen[dot]be>
+
+Based on the Java version by Pierre-Luc Paour, of which this is more or less a straight conversion.
+Copyright (C) 2003 by Pierre-Luc Paour <natorder@paour.com>
+
+The Java version was based on the C version by Martin Pool.
+Copyright (C) 2000 by Martin Pool <mbp@humbug.org.au>
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+claim that you wrote the original software. If you use this software
+in a product, an acknowledgment in the product documentation would be
+appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+
+function isWhitespaceChar(a)
+{
+ var charCode;
+ charCode = a.charCodeAt(0);
+
+ if ( charCode <= 32 )
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+function isDigitChar(a)
+{
+ var charCode;
+ charCode = a.charCodeAt(0);
+
+ if ( charCode >= 48 && charCode <= 57 )
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+function compareRight(a,b)
+{
+ var bias = 0;
+ var ia = 0;
+ var ib = 0;
+
+ var ca;
+ var cb;
+
+ // The longest run of digits wins. That aside, the greatest
+ // value wins, but we can't know that it will until we've scanned
+ // both numbers to know that they have the same magnitude, so we
+ // remember it in BIAS.
+ for (;; ia++, ib++) {
+ ca = a.charAt(ia);
+ cb = b.charAt(ib);
+
+ if (!isDigitChar(ca)
+ && !isDigitChar(cb)) {
+ return bias;
+ } else if (!isDigitChar(ca)) {
+ return -1;
+ } else if (!isDigitChar(cb)) {
+ return +1;
+ } else if (ca < cb) {
+ if (bias == 0) {
+ bias = -1;
+ }
+ } else if (ca > cb) {
+ if (bias == 0)
+ bias = +1;
+ }
+ }
+}
+
+function natcompare(a,b) {
+
+ var ia = 0, ib = 0;
+ var nza = 0, nzb = 0;
+ var ca, cb;
+ var result;
+
+ while (true)
+ {
+ // only count the number of zeroes leading the last number compared
+ nza = nzb = 0;
+
+ ca = a.charAt(ia);
+ cb = b.charAt(ib);
+
+ // skip over leading spaces or zeros
+ while ( isWhitespaceChar( ca ) || ca =='0' ) {
+ if (ca == '0') {
+ nza++;
+ } else {
+ // only count consecutive zeroes
+ nza = 0;
+ }
+
+ ca = a.charAt(++ia);
+ }
+
+ while ( isWhitespaceChar( cb ) || cb == '0') {
+ if (cb == '0') {
+ nzb++;
+ } else {
+ // only count consecutive zeroes
+ nzb = 0;
+ }
+
+ cb = b.charAt(++ib);
+ }
+
+ // process run of digits
+ if (isDigitChar(ca) && isDigitChar(cb)) {
+ if ((result = compareRight(a.substring(ia), b.substring(ib))) != 0) {
+ return result;
+ }
+ }
+
+ if (ca == 0 && cb == 0) {
+ // The strings compare the same. Perhaps the caller
+ // will want to call strcmp to break the tie.
+ return nza - nzb;
+ }
+
+ if (ca < cb) {
+ return -1;
+ } else if (ca > cb) {
+ return +1;
+ }
+
+ ++ia; ++ib;
+ }
+}
+
+