Initial commit
This commit is contained in:
		
						commit
						35003c5bda
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | ||||
| node_modules | ||||
| misc/coverage.html | ||||
							
								
								
									
										6
									
								
								.jscs.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										6
									
								
								.jscs.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| { | ||||
|   "requireCommaBeforeLineBreak": true, | ||||
|   "disallowTrailingWhitespace": true, | ||||
|   "disallowTrailingComma": true | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										11
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										11
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| language: node_js | ||||
| node_js: | ||||
|   - "0.11" | ||||
|   - "0.10" | ||||
|   - "0.8" | ||||
| before_install: | ||||
|   - "npm install -g mocha" | ||||
|   - "npm install blanket" | ||||
|   - "npm install coveralls mocha-lcov-reporter" | ||||
| after_success: | ||||
|   - "make coveralls-spin" | ||||
							
								
								
									
										14
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										14
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| Copyright (C) 2014  SheetJS | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| 
 | ||||
							
								
								
									
										53
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										53
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,53 @@ | ||||
| LIB=crc32 | ||||
| DEPS=$(sort $(wildcard bits/*.js)) | ||||
| TARGET=$(LIB).js | ||||
| 
 | ||||
| $(TARGET): $(DEPS) | ||||
| 	cat $^ | tr -d '\15\32' > $@ | ||||
| 	cp -f $@ ctest/  | ||||
| 
 | ||||
| bits/01_version.js: package.json | ||||
| 	echo "CRC32.version = '"`grep version package.json | awk '{gsub(/[^0-9a-z\.-]/,"",$$2); print $$2}'`"';" > $@ | ||||
| 
 | ||||
| .PHONY: clean | ||||
| clean: | ||||
| 	rm -f $(TARGET) | ||||
| 
 | ||||
| .PHONY: test mocha | ||||
| test mocha: test.js | ||||
| 	mocha -R spec | ||||
| 
 | ||||
| .PHONY: ctest | ||||
| ctest: | ||||
| 	cat misc/*.js > ctest/fixtures.js | ||||
| 	cp -f test.js ctest/test.js | ||||
| 	cp -f $(TARGET) ctest/  | ||||
| 
 | ||||
| .PHONY: lint | ||||
| lint: $(TARGET) | ||||
| 	jshint --show-non-errors $(TARGET) | ||||
| 	jscs $(TARGET) | ||||
| 
 | ||||
| .PHONY: cov cov-spin | ||||
| cov: misc/coverage.html | ||||
| cov-spin: | ||||
| 	make cov & bash misc/spin.sh $$! | ||||
| 
 | ||||
| COVFMT=$(patsubst %,cov_%,$(FMT)) | ||||
| .PHONY: $(COVFMT) | ||||
| $(COVFMT): cov_%: | ||||
| 	FMTS=$* make cov | ||||
| 
 | ||||
| misc/coverage.html: $(TARGET) test.js | ||||
| 	mocha --require blanket -R html-cov > $@ | ||||
| 
 | ||||
| .PHONY: coveralls coveralls-spin | ||||
| coveralls: | ||||
| 	mocha --require blanket --reporter mocha-lcov-reporter | ./node_modules/coveralls/bin/coveralls.js | ||||
| 
 | ||||
| coveralls-spin: | ||||
| 	make coveralls & bash misc/spin.sh $$! | ||||
| 
 | ||||
| .PHONY: perf | ||||
| perf: | ||||
| 	bash perf/perf.sh | ||||
							
								
								
									
										54
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										54
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | ||||
| # crc32 | ||||
| 
 | ||||
| Standard CRC-32 algorithm implementation in JS (for the browser and nodejs). | ||||
| Emphasis on correctness and performance. | ||||
| 
 | ||||
| ## Installation | ||||
| 
 | ||||
| In [nodejs](https://www.npmjs.org/package/crc-32): | ||||
| 
 | ||||
|     npm install crc-32 | ||||
| 
 | ||||
| In the browser: | ||||
| 
 | ||||
|     <script lang="javascript" src="crc32.js"></script> | ||||
| 
 | ||||
| The browser exposes a variable CRC32 | ||||
| 
 | ||||
| ## Usage | ||||
| 
 | ||||
| - `CRC32.buf(byte array or buffer)` assumes the argument is a set of 8 bit | ||||
|   unsigned integers (e.g. nodejs `Buffer` or simple array of ints) | ||||
| 
 | ||||
| - `CRC32.bstr(binary string)` interprets the argument as a binary string where | ||||
|   the `i`-th byte is `str.charCodeAt(i)` | ||||
| 
 | ||||
| - `CRC32.str(string)` interprets the argument as a standard JS string | ||||
| 
 | ||||
| ## Testing | ||||
| 
 | ||||
| `make test` will run the nodejs-based test.  To run the in-browser tests, run a | ||||
| local server and go to the `ctest` directory.  To update the browser artifacts, | ||||
| run `make ctest`. | ||||
| 
 | ||||
| ## Performance | ||||
| 
 | ||||
| `make perf` will run performance tests. | ||||
| 
 | ||||
| ## In the future ...  | ||||
| 
 | ||||
| - Specifying an arbitrary initial CRC value | ||||
| 
 | ||||
| - Supporting different polynomials (e.g. CRC32C) | ||||
| 
 | ||||
| ## License | ||||
| 
 | ||||
| Please consult the attached LICENSE file for details.  All rights not explicitly | ||||
| granted by the Apache 2.0 license are reserved by the Original Author. | ||||
| 
 | ||||
| [](https://travis-ci.org/SheetJS/js-crc32) | ||||
| 
 | ||||
| [](https://coveralls.io/r/SheetJS/js-crc32?branch=master) | ||||
| 
 | ||||
| [](http://githalytics.com/SheetJS/js-crc32) | ||||
| 
 | ||||
							
								
								
									
										4
									
								
								bits/00_header.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										4
									
								
								bits/00_header.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| /* crc32.js (C) 2014 SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| var CRC32 = {}; | ||||
| (function(CRC32) { | ||||
							
								
								
									
										1
									
								
								bits/01_version.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								bits/01_version.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| CRC32.version = '0.1.0'; | ||||
							
								
								
									
										21
									
								
								bits/20_crctable.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										21
									
								
								bits/20_crctable.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| /* see perf/crc32table.js */ | ||||
| function signed_crc_table() { | ||||
| 	var c, table = new Array(256); | ||||
| 
 | ||||
| 	for(var n =0; n != 256; ++n){ | ||||
| 		c = n; | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		table[n] = c; | ||||
| 	} | ||||
| 
 | ||||
| 	return table; | ||||
| } | ||||
| 
 | ||||
| var table = signed_crc_table(); | ||||
							
								
								
									
										40
									
								
								bits/40_crc.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										40
									
								
								bits/40_crc.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | ||||
| /* charCodeAt is the best approach for binary strings */ | ||||
| function crc32_bstr(bstr) { | ||||
| 	for(var crc = -1, i = 0, L=bstr.length-1; i < L;) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	} | ||||
| 	if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function crc32_buf(buf) { | ||||
| 	for(var crc = -1, i = 0; i != buf.length; ++i) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ buf[i]) & 0xFF]; | ||||
| 	} | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| /* much much faster to intertwine utf8 and crc */ | ||||
| function crc32_str(str) { | ||||
| 	for(var crc = -1, i = 0, L=str.length, c, d; i < L;) { | ||||
| 		c = str.charCodeAt(i++); | ||||
| 		if(c < 0x80) { | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ c) & 0xFF]; | ||||
| 		} else if(c < 0x800) { | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (192|((c>>6)&31))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF]; | ||||
| 		} else if(c >= 0xD800 && c < 0xE000) { | ||||
| 			c = (c&1023)+64; d = str.charCodeAt(i++) & 1023; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (240|((c>>8)&7))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|((c>>2)&63))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|((d>>6)&15)|(c&3))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|(d&63))) & 0xFF]; | ||||
| 		} else { | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (224|((c>>12)&15))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|((c>>6)&63))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF]; | ||||
| 		} | ||||
| 	} | ||||
| 	return crc ^ -1; | ||||
| } | ||||
							
								
								
									
										4
									
								
								bits/90_exports.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										4
									
								
								bits/90_exports.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| CRC32.table = table; | ||||
