|
|
- var zero = '0'.charCodeAt(0);
- var plus = '+'.charCodeAt(0);
- var minus = '-'.charCodeAt(0);
-
- function isWhitespace(code) {
- return code <= 32;
- }
-
- function isDigit(code) {
- return 48 <= code && code <= 57;
- }
-
- function isSign(code) {
- return code === minus || code === plus;
- }
-
- module.exports = function (opts, a, b) {
- var checkSign = opts.sign;
- var ia = 0;
- var ib = 0;
- var ma = a.length;
- var mb = b.length;
- var ca, cb; // character code
- var za, zb; // leading zero count
- var na, nb; // number length
- var sa, sb; // number sign
- var ta, tb; // temporary
- var bias;
-
- while (ia < ma && ib < mb) {
- ca = a.charCodeAt(ia);
- cb = b.charCodeAt(ib);
- za = zb = 0;
- na = nb = 0;
- sa = sb = true;
- bias = 0;
-
- // skip over leading spaces
- while (isWhitespace(ca)) {
- ia += 1;
- ca = a.charCodeAt(ia);
- }
- while (isWhitespace(cb)) {
- ib += 1;
- cb = b.charCodeAt(ib);
- }
-
- // skip and save sign
- if (checkSign) {
- ta = a.charCodeAt(ia + 1);
- if (isSign(ca) && isDigit(ta)) {
- if (ca === minus) {
- sa = false;
- }
- ia += 1;
- ca = ta;
- }
- tb = b.charCodeAt(ib + 1);
- if (isSign(cb) && isDigit(tb)) {
- if (cb === minus) {
- sb = false;
- }
- ib += 1;
- cb = tb;
- }
- }
-
- // compare digits with other symbols
- if (isDigit(ca) && !isDigit(cb)) {
- return -1;
- }
- if (!isDigit(ca) && isDigit(cb)) {
- return 1;
- }
-
- // compare negative and positive
- if (!sa && sb) {
- return -1;
- }
- if (sa && !sb) {
- return 1;
- }
-
- // count leading zeros
- while (ca === zero) {
- za += 1;
- ia += 1;
- ca = a.charCodeAt(ia);
- }
- while (cb === zero) {
- zb += 1;
- ib += 1;
- cb = b.charCodeAt(ib);
- }
-
- // count numbers
- while (isDigit(ca) || isDigit(cb)) {
- if (isDigit(ca) && isDigit(cb) && bias === 0) {
- if (sa) {
- if (ca < cb) {
- bias = -1;
- } else if (ca > cb) {
- bias = 1;
- }
- } else {
- if (ca > cb) {
- bias = -1;
- } else if (ca < cb) {
- bias = 1;
- }
- }
- }
- if (isDigit(ca)) {
- ia += 1;
- na += 1;
- ca = a.charCodeAt(ia);
- }
- if (isDigit(cb)) {
- ib += 1;
- nb += 1;
- cb = b.charCodeAt(ib);
- }
- }
-
- // compare number length
- if (sa) {
- if (na < nb) {
- return -1;
- }
- if (na > nb) {
- return 1;
- }
- } else {
- if (na > nb) {
- return -1;
- }
- if (na < nb) {
- return 1;
- }
- }
-
- // compare numbers
- if (bias) {
- return bias;
- }
-
- // compare leading zeros
- if (sa) {
- if (za > zb) {
- return -1;
- }
- if (za < zb) {
- return 1;
- }
- } else {
- if (za < zb) {
- return -1;
- }
- if (za > zb) {
- return 1;
- }
- }
-
- // compare ascii codes
- if (ca < cb) {
- return -1;
- }
- if (ca > cb) {
- return 1;
- }
-
- ia += 1;
- ib += 1;
- }
-
- // compare length
- if (ma < mb) {
- return -1;
- }
- if (ma > mb) {
- return 1;
- }
- };
|