hopglass/lib/vercomp.js

69 lines
1.3 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;
});