| CRC32.bstr = crc32_bstr; | ||||
| CRC32.buf = crc32_buf; | ||||
| CRC32.str = crc32_str; | ||||
							
								
								
									
										1
									
								
								bits/99_footer.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								bits/99_footer.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| })(typeof exports !== "undefined" && typeof DO_NOT_EXPORT_CRC === 'undefined' ? exports : CRC32); | ||||
							
								
								
									
										71
									
								
								crc32.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										71
									
								
								crc32.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,71 @@ | ||||
| /* crc32.js (C) 2014 SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| var CRC32 = {}; | ||||
| (function(CRC32) { | ||||
| CRC32.version = '0.1.0'; | ||||
| /* see perf/crc32table.js */ | ||||
| function signed_crc_table() { | ||||
| 	var c, table = new Array(256); | ||||
| 
 | ||||
| 	for(var n =0; n != 256; ++n){ | ||||
| 		c = n; | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		table[n] = c; | ||||
| 	} | ||||
| 
 | ||||
| 	return table; | ||||
| } | ||||
| 
 | ||||
| var table = signed_crc_table(); | ||||
| /* charCodeAt is the best approach for binary strings */ | ||||
| function crc32_bstr(bstr) { | ||||
| 	for(var crc = -1, i = 0, L=bstr.length-1; i < L;) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	} | ||||
| 	if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function crc32_buf(buf) { | ||||
| 	for(var crc = -1, i = 0; i != buf.length; ++i) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ buf[i]) & 0xFF]; | ||||
| 	} | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| /* much much faster to intertwine utf8 and crc */ | ||||
| function crc32_str(str) { | ||||
| 	for(var crc = -1, i = 0, L=str.length, c, d; i < L;) { | ||||
| 		c = str.charCodeAt(i++); | ||||
| 		if(c < 0x80) { | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ c) & 0xFF]; | ||||
| 		} else if(c < 0x800) { | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (192|((c>>6)&31))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF]; | ||||
| 		} else if(c >= 0xD800 && c < 0xE000) { | ||||
| 			c = (c&1023)+64; d = str.charCodeAt(i++) & 1023; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (240|((c>>8)&7))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|((c>>2)&63))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|((d>>6)&15)|(c&3))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|(d&63))) & 0xFF]; | ||||
| 		} else { | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (224|((c>>12)&15))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|((c>>6)&63))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF]; | ||||
| 		} | ||||
| 	} | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| CRC32.table = table; | ||||
| CRC32.bstr = crc32_bstr; | ||||
| CRC32.buf = crc32_buf; | ||||
| CRC32.str = crc32_str; | ||||
| })(typeof exports !== "undefined" && typeof DO_NOT_EXPORT_CRC === 'undefined' ? exports : CRC32); | ||||
							
								
								
									
										71
									
								
								ctest/crc32.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										71
									
								
								ctest/crc32.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,71 @@ | ||||
