123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- // Generated by CoffeeScript 1.12.7
- (function() {
- var Netmask, atob, chr, chr0, chrA, chra, ip2long, long2ip;
- long2ip = function(long) {
- var a, b, c, d;
- a = (long & (0xff << 24)) >>> 24;
- b = (long & (0xff << 16)) >>> 16;
- c = (long & (0xff << 8)) >>> 8;
- d = long & 0xff;
- return [a, b, c, d].join('.');
- };
- ip2long = function(ip) {
- var b, c, i, j, n, ref;
- b = [];
- for (i = j = 0; j <= 3; i = ++j) {
- if (ip.length === 0) {
- break;
- }
- if (i > 0) {
- if (ip[0] !== '.') {
- throw new Error('Invalid IP');
- }
- ip = ip.substring(1);
- }
- ref = atob(ip), n = ref[0], c = ref[1];
- ip = ip.substring(c);
- b.push(n);
- }
- if (ip.length !== 0) {
- throw new Error('Invalid IP');
- }
- switch (b.length) {
- case 1:
- if (b[0] > 0xFFFFFFFF) {
- throw new Error('Invalid IP');
- }
- return b[0] >>> 0;
- case 2:
- if (b[0] > 0xFF || b[1] > 0xFFFFFF) {
- throw new Error('Invalid IP');
- }
- return (b[0] << 24 | b[1]) >>> 0;
- case 3:
- if (b[0] > 0xFF || b[1] > 0xFF || b[2] > 0xFFFF) {
- throw new Error('Invalid IP');
- }
- return (b[0] << 24 | b[1] << 16 | b[2]) >>> 0;
- case 4:
- if (b[0] > 0xFF || b[1] > 0xFF || b[2] > 0xFF || b[3] > 0xFF) {
- throw new Error('Invalid IP');
- }
- return (b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3]) >>> 0;
- default:
- throw new Error('Invalid IP');
- }
- };
- chr = function(b) {
- return b.charCodeAt(0);
- };
- chr0 = chr('0');
- chra = chr('a');
- chrA = chr('A');
- atob = function(s) {
- var base, dmax, i, n, start;
- n = 0;
- base = 10;
- dmax = '9';
- i = 0;
- if (s.length > 1 && s[i] === '0') {
- if (s[i + 1] === 'x' || s[i + 1] === 'X') {
- i += 2;
- base = 16;
- } else if ('0' <= s[i + 1] && s[i + 1] <= '9') {
- i++;
- base = 8;
- dmax = '7';
- }
- }
- start = i;
- while (i < s.length) {
- if ('0' <= s[i] && s[i] <= dmax) {
- n = (n * base + (chr(s[i]) - chr0)) >>> 0;
- } else if (base === 16) {
- if ('a' <= s[i] && s[i] <= 'f') {
- n = (n * base + (10 + chr(s[i]) - chra)) >>> 0;
- } else if ('A' <= s[i] && s[i] <= 'F') {
- n = (n * base + (10 + chr(s[i]) - chrA)) >>> 0;
- } else {
- break;
- }
- } else {
- break;
- }
- if (n > 0xFFFFFFFF) {
- throw new Error('too large');
- }
- i++;
- }
- if (i === start) {
- throw new Error('empty octet');
- }
- return [n, i];
- };
- Netmask = (function() {
- function Netmask(net, mask) {
- var error, i, j, ref;
- if (typeof net !== 'string') {
- throw new Error("Missing `net' parameter");
- }
- if (!mask) {
- ref = net.split('/', 2), net = ref[0], mask = ref[1];
- }
- if (!mask) {
- mask = 32;
- }
- if (typeof mask === 'string' && mask.indexOf('.') > -1) {
- try {
- this.maskLong = ip2long(mask);
- } catch (error1) {
- error = error1;
- throw new Error("Invalid mask: " + mask);
- }
- for (i = j = 32; j >= 0; i = --j) {
- if (this.maskLong === (0xffffffff << (32 - i)) >>> 0) {
- this.bitmask = i;
- break;
- }
- }
- } else if (mask || mask === 0) {
- this.bitmask = parseInt(mask, 10);
- this.maskLong = 0;
- if (this.bitmask > 0) {
- this.maskLong = (0xffffffff << (32 - this.bitmask)) >>> 0;
- }
- } else {
- throw new Error("Invalid mask: empty");
- }
- try {
- this.netLong = (ip2long(net) & this.maskLong) >>> 0;
- } catch (error1) {
- error = error1;
- throw new Error("Invalid net address: " + net);
- }
- if (!(this.bitmask <= 32)) {
- throw new Error("Invalid mask for ip4: " + mask);
- }
- this.size = Math.pow(2, 32 - this.bitmask);
- this.base = long2ip(this.netLong);
- this.mask = long2ip(this.maskLong);
- this.hostmask = long2ip(~this.maskLong);
- this.first = this.bitmask <= 30 ? long2ip(this.netLong + 1) : this.base;
- this.last = this.bitmask <= 30 ? long2ip(this.netLong + this.size - 2) : long2ip(this.netLong + this.size - 1);
- this.broadcast = this.bitmask <= 30 ? long2ip(this.netLong + this.size - 1) : void 0;
- }
- Netmask.prototype.contains = function(ip) {
- if (typeof ip === 'string' && (ip.indexOf('/') > 0 || ip.split('.').length !== 4)) {
- ip = new Netmask(ip);
- }
- if (ip instanceof Netmask) {
- return this.contains(ip.base) && this.contains(ip.broadcast || ip.last);
- } else {
- return (ip2long(ip) & this.maskLong) >>> 0 === (this.netLong & this.maskLong) >>> 0;
- }
- };
- Netmask.prototype.next = function(count) {
- if (count == null) {
- count = 1;
- }
- return new Netmask(long2ip(this.netLong + (this.size * count)), this.mask);
- };
- Netmask.prototype.forEach = function(fn) {
- var index, lastLong, long;
- long = ip2long(this.first);
- lastLong = ip2long(this.last);
- index = 0;
- while (long <= lastLong) {
- fn(long2ip(long), long, index);
- index++;
- long++;
- }
- };
- Netmask.prototype.toString = function() {
- return this.base + "/" + this.bitmask;
- };
- return Netmask;
- })();
- exports.ip2long = ip2long;
- exports.long2ip = long2ip;
- exports.Netmask = Netmask;
- }).call(this);
|