meshviewer/lib/vercomp.js

61 lines
1.2 KiB
JavaScript
Raw Normal View History

define([], function () {
function order(c) {
if (/^\d$/.test(c))
return 0;
else if (/^[a-z]$/i.test(c))
return c.charCodeAt(0);
else if (c === "~")
return -1;
else if (c)
return c.charCodeAt(0) + 256;
else
return 0;
}
// Based on dpkg code
function vercomp(a, b) {
var apos = 0, bpos = 0;
while (apos < a.length || bpos < b.length) {
var firstDiff = 0;
while ((apos < a.length && !/^\d$/.test(a[apos])) || (bpos < b.length && !/^\d$/.test(b[bpos]))) {
var ac = order(a[apos]);
var bc = order(b[bpos]);
if (ac !== bc)
return ac - bc;
apos++;
bpos++;
}
while (a[apos] === "0")
apos++;
while (b[bpos] === "0")
bpos++;
while (/^\d$/.test(a[apos]) && /^\d$/.test(b[bpos])) {
if (firstDiff === 0)
firstDiff = a.charCodeAt(apos) - b.charCodeAt(bpos);
apos++;
bpos++;
}
if (/^\d$/.test(a[apos]))
return 1;
if (/^\d$/.test(b[bpos]))
return -1;
if (firstDiff !== 0)
return firstDiff;
}
return 0;
}
return vercomp;
});