| /* crc32.js (C) 2014 SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| var CRC32 = {}; | ||||
| (function(CRC32) { | ||||
| CRC32.version = '0.1.0'; | ||||
| /* see perf/crc32table.js */ | ||||
| function signed_crc_table() { | ||||
| 	var c, table = new Array(256); | ||||
| 
 | ||||
| 	for(var n =0; n != 256; ++n){ | ||||
| 		c = n; | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		table[n] = c; | ||||
| 	} | ||||
| 
 | ||||
| 	return table; | ||||
| } | ||||
| 
 | ||||
| var table = signed_crc_table(); | ||||
| /* charCodeAt is the best approach for binary strings */ | ||||
| function crc32_bstr(bstr) { | ||||
| 	for(var crc = -1, i = 0, L=bstr.length-1; i < L;) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	} | ||||
| 	if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function crc32_buf(buf) { | ||||
| 	for(var crc = -1, i = 0; i != buf.length; ++i) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ buf[i]) & 0xFF]; | ||||
| 	} | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| /* much much faster to intertwine utf8 and crc */ | ||||
| function crc32_str(str) { | ||||
| 	for(var crc = -1, i = 0, L=str.length, c, d; i < L;) { | ||||
| 		c = str.charCodeAt(i++); | ||||
| 		if(c < 0x80) { | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ c) & 0xFF]; | ||||
| 		} else if(c < 0x800) { | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (192|((c>>6)&31))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF]; | ||||
| 		} else if(c >= 0xD800 && c < 0xE000) { | ||||
| 			c = (c&1023)+64; d = str.charCodeAt(i++) & 1023; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (240|((c>>8)&7))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|((c>>2)&63))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|((d>>6)&15)|(c&3))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|(d&63))) & 0xFF]; | ||||
| 		} else { | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (224|((c>>12)&15))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|((c>>6)&63))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF]; | ||||
| 		} | ||||
| 	} | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| CRC32.table = table; | ||||
| CRC32.bstr = crc32_bstr; | ||||
| CRC32.buf = crc32_buf; | ||||
| CRC32.str = crc32_str; | ||||
| })(typeof exports !== "undefined" && typeof DO_NOT_EXPORT_CRC === 'undefined' ? exports : CRC32); | ||||
							
								
								
									
										2
									
								
								ctest/fakeassert.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								ctest/fakeassert.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | ||||
| var assert = {}; | ||||
| assert.equal = function(x,y) { if(x !== y) throw x + " !== " + y; }; | ||||
							
								
								
									
										75
									
								
								ctest/fixtures.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										75
									
								
								ctest/fixtures.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | ||||
| var bits = [ | ||||
| 	[ "foobar", -1628037227, 1 ], | ||||
| 	[ "foo bar baz", -228401567, 1 ], | ||||
| 	[ "foo bar baz٪", 984445192 ], | ||||
| 	[ "foo bar baz٪☃", 140429620], | ||||
| 	[ "foo bar baz٪☃🍣", 1531648243] | ||||
| ]; | ||||
| if(typeof module !== "undefined") module.exports = bits; | ||||
| crc32table = [ | ||||
| 	0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, | ||||
| 	0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, | ||||
| 	0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, | ||||
| 	0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, | ||||
| 	0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, | ||||
| 	0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, | ||||
| 	0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, | ||||
| 	0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, | ||||
| 	0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, | ||||
| 	0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, | ||||
| 	0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, | ||||
| 	0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, | ||||
| 	0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, | ||||
| 	0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, | ||||
| 	0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, | ||||
| 	0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, | ||||
| 	0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, | ||||
| 	0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, | ||||
| 	0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, | ||||
| 	0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, | ||||
| 	0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, | ||||
| 	0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, | ||||
| 	0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, | ||||
| 	0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, | ||||
| 	0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, | ||||
| 	0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, | ||||
| 	0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, | ||||
| 	0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, | ||||
| 	0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, | ||||
| 	0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, | ||||
| 	0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, | ||||
| 	0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, | ||||
| 	0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, | ||||
| 	0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, | ||||
| 	0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, | ||||
| 	0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, | ||||
| 	0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, | ||||
| 	0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, | ||||
| 	0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, | ||||
| 	0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, | ||||
| 	0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, | ||||
| 	0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, | ||||
| 	0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, | ||||
| 	0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, | ||||
| 	0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, | ||||
| 	0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, | ||||
| 	0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, | ||||
| 	0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, | ||||
| 	0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, | ||||
| 	0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, | ||||
| 	0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, | ||||
| 	0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, | ||||
| 	0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, | ||||
| 	0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, | ||||
| 	0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, | ||||
| 	0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, | ||||
| 	0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, | ||||
| 	0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, | ||||
| 	0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, | ||||
| 	0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, | ||||
| 	0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, | ||||
| 	0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, | ||||
| 	0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, | ||||
| 	0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D | ||||
| ]; | ||||
| if(typeof module !== 'undefined') module.exports = crc32table; | ||||
							
								
								
									
										21
									
								
								ctest/index.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										21
									
								
								ctest/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
