183 lines
5.1 KiB
JavaScript
183 lines
5.1 KiB
JavaScript
/*
|
|
* Copyright (c) 2012 chick307 <chick307@gmail.com>
|
|
*
|
|
* Licensed under the MIT License.
|
|
* http://opensource.org/licenses/mit-license
|
|
*/
|
|
|
|
void function(global, callback) {
|
|
if (typeof module === 'object') {
|
|
module.exports = callback();
|
|
} else if (typeof define === 'function') {
|
|
define(callback);
|
|
} else {
|
|
global.adler32cs = callback();
|
|
}
|
|
}(this, function() {
|
|
var _hasArrayBuffer = typeof ArrayBuffer === 'function' &&
|
|
typeof Uint8Array === 'function';
|
|
|
|
var _Buffer = null, _isBuffer = (function() {
|
|
if (!_hasArrayBuffer)
|
|
return function _isBuffer() { return false };
|
|
|
|
try {
|
|
var buffer = require('buffer');
|
|
if (typeof buffer.Buffer === 'function')
|
|
_Buffer = buffer.Buffer;
|
|
} catch (error) {}
|
|
|
|
return function _isBuffer(value) {
|
|
return value instanceof ArrayBuffer ||
|
|
_Buffer !== null && value instanceof _Buffer;
|
|
};
|
|
}());
|
|
|
|
var _utf8ToBinary = (function() {
|
|
if (_Buffer !== null) {
|
|
return function _utf8ToBinary(utf8String) {
|
|
return new _Buffer(utf8String, 'utf8').toString('binary');
|
|
};
|
|
} else {
|
|
return function _utf8ToBinary(utf8String) {
|
|
return unescape(encodeURIComponent(utf8String));
|
|
};
|
|
}
|
|
}());
|
|
|
|
var MOD = 65521;
|
|
|
|
var _update = function _update(checksum, binaryString) {
|
|
var a = checksum & 0xFFFF, b = checksum >>> 16;
|
|
for (var i = 0, length = binaryString.length; i < length; i++) {
|
|
a = (a + (binaryString.charCodeAt(i) & 0xFF)) % MOD;
|
|
b = (b + a) % MOD;
|
|
}
|
|
return (b << 16 | a) >>> 0;
|
|
};
|
|
|
|
var _updateUint8Array = function _updateUint8Array(checksum, uint8Array) {
|
|
var a = checksum & 0xFFFF, b = checksum >>> 16;
|
|
for (var i = 0, length = uint8Array.length, x; i < length; i++) {
|
|
a = (a + uint8Array[i]) % MOD;
|
|
b = (b + a) % MOD;
|
|
}
|
|
return (b << 16 | a) >>> 0
|
|
};
|
|
|
|
var exports = {};
|
|
|
|
var Adler32 = exports.Adler32 = (function() {
|
|
var ctor = function Adler32(checksum) {
|
|
if (!(this instanceof ctor)) {
|
|
throw new TypeError(
|
|
'Constructor cannot called be as a function.');
|
|
}
|
|
if (!isFinite(checksum = checksum == null ? 1 : +checksum)) {
|
|
throw new Error(
|
|
'First arguments needs to be a finite number.');
|
|
}
|
|
this.checksum = checksum >>> 0;
|
|
};
|
|
|
|
var proto = ctor.prototype = {};
|
|
proto.constructor = ctor;
|
|
|
|
ctor.from = function(from) {
|
|
from.prototype = proto;
|
|
return from;
|
|
}(function from(binaryString) {
|
|
if (!(this instanceof ctor)) {
|
|
throw new TypeError(
|
|
'Constructor cannot called be as a function.');
|
|
}
|
|
if (binaryString == null)
|
|
throw new Error('First argument needs to be a string.');
|
|
this.checksum = _update(1, binaryString.toString());
|
|
});
|
|
|
|
ctor.fromUtf8 = function(fromUtf8) {
|
|
fromUtf8.prototype = proto;
|
|
return fromUtf8;
|
|
}(function fromUtf8(utf8String) {
|
|
if (!(this instanceof ctor)) {
|
|
throw new TypeError(
|
|
'Constructor cannot called be as a function.');
|
|
}
|
|
if (utf8String == null)
|
|
throw new Error('First argument needs to be a string.');
|
|
var binaryString = _utf8ToBinary(utf8String.toString());
|
|
this.checksum = _update(1, binaryString);
|
|
});
|
|
|
|
if (_hasArrayBuffer) {
|
|
ctor.fromBuffer = function(fromBuffer) {
|
|
fromBuffer.prototype = proto;
|
|
return fromBuffer;
|
|
}(function fromBuffer(buffer) {
|
|
if (!(this instanceof ctor)) {
|
|
throw new TypeError(
|
|
'Constructor cannot called be as a function.');
|
|
}
|
|
if (!_isBuffer(buffer))
|
|
throw new Error('First argument needs to be ArrayBuffer.');
|
|
var array = new Uint8Array(buffer);
|
|
return this.checksum = _updateUint8Array(1, array);
|
|
});
|
|
}
|
|
|
|
proto.update = function update(binaryString) {
|
|
if (binaryString == null)
|
|
throw new Error('First argument needs to be a string.');
|
|
binaryString = binaryString.toString();
|
|
return this.checksum = _update(this.checksum, binaryString);
|
|
};
|
|
|
|
proto.updateUtf8 = function updateUtf8(utf8String) {
|
|
if (utf8String == null)
|
|
throw new Error('First argument needs to be a string.');
|
|
var binaryString = _utf8ToBinary(utf8String.toString());
|
|
return this.checksum = _update(this.checksum, binaryString);
|
|
};
|
|
|
|
if (_hasArrayBuffer) {
|
|
proto.updateBuffer = function updateBuffer(buffer) {
|
|
if (!_isBuffer(buffer))
|
|
throw new Error('First argument needs to be ArrayBuffer.');
|
|
var array = new Uint8Array(buffer);
|
|
return this.checksum = _updateUint8Array(this.checksum, array);
|
|
};
|
|
}
|
|
|
|
proto.clone = function clone() {
|
|
return new Adler32(this.checksum);
|
|
};
|
|
|
|
return ctor;
|
|
}());
|
|
|
|
exports.from = function from(binaryString) {
|
|
if (binaryString == null)
|
|
throw new Error('First argument needs to be a string.');
|
|
return _update(1, binaryString.toString());
|
|
};
|
|
|
|
exports.fromUtf8 = function fromUtf8(utf8String) {
|
|
if (utf8String == null)
|
|
throw new Error('First argument needs to be a string.');
|
|
var binaryString = _utf8ToBinary(utf8String.toString());
|
|
return _update(1, binaryString);
|
|
};
|
|
|
|
if (_hasArrayBuffer) {
|
|
exports.fromBuffer = function fromBuffer(buffer) {
|
|
if (!_isBuffer(buffer))
|
|
throw new Error('First argument need to be ArrayBuffer.');
|
|
var array = new Uint8Array(buffer);
|
|
return _updateUint8Array(1, array);
|
|
};
|
|
}
|
|
|
|
return exports;
|
|
});
|