You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					78 lines
				
				1.9 KiB
			
		
		
			
		
	
	
					78 lines
				
				1.9 KiB
			| 
											2 years ago
										 | "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); | ||
|  |     } | ||
|  | }; |