|   <head> | ||||
|     <title>Mocha</title> | ||||
|     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|     <link rel="stylesheet" href="mocha.css" /> | ||||
|   </head> | ||||
|   <body> | ||||
|     <div id="mocha"></div> | ||||
|     <script src="crc32.js"></script> | ||||
|     <script src="fakeassert.js"></script> | ||||
|     <script src="mocha.js"></script> | ||||
|     <script src="fixtures.js"></script> | ||||
|     <script>mocha.setup('bdd')</script> | ||||
|     <script src="test.js"></script> | ||||
|     <script> | ||||
|       mocha.run(); | ||||
|     </script> | ||||
|   </body> | ||||
| </html> | ||||
							
								
								
									
										270
									
								
								ctest/mocha.css
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										270
									
								
								ctest/mocha.css
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,270 @@ | ||||
| @charset "utf-8"; | ||||
| 
 | ||||
| body { | ||||
|   margin:0; | ||||
| } | ||||
| 
 | ||||
| #mocha { | ||||
|   font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; | ||||
|   margin: 60px 50px; | ||||
| } | ||||
| 
 | ||||
| #mocha ul, | ||||
| #mocha li { | ||||
|   margin: 0; | ||||
|   padding: 0; | ||||
| } | ||||
| 
 | ||||
| #mocha ul { | ||||
|   list-style: none; | ||||
| } | ||||
| 
 | ||||
| #mocha h1, | ||||
| #mocha h2 { | ||||
|   margin: 0; | ||||
| } | ||||
| 
 | ||||
| #mocha h1 { | ||||
|   margin-top: 15px; | ||||
|   font-size: 1em; | ||||
|   font-weight: 200; | ||||
| } | ||||
| 
 | ||||
| #mocha h1 a { | ||||
|   text-decoration: none; | ||||
|   color: inherit; | ||||
| } | ||||
| 
 | ||||
| #mocha h1 a:hover { | ||||
|   text-decoration: underline; | ||||
| } | ||||
| 
 | ||||
| #mocha .suite .suite h1 { | ||||
|   margin-top: 0; | ||||
|   font-size: .8em; | ||||
| } | ||||
| 
 | ||||
| #mocha .hidden { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| #mocha h2 { | ||||
|   font-size: 12px; | ||||
|   font-weight: normal; | ||||
|   cursor: pointer; | ||||
| } | ||||
| 
 | ||||
| #mocha .suite { | ||||
|   margin-left: 15px; | ||||
| } | ||||
| 
 | ||||
| #mocha .test { | ||||
|   margin-left: 15px; | ||||
|   overflow: hidden; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pending:hover h2::after { | ||||
|   content: '(pending)'; | ||||
|   font-family: arial, sans-serif; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pass.medium .duration { | ||||
|   background: #c09853; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pass.slow .duration { | ||||
|   background: #b94a48; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pass::before { | ||||
|   content: '✓'; | ||||
|   font-size: 12px; | ||||
|   display: block; | ||||
|   float: left; | ||||
|   margin-right: 5px; | ||||
|   color: #00d6b2; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pass .duration { | ||||
|   font-size: 9px; | ||||
|   margin-left: 5px; | ||||
|   padding: 2px 5px; | ||||
|   color: #fff; | ||||
|   -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); | ||||
|   -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); | ||||
|   box-shadow: inset 0 1px 1px rgba(0,0,0,.2); | ||||
|   -webkit-border-radius: 5px; | ||||
|   -moz-border-radius: 5px; | ||||
|   -ms-border-radius: 5px; | ||||
|   -o-border-radius: 5px; | ||||
|   border-radius: 5px; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pass.fast .duration { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pending { | ||||
|   color: #0b97c4; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pending::before { | ||||
|   content: '◦'; | ||||
|   color: #0b97c4; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.fail { | ||||
|   color: #c00; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.fail pre { | ||||
|   color: black; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.fail::before { | ||||
|   content: '✖'; | ||||
|   font-size: 12px; | ||||
|   display: block; | ||||
|   float: left; | ||||
|   margin-right: 5px; | ||||
|   color: #c00; | ||||
| } | ||||
| 
 | ||||
| #mocha .test pre.error { | ||||
|   color: #c00; | ||||
|   max-height: 300px; | ||||
|   overflow: auto; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * (1): approximate for browsers not supporting calc | ||||
|  * (2): 42 = 2*15 + 2*10 + 2*1 (padding + margin + border) | ||||
|  *      ^^ seriously | ||||
|  */ | ||||
| #mocha .test pre { | ||||
|   display: block; | ||||
|   float: left; | ||||
|   clear: left; | ||||
|   font: 12px/1.5 monaco, monospace; | ||||
|   margin: 5px; | ||||
|   padding: 15px; | ||||
|   border: 1px solid #eee; | ||||
|   max-width: 85%; /*(1)*/ | ||||
|   max-width: calc(100% - 42px); /*(2)*/ | ||||
|   word-wrap: break-word; | ||||
|   border-bottom-color: #ddd; | ||||
|   -webkit-border-radius: 3px; | ||||
|   -webkit-box-shadow: 0 1px 3px #eee; | ||||
|   -moz-border-radius: 3px; | ||||
|   -moz-box-shadow: 0 1px 3px #eee; | ||||
|   border-radius: 3px; | ||||
| } | ||||
| 
 | ||||
| #mocha .test h2 { | ||||
|   position: relative; | ||||
| } | ||||
| 
 | ||||
