Spaces:
Sleeping
Sleeping
| 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; | |
| } | |
| }; | |