Subversion-Projekte lars-tiefland.cienc

Revision

Blame | Letzte Änderung | Log anzeigen | RSS feed

/*
 * 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;
});