| #mocha .test a.replay { | ||||
|   position: absolute; | ||||
|   top: 3px; | ||||
|   right: 0; | ||||
|   text-decoration: none; | ||||
|   vertical-align: middle; | ||||
|   display: block; | ||||
|   width: 15px; | ||||
|   height: 15px; | ||||
|   line-height: 15px; | ||||
|   text-align: center; | ||||
|   background: #eee; | ||||
|   font-size: 15px; | ||||
|   -moz-border-radius: 15px; | ||||
|   border-radius: 15px; | ||||
|   -webkit-transition: opacity 200ms; | ||||
|   -moz-transition: opacity 200ms; | ||||
|   transition: opacity 200ms; | ||||
|   opacity: 0.3; | ||||
|   color: #888; | ||||
| } | ||||
| 
 | ||||
| #mocha .test:hover a.replay { | ||||
|   opacity: 1; | ||||
| } | ||||
| 
 | ||||
| #mocha-report.pass .test.fail { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| #mocha-report.fail .test.pass { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| #mocha-report.pending .test.pass, | ||||
| #mocha-report.pending .test.fail { | ||||
|   display: none; | ||||
| } | ||||
| #mocha-report.pending .test.pass.pending { | ||||
|   display: block; | ||||
| } | ||||
| 
 | ||||
| #mocha-error { | ||||
|   color: #c00; | ||||
|   font-size: 1.5em; | ||||
|   font-weight: 100; | ||||
|   letter-spacing: 1px; | ||||
| } | ||||
| 
 | ||||
| #mocha-stats { | ||||
|   position: fixed; | ||||
|   top: 15px; | ||||
|   right: 10px; | ||||
|   font-size: 12px; | ||||
|   margin: 0; | ||||
|   color: #888; | ||||
|   z-index: 1; | ||||
| } | ||||
| 
 | ||||
| #mocha-stats .progress { | ||||
|   float: right; | ||||
|   padding-top: 0; | ||||
| } | ||||
| 
 | ||||
| #mocha-stats em { | ||||
|   color: black; | ||||
| } | ||||
| 
 | ||||
| #mocha-stats a { | ||||
|   text-decoration: none; | ||||
|   color: inherit; | ||||
| } | ||||
| 
 | ||||
| #mocha-stats a:hover { | ||||
|   border-bottom: 1px solid #eee; | ||||
| } | ||||
| 
 | ||||
| #mocha-stats li { | ||||
|   display: inline-block; | ||||
|   margin: 0 5px; | ||||
|   list-style: none; | ||||
|   padding-top: 11px; | ||||
| } | ||||
| 
 | ||||
| #mocha-stats canvas { | ||||
|   width: 40px; | ||||
|   height: 40px; | ||||
| } | ||||
| 
 | ||||
| #mocha code .comment { color: #ddd; } | ||||
| #mocha code .init { color: #2f6fad; } | ||||
| #mocha code .string { color: #5890ad; } | ||||
| #mocha code .keyword { color: #8a6343; } | ||||
| #mocha code .number { color: #2f6fad; } | ||||
| 
 | ||||
| @media screen and (max-device-width: 480px) { | ||||
|   #mocha { | ||||
|     margin: 60px 0px; | ||||
|   } | ||||
| 
 | ||||
|   #mocha #stats { | ||||
|     position: absolute; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										5842
									
								
								ctest/mocha.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										5842
									
								
								ctest/mocha.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										33
									
								
								ctest/test.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										33
									
								
								ctest/test.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| /* vim: set ts=2: */ | ||||
| var X; | ||||
| if(typeof require !== 'undefined') { | ||||
| 	assert = require('assert'); | ||||
| 	describe('source',function(){it('should load',function(){X=require('./');});}); | ||||
| 	bits = require('./misc/bits.js'); | ||||
| 	crc32table = require('./misc/table.js'); | ||||
| } else { X = CRC32; } | ||||
| 
 | ||||
| describe('crc32 table', function() { | ||||
| 	it('should match fixed table', function() { | ||||
| 		var badness = 0; | ||||
| 		for(var i = 0; i != crc32table.length; ++i) { | ||||
| 			assert.equal(crc32table[i]|0, X.table[i]); | ||||
| 			if(crc32table[i] !== X.table[i]) ++badness; | ||||
| 		} | ||||
| 		assert.equal(badness, 128); | ||||
| 	}); | ||||
| }); | ||||
| 
 | ||||
