1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- 'use strict';
-
- var utils = require('./utils');
-
- /**
- * The following functions come from pako, from pako/lib/zlib/crc32.js
- * released under the MIT license, see pako https://github.com/nodeca/pako/
- */
-
- // Use ordinary array, since untyped makes no boost here
- function makeTable() {
- var c, table = [];
-
- for(var n =0; n < 256; n++){
- c = n;
- for(var k =0; k < 8; k++){
- c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
- }
- table[n] = c;
- }
-
- return table;
- }
-
- // Create table on load. Just 255 signed longs. Not a problem.
- var crcTable = makeTable();
-
-
- function crc32(crc, buf, len, pos) {
- var t = crcTable, end = pos + len;
-
- crc = crc ^ (-1);
-
- for (var i = pos; i < end; i++ ) {
- crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
- }
-
- return (crc ^ (-1)); // >>> 0;
- }
-
- // That's all for the pako functions.
-
- /**
- * Compute the crc32 of a string.
- * This is almost the same as the function crc32, but for strings. Using the
- * same function for the two use cases leads to horrible performances.
- * @param {Number} crc the starting value of the crc.
- * @param {String} str the string to use.
- * @param {Number} len the length of the string.
- * @param {Number} pos the starting position for the crc32 computation.
- * @return {Number} the computed crc32.
- */
- function crc32str(crc, str, len, pos) {
- var t = crcTable, end = pos + len;
-
- crc = crc ^ (-1);
-
- for (var i = pos; i < end; i++ ) {
- crc = (crc >>> 8) ^ t[(crc ^ str.charCodeAt(i)) & 0xFF];
- }
-
- return (crc ^ (-1)); // >>> 0;
- }
-
- module.exports = function crc32wrapper(input, crc) {
- if (typeof input === "undefined" || !input.length) {
- return 0;
- }
-
- var isArray = utils.getTypeOf(input) !== "string";
-
- if(isArray) {
- return crc32(crc|0, input, input.length, 0);
- } else {
- return crc32str(crc|0, input, input.length, 0);
- }
- };
|