| describe('crc32 bits', function() { | ||||
| 	bits.forEach(function(i) { | ||||
| 		var l = i[0].length; | ||||
| 		var msg = i[0]; | ||||
| 		if(l > 20) i[0].substr(0,5) + "...(" + l + ")..." + i[0].substr(-5); | ||||
| 		it(msg, function() { | ||||
| 			if(i[2] === 1) assert.equal(X.bstr(i[0]), i[1]|0); | ||||
| 			assert.equal(X.str(i[0]), i[1]|0); | ||||
| 			if(typeof Buffer !== 'undefined') assert.equal(X.buf(new Buffer(i[0])), i[1]|0); | ||||
| 		}); | ||||
| 	}); | ||||
| }); | ||||
| 
 | ||||
							
								
								
									
										8
									
								
								misc/bits.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										8
									
								
								misc/bits.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| var bits = [ | ||||
| 	[ "foobar", -1628037227, 1 ], | ||||
| 	[ "foo bar baz", -228401567, 1 ], | ||||
| 	[ "foo bar baz٪", 984445192 ], | ||||
| 	[ "foo bar baz٪☃", 140429620], | ||||
| 	[ "foo bar baz٪☃🍣", 1531648243] | ||||
| ]; | ||||
| if(typeof module !== "undefined") module.exports = bits; | ||||
							
								
								
									
										67
									
								
								misc/table.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										67
									
								
								misc/table.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,67 @@ | ||||
| crc32table = [ | ||||
| 	0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, | ||||
| 	0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, | ||||
| 	0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, | ||||
| 	0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, | ||||
| 	0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, | ||||
| 	0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, | ||||
| 	0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, | ||||
| 	0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, | ||||
| 	0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, | ||||
| 	0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, | ||||
| 	0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, | ||||
| 	0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, | ||||
| 	0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, | ||||
| 	0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, | ||||
| 	0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, | ||||
| 	0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, | ||||
| 	0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, | ||||
| 	0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, | ||||
| 	0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, | ||||
| 	0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, | ||||
| 	0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, | ||||
| 	0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, | ||||
| 	0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, | ||||
| 	0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, | ||||
| 	0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, | ||||
| 	0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, | ||||
| 	0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, | ||||
| 	0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, | ||||
| 	0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, | ||||
| 	0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, | ||||
| 	0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, | ||||
| 	0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, | ||||
| 	0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, | ||||
| 	0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, | ||||
| 	0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, | ||||
| 	0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, | ||||
| 	0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, | ||||
| 	0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, | ||||
| 	0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, | ||||
| 	0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, | ||||
| 	0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, | ||||
| 	0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, | ||||
| 	0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, | ||||
| 	0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, | ||||
| 	0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, | ||||
| 	0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, | ||||
| 	0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, | ||||
| 	0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, | ||||
| 	0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, | ||||
| 	0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, | ||||
| 	0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, | ||||
| 	0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, | ||||
| 	0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, | ||||
| 	0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, | ||||
| 	0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, | ||||
| 	0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, | ||||
| 	0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, | ||||
| 	0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, | ||||
| 	0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, | ||||
| 	0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, | ||||
| 	0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, | ||||
| 	0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, | ||||
| 	0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, | ||||
| 	0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D | ||||
| ]; | ||||
| if(typeof module !== 'undefined') module.exports = crc32table; | ||||
							
								
								
									
										27
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										27
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | ||||
| { | ||||
| 	"name": "crc-32", | ||||
| 	"version": "0.1.0", | ||||
| 	"author": "sheetjs", | ||||
| 	"description": "Pure-JS CRC-32", | ||||
| 	"keywords": [ "crc32", "checksum", "crc" ], | ||||
| 	"main": "./crc32", | ||||
| 	"devDependencies": { | ||||
| 		"mocha":"", | ||||
| 		"xlsjs":"", | ||||
| 		"uglify-js":"", | ||||
| 		"codepage":"" | ||||
| 	}, | ||||
| 	"repository": { "type":"git", "url":"git://github.com/SheetJS/js-crc32.git" }, | ||||
| 	"scripts": { | ||||
| 		"pretest": "git submodule init && git submodule update", | ||||
| 		"test": "make test" | ||||
| 	}, | ||||
| 	"config": { | ||||
| 		"blanket": { | ||||
| 			"pattern": "crc32.js" | ||||
| 		} | ||||
| 	}, | ||||
| 	"bugs": { "url": "https://github.com/SheetJS/js-crc32/issues" }, | ||||
| 	"license": "Apache-2.0", | ||||
| 	"engines": { "node": ">=0.8" } | ||||
| } | ||||
							
								
								
									
										28
									
								
								perf/bm.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										28
									
								
								perf/bm.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| /* ssf.js (C) 2014 SheetJS -- http://sheetjs.com */ | ||||
| var Benchmark = require('benchmark'); | ||||
| var c = require('ansi')(process.stdout); | ||||
| 
 | ||||
| function test_end() { c.horizontalAbsolute(0).write("✓"); c.write('\n'); } | ||||
| 
 | ||||
| function suite_end() { console.log('Fastest is ' + this.filter('fastest').pluck('name')); }  | ||||
| 
 | ||||
| function test_cycle(e) { c.horizontalAbsolute(0); c.eraseLine(); c.write("→ "+e.target); } | ||||
| 
 | ||||
| function BM(name) { | ||||
| 	if(!(this instanceof BM)) return new BM(name); | ||||
| 	console.log("--- " + name + " ---"); | ||||
| 	this.suite = new Benchmark.Suite(name, { onComplete: suite_end }); | ||||
| } | ||||
| 
 | ||||
| BM.prototype.run = function() { this.suite.run(); }; | ||||
| 
 | ||||
| BM.prototype.add = function(msg, test) { | ||||
| 	this.suite.add(msg, { | ||||
| 		onCycle: test_cycle,  | ||||
| 		onComplete: test_end, | ||||
| 		defer: false,  | ||||
| 		fn: test | ||||
| 	}); | ||||
| }; | ||||
| 
 | ||||
| module.exports = BM; | ||||
							
								
								
									
										83
									
								
								perf/bstr.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										83
									
								
								perf/bstr.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,83 @@ | ||||
| var table = require('../').table; | ||||
| 
 | ||||
| function strToArr(str) { | ||||
| 	// sweet hack to turn string into a 'byte' array
 | ||||
| 	return Array.prototype.map.call(str, function (c) { | ||||
| 		return c.charCodeAt(0); | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
| 	function crcTable(arr, append) { | ||||
| 		var crc, i, l; | ||||
| 
 | ||||
| 		// if we're in append mode, don't reset crc
 | ||||
| 		// if arr is null or undefined, reset table and return
 | ||||
| 		if (typeof crcTable.crc === 'undefined' || !append || !arr) { | ||||
| 			crcTable.crc = 0 ^ -1; | ||||
| 
 | ||||
| 			if (!arr) { | ||||
| 				return; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		// store in temp variable for minor speed gain
 | ||||
| 		crc = crcTable.crc; | ||||
| 
 | ||||
| 		for (i = 0, l = arr.length; i < l; i += 1) { | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ arr[i]) & 0xff]; | ||||
| 		} | ||||
| 
 | ||||
| 		crcTable.crc = crc; | ||||
| 
 | ||||
| 		return crc ^ -1; | ||||
| 	} | ||||
| 
 | ||||
| function node_crc32(bstr) { | ||||
| 	return crcTable(strToArr(bstr)); | ||||
| } | ||||
| 
 | ||||
| function sheetjs1(bstr) {  | ||||
| 	for(var crc = -1, i = 0; i != bstr.length; ++i) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF]; | ||||
| 	} | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function sheetjs2(bstr) {  | ||||
| 	for(var crc = -1, i = 0, L=bstr.length-1; i < L;) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	} | ||||
| 	if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function sheetjs3(bstr) {  | ||||
| 	for(var crc = -1, i = 0, L=bstr.length-2; i < L;) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	} | ||||
| 	if(i === L++) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	if(i === L++) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i++)) & 0xFF]; | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| var BM = require('./bm'); | ||||
| var suite = new BM('binary string'); | ||||
| 
 | ||||
| var foobar = "foobarbazqux"; | ||||
| foobar += " " + foobar; | ||||
| foobar += " " + foobar; | ||||
| foobar += " " + foobar; | ||||
| foobar += " " + foobar; | ||||
| suite.add('npm crc32', function() { for(var j = 0; j != 1000; ++j) node_crc32(foobar); }); | ||||
| suite.add('sheetjs 1', function() { for(var j = 0; j != 1000; ++j) sheetjs1(foobar); }); | ||||
| suite.add('sheetjs 2', function() { for(var j = 0; j != 1000; ++j) sheetjs2(foobar); }); | ||||
| suite.add('sheetjs 3', function() { for(var j = 0; j != 1000; ++j) sheetjs3(foobar); }); | ||||
| suite.run(); | ||||
| 
 | ||||
| var assert = require('assert'); | ||||
| assert.equal(node_crc32(foobar), sheetjs1(foobar)); | ||||
| assert.equal(node_crc32(foobar), sheetjs2(foobar)); | ||||
| assert.equal(node_crc32(foobar), sheetjs3(foobar)); | ||||
							
								
								
									
										86
									
								
								perf/crc32table.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										86
									
								
								perf/crc32table.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,86 @@ | ||||
| var t=[], poly = 0xEDB88320; | ||||
| function node_crc32() { | ||||
| 	var c, n, k; | ||||
| 
 | ||||
| 	for (n = 0; n < 256; n += 1) { | ||||
| 		c = n; | ||||
| 		for (k = 0; k < 8; k += 1) { | ||||
| 			if (c & 1) { | ||||
| 				c = poly ^ (c >>> 1); | ||||
| 			} else { | ||||
| 				c = c >>> 1; | ||||
| 			} | ||||
| 		} | ||||
| 		t[n] = c >>> 0; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| function node_pako() { | ||||
| 	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; | ||||
| } | ||||
| 
 | ||||
| function sheetjs1() { | ||||
| 	var c, table = []; | ||||
| 
 | ||||
| 	for(var n =0; n != 256; ++n){ | ||||
| 		c = n; | ||||
| 		c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		table[n] = c; | ||||
| 	} | ||||
| 
 | ||||
| 	return table; | ||||
| } | ||||
| 
 | ||||
| function sheetjs2() { | ||||
| 	var c, table = new Array(256); | ||||
| 
 | ||||
| 	for(var n =0; n != 256; ++n){ | ||||
| 		c = n; | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); | ||||
| 		table[n] = c; | ||||
| 	} | ||||
| 
 | ||||
| 	return table; | ||||
| } | ||||
| 
 | ||||
| var BM = require('./bm'); | ||||
| var suite = new BM('building crc32 table'); | ||||
| 
 | ||||
| suite.add('npm crc32', function() { for(var j = 0; j != 1000; ++j) node_crc32(); }); | ||||
| suite.add('npm  pako', function() { for(var j = 0; j != 1000; ++j) node_pako(); }); | ||||
| suite.add('sheetjs 1', function() { for(var j = 0; j != 1000; ++j) sheetjs1(); }); | ||||
| suite.add('sheetjs 2', function() { for(var j = 0; j != 1000; ++j) sheetjs2(); }); | ||||
| suite.run() | ||||
| 
 | ||||
| var assert    = require('assert'); | ||||
| var m1 = (node_pako()); | ||||
| var m2 = (sheetjs1()); | ||||
| var m3 = (sheetjs2()); | ||||
| 
 | ||||
| assert.equal(m1.length, m2.length); | ||||
| assert.equal(m1.length, m3.length); | ||||
| for(var i = 0; i != m1.length; ++i) { assert.equal(m1[i], m2[i]); assert.equal(m1[i], m3[i]); } | ||||
							
								
								
									
										6
									
								
								perf/perf.sh
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										6
									
								
								perf/perf.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,6 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| node perf/crc32table.js | ||||
| node perf/bstr.js | ||||
| node perf/utf8.js | ||||
| 
 | ||||
							
								
								
									
										47
									
								
								perf/utf8.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										47
									
								
								perf/utf8.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | ||||
| var table = require('../').table; | ||||
| 
 | ||||
| function sheetjs1(utf8) { | ||||
| 	var buf = new Buffer(utf8); | ||||
| 	for(var crc = -1, i = 0; i != buf.length; ++i) { | ||||
| 		crc = (crc >>> 8) ^ table[(crc ^ buf[i]) & 0xFF]; | ||||
| 	} | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| function sheetjs2(utf8) { | ||||
| 	for(var crc = -1, i = 0, L=utf8.length, c, d; i < L;) { | ||||
| 		c = utf8.charCodeAt(i++); | ||||
| 		if(c < 0x80) { | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ c) & 0xFF]; | ||||
| 		} else if(c < 0x800) { | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (192|((c>>6)&31))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF]; | ||||
| 		} else if(c >= 0xD800 && c < 0xE000) { | ||||
| 			c = (c&1023)+64; d = utf8.charCodeAt(i++) & 1023; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (240|((c>>8)&7))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|((c>>2)&63))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|((d>>6)&15)|(c&3))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|(d&63))) & 0xFF]; | ||||
| 		} else { | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (224|((c>>12)&15))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|((c>>6)&63))) & 0xFF]; | ||||
| 			crc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF]; | ||||
| 		} | ||||
| 	} | ||||
| 	return crc ^ -1; | ||||
| } | ||||
| 
 | ||||
| var BM = require('./bm'); | ||||
| var suite = new BM('unicode string'); | ||||
| 
 | ||||
| var foobar = "foo bar baz٪☃🍣"; | ||||
| foobar += " " + foobar; | ||||
| foobar += " " + foobar; | ||||
| foobar += " " + foobar; | ||||
| foobar += " " + foobar; | ||||
| suite.add('sheetjs 1', function() { for(var j = 0; j != 1000; ++j) sheetjs1(foobar); }); | ||||
| suite.add('sheetjs 2', function() { for(var j = 0; j != 1000; ++j) sheetjs2(foobar); }); | ||||
| suite.run() | ||||
| var assert = require('assert'); | ||||
| assert.equal(sheetjs1(foobar), sheetjs2(foobar)); | ||||
| 
 | ||||
							
								
								
									
										33
									
								
								test.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										33
									
								
								test.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| /* vim: set ts=2: */ | ||||
| var X; | ||||
| if(typeof require !== 'undefined') { | ||||
| 	assert = require('assert'); | ||||
| 	describe('source',function(){it('should load',function(){X=require('./');});}); | ||||
| 	bits = require('./misc/bits.js'); | ||||
| 	crc32table = require('./misc/table.js'); | ||||
| } else { X = CRC32; } | ||||
| 
 | ||||
| describe('crc32 table', function() { | ||||
| 	it('should match fixed table', function() { | ||||
| 		var badness = 0; | ||||
| 		for(var i = 0; i != crc32table.length; ++i) { | ||||
| 			assert.equal(crc32table[i]|0, X.table[i]); | ||||
| 			if(crc32table[i] !== X.table[i]) ++badness; | ||||
| 		} | ||||
| 		assert.equal(badness, 128); | ||||
| 	}); | ||||
| }); | ||||
| 
 | ||||
| describe('crc32 bits', function() { | ||||
| 	bits.forEach(function(i) { | ||||
| 		var l = i[0].length; | ||||
| 		var msg = i[0]; | ||||
| 		if(l > 20) i[0].substr(0,5) + "...(" + l + ")..." + i[0].substr(-5); | ||||
| 		it(msg, function() { | ||||
| 			if(i[2] === 1) assert.equal(X.bstr(i[0]), i[1]|0); | ||||
| 			assert.equal(X.str(i[0]), i[1]|0); | ||||
| 			if(typeof Buffer !== 'undefined') assert.equal(X.buf(new Buffer(i[0])), i[1]|0); | ||||
| 		}); | ||||
| 	}); | ||||
| }); | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user