version bump 0.4.1
- normalized crc iteration logic - added browser demo - added command line tool crc32 - fixed unicode baseline script (node 6 changed default array printing) - fixed performance tests (benchmark module changed behavior) - updated travis versions for test - miscellaneous adjustments to tooling
This commit is contained in:
parent
79a265b662
commit
e1c9c5e5cd
@ -9,9 +9,14 @@
|
||||
.*/misc/.*
|
||||
.*/perf/.*
|
||||
|
||||
.*/demo/browser.js
|
||||
|
||||
[include]
|
||||
crc32.flow.js
|
||||
.*/demo/browser.flow.js
|
||||
|
||||
[libs]
|
||||
bits/10_types.js
|
||||
misc/flow.js
|
||||
|
||||
[options]
|
||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -3,4 +3,3 @@ test_files/*.py
|
||||
test_files/*.js
|
||||
test_files/baseline*
|
||||
misc/coverage.html
|
||||
misc/*/
|
||||
|
@ -1,16 +1,17 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- "5.0"
|
||||
- "4.2"
|
||||
- "6"
|
||||
- "5"
|
||||
- "4"
|
||||
- "0.12"
|
||||
- "0.10"
|
||||
- "0.8"
|
||||
before_install:
|
||||
- "npm install -g npm@next"
|
||||
- "npm install -g mocha crc-32 benchmark ansi"
|
||||
- "npm install -g mocha"
|
||||
- "npm install codepage"
|
||||
- "npm install blanket"
|
||||
- "npm install coveralls mocha-lcov-reporter"
|
||||
after_success:
|
||||
- "make coveralls-spin"
|
||||
- "make perf-all"
|
||||
# - "make perf-all"
|
||||
|
87
Makefile
87
Makefile
@ -1,79 +1,88 @@
|
||||
LIB=crc32
|
||||
REQS=
|
||||
ADDONS=
|
||||
AUXTARGETS=
|
||||
AUXTARGETS=demo/browser.js
|
||||
HTMLLINT=index.html
|
||||
|
||||
ULIB=$(shell echo $(LIB) | tr a-z A-Z)
|
||||
DEPS=$(sort $(wildcard bits/*.js))
|
||||
TARGET=$(LIB).js
|
||||
FLOWTARGET=$(LIB).flow.js
|
||||
|
||||
## Main Targets
|
||||
|
||||
.PHONY: all
|
||||
all: $(TARGET) $(AUXTARGETS)
|
||||
all: $(TARGET) $(AUXTARGETS) ## Build library and auxiliary scripts
|
||||
|
||||
$(TARGET) $(AUXTARGETS): %.js : %.flow.js
|
||||
node -e 'process.stdout.write(require("fs").readFileSync("$<","utf8").replace(/^\s*\/\*:[^*]*\*\/\s*(\n)?/gm,"").replace(/\/\*:[^*]*\*\//gm,""))' > $@
|
||||
node -e 'process.stdout.write(require("fs").readFileSync("$<","utf8").replace(/^[ \t]*\/\*[:#][^*]*\*\/\s*(\n)?/gm,"").replace(/\/\*[:#][^*]*\*\//gm,""))' > $@
|
||||
|
||||
$(LIB).flow.js: $(DEPS)
|
||||
$(FLOWTARGET): $(DEPS)
|
||||
cat $^ | tr -d '\15\32' > $@
|
||||
|
||||
bits/01_version.js: package.json
|
||||
echo "CRC32.version = '"`grep version package.json | awk '{gsub(/[^0-9a-z\.-]/,"",$$2); print $$2}'`"';" > $@
|
||||
|
||||
.PHONY: clean
|
||||
clean: clean-baseline
|
||||
rm -f $(TARGET)
|
||||
clean: clean-baseline ## Remove targets and build artifacts
|
||||
rm -f $(TARGET) $(FLOWTARGET)
|
||||
|
||||
## Testing
|
||||
|
||||
.PHONY: test mocha
|
||||
test mocha: test.js $(TARGET) baseline
|
||||
test mocha: test.js $(TARGET) baseline ## Run test suite
|
||||
mocha -R spec -t 20000
|
||||
|
||||
.PHONY: ctest
|
||||
ctest:
|
||||
ctest: ## Build browser test (into ctest/ subdirectory)
|
||||
cat misc/*.js > ctest/fixtures.js
|
||||
cp -f test.js ctest/test.js
|
||||
cp -f $(TARGET) ctest/
|
||||
|
||||
.PHONY: ctestserv
|
||||
ctestserv: ## Start a test server on port 8000
|
||||
@cd ctest && python -mSimpleHTTPServer
|
||||
|
||||
.PHONY: baseline
|
||||
baseline: ## Build test baselines
|
||||
@bash ./misc/make_baseline.sh
|
||||
|
||||
.PHONY: clean-baseline
|
||||
clean-baseline: ## Remove test baselines
|
||||
@bash ./misc/make_baseline.sh clean
|
||||
|
||||
## Code Checking
|
||||
|
||||
.PHONY: lint
|
||||
lint: $(TARGET) $(AUXTARGETS)
|
||||
jshint --show-non-errors $(TARGET) $(AUXTARGETS)
|
||||
jshint --show-non-errors package.json
|
||||
jscs $(TARGET) $(AUXTARGETS)
|
||||
lint: $(TARGET) $(AUXTARGETS) ## Run jshint and jscs checks
|
||||
@jshint --show-non-errors $(TARGET) $(AUXTARGETS)
|
||||
@jshint --show-non-errors package.json
|
||||
@jshint --show-non-errors --extract=always $(HTMLLINT)
|
||||
@jscs $(TARGET) $(AUXTARGETS)
|
||||
|
||||
.PHONY: flow
|
||||
flow: lint
|
||||
flow check --all --show-all-errors
|
||||
flow: lint ## Run flow checker
|
||||
@flow check --all --show-all-errors
|
||||
|
||||
.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
|
||||
.PHONY: cov
|
||||
cov: misc/coverage.html ## Run coverage test
|
||||
|
||||
misc/coverage.html: $(TARGET) test.js
|
||||
mocha --require blanket -R html-cov -t 20000 > $@
|
||||
|
||||
.PHONY: coveralls coveralls-spin
|
||||
coveralls:
|
||||
mocha --require blanket --reporter mocha-lcov-reporter -t 20000 | ./node_modules/coveralls/bin/coveralls.js
|
||||
|
||||
coveralls-spin:
|
||||
make coveralls & bash misc/spin.sh $$!
|
||||
.PHONY: coveralls
|
||||
coveralls: ## Coverage Test + Send to coveralls.io
|
||||
mocha --require blanket --reporter mocha-lcov-reporter -t 20000 | node ./node_modules/coveralls/bin/coveralls.js
|
||||
|
||||
.PHONY: perf
|
||||
perf:
|
||||
bash perf/perf.sh
|
||||
perf: ## Run Performance Tests
|
||||
@bash perf/perf.sh
|
||||
|
||||
.PHONY: perf-all
|
||||
perf-all:
|
||||
bash misc/perf.sh
|
||||
|
||||
.PHONY: baseline clean-baseline
|
||||
baseline:
|
||||
./misc/make_baseline.sh
|
||||
.PHONY: help
|
||||
help:
|
||||
@grep -hE '(^[a-zA-Z_-][ a-zA-Z_-]*:.*?|^#[#*])' $(MAKEFILE_LIST) | bash misc/help.sh
|
||||
|
||||
clean-baseline:
|
||||
rm -f test_files/*.*
|
||||
#* To show a spinner, append "-spin" to any target e.g. cov-spin
|
||||
%-spin:
|
||||
@make $* & bash misc/spin.sh $$!
|
||||
|
45
README.md
45
README.md
@ -13,6 +13,11 @@ In the browser:
|
||||
|
||||
<script src="crc32.js"></script>
|
||||
|
||||
The browser exposes a variable ADLER32
|
||||
|
||||
When installed globally, npm installs a script `crc32` that computes the
|
||||
checksum for a specified file or standard input.
|
||||
|
||||
The script will manipulate `module.exports` if available (e.g. in a CommonJS
|
||||
`require` context). This is not always desirable. To prevent the behavior,
|
||||
define `DO_NOT_EXPORT_CRC`
|
||||
@ -46,13 +51,47 @@ For example:
|
||||
|
||||
## Testing
|
||||
|
||||
`make test` will run the node-based tests.
|
||||
`make test` will run the nodejs-based test.
|
||||
|
||||
To run the in-browser tests, run a local server and go to the `ctest` directory.
|
||||
`make ctestserv` will start a python `SimpleHTTPServer` server on port 8000.
|
||||
|
||||
To update the browser artifacts, run `make ctest`.
|
||||
|
||||
`make baseline` will generate baseline files based on the unicode mapping at
|
||||
<http://mathias.html5.org>
|
||||
To generate the bits file, use the `crc32` function from python zlib:
|
||||
|
||||
```python
|
||||
>>> from zlib import crc32
|
||||
>>> x="foo bar baz٪☃🍣"
|
||||
>>> crc32(x)
|
||||
1531648243
|
||||
>>> crc32(x+x)
|
||||
-218791105
|
||||
>>> crc32(x+x+x)
|
||||
1834240887
|
||||
```
|
||||
|
||||
The included `crc32.njs` script can process files or stdin:
|
||||
|
||||
```
|
||||
$ echo "this is a test" > t.txt
|
||||
$ bin/crc32.njs t.txt
|
||||
1912935186
|
||||
```
|
||||
|
||||
For comparison, the included `crc32.py` script uses python zlib:
|
||||
|
||||
```
|
||||
$ bin/crc32.py t.txt
|
||||
1912935186
|
||||
```
|
||||
|
||||
## Performance
|
||||
|
||||
`make perf` will run algorithmic performance tests (which should justify certain
|
||||
decisions in the code).
|
||||
|
||||
[js-adler32](http://git.io/adler32) has more performance notes
|
||||
|
||||
## License
|
||||
|
||||
|
37
bin/crc32.njs
Executable file
37
bin/crc32.njs
Executable file
@ -0,0 +1,37 @@
|
||||
#!/usr/bin/env node
|
||||
/* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
|
||||
/* vim: set ts=2 ft=javascript: */
|
||||
|
||||
var X;
|
||||
try { X = require('../'); } catch(e) { X = require('crc-32'); }
|
||||
var fs = require('fs');
|
||||
require('exit-on-epipe');
|
||||
|
||||
var args = process.argv.slice(2);
|
||||
|
||||
var filename;
|
||||
if(args[0]) filename = args[0];
|
||||
|
||||
if(!process.stdin.isTTY) filename = filename || "-";
|
||||
|
||||
if(!filename) {
|
||||
console.error("crc32: must specify a filename ('-' for stdin)");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if(filename === "-h" || filename === "--help") {
|
||||
console.log("usage: " + process.argv[0] + " [filename]");
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
if(filename !== "-" && !fs.existsSync(filename)) {
|
||||
console.error("crc32: " + filename + ": No such file or directory");
|
||||
process.exit(2);
|
||||
}
|
||||
|
||||
if(filename === "-") process.stdin.pipe(require('concat-stream')(process_data));
|
||||
else process_data(fs.readFileSync(filename));
|
||||
|
||||
function process_data(data) {
|
||||
console.log(X.buf(data));
|
||||
}
|
15
bin/crc32.py
Executable file
15
bin/crc32.py
Executable file
@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env python
|
||||
# crc32.py -- calculate crc32 checksum of data
|
||||
# Copyright (C) 2016-present SheetJS
|
||||
from zlib import crc32
|
||||
from sys import argv, stdin
|
||||
|
||||
args=argv[1:]
|
||||
payload=""
|
||||
if len(args) == 0 or args[0] == "-":
|
||||
payload = stdin.read()
|
||||
else:
|
||||
payload = open(args[0],"rb").read()
|
||||
|
||||
# NOTE: python 2 returns a signed value; python3 is unsigned
|
||||
print crc32(payload)
|
@ -1,9 +1,11 @@
|
||||
/* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
|
||||
/* vim: set ts=2: */
|
||||
/*exported CRC32 */
|
||||
var CRC32;
|
||||
/*:: declare var DO_NOT_EXPORT_CRC: any; */
|
||||
/*:: declare var define: any; */
|
||||
(function (factory) {
|
||||
/*jshint ignore:start */
|
||||
if(typeof DO_NOT_EXPORT_CRC === 'undefined') {
|
||||
if('object' === typeof exports) {
|
||||
factory(exports);
|
||||
@ -19,4 +21,5 @@ var CRC32;
|
||||
} else {
|
||||
factory(CRC32 = {});
|
||||
}
|
||||
/*jshint ignore:end */
|
||||
}(function(CRC32) {
|
||||
|
@ -1 +1 @@
|
||||
CRC32.version = '0.4.0';
|
||||
CRC32.version = '0.4.1';
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* see perf/crc32table.js */
|
||||
/*global Int32Array */
|
||||
function signed_crc_table()/*:CRC32TableType*/ {
|
||||
var c = 0, table/*:Array<number>*/ = new Array(256);
|
||||
|
||||
@ -18,4 +19,4 @@ function signed_crc_table()/*:CRC32TableType*/ {
|
||||
return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;
|
||||
}
|
||||
|
||||
var table = signed_crc_table();
|
||||
var T = signed_crc_table();
|
||||
|
@ -1,63 +1,67 @@
|
||||
/* charCodeAt is the best approach for binary strings */
|
||||
/*# charCodeAt is the best approach for binary strings */
|
||||
/*global Buffer */
|
||||
var use_buffer = typeof Buffer !== 'undefined';
|
||||
function crc32_bstr(bstr/*:string*/)/*:CRC32Type*/ {
|
||||
if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr));
|
||||
var crc = -1, L = bstr.length - 1;
|
||||
var C = -1, L = bstr.length - 1;
|
||||
for(var i = 0; i < L;) {
|
||||
crc = table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);
|
||||
crc = table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);
|
||||
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
|
||||
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
|
||||
}
|
||||
if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF];
|
||||
return crc ^ -1;
|
||||
if(i === L) C = (C>>>8) ^ T[(C ^ bstr.charCodeAt(i))&0xFF];
|
||||
return C ^ -1;
|
||||
}
|
||||
|
||||
function crc32_buf(buf/*:ABuf*/)/*:CRC32Type*/ {
|
||||
if(buf.length > 10000) return crc32_buf_8(buf);
|
||||
for(var crc = -1, i = 0, L=buf.length-3; i < L;) {
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
var C = -1, L = buf.length - 3;
|
||||
for(var i = 0; i < L;) {
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
}
|
||||
while(i < L+3) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
return crc ^ -1;
|
||||
while(i < L+3) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
return C ^ -1;
|
||||
}
|
||||
|
||||
function crc32_buf_8(buf/*:ABuf*/)/*:CRC32Type*/ {
|
||||
for(var crc = -1, i = 0, L=buf.length-7; i < L;) {
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
var C = -1, L = buf.length - 7;
|
||||
for(var i = 0; i < L;) {
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
}
|
||||
while(i < L+7) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
return crc ^ -1;
|
||||
while(i < L+7) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
return C ^ -1;
|
||||
}
|
||||
|
||||
/* much much faster to intertwine utf8 and crc */
|
||||
/*# much much faster to intertwine utf8 and C */
|
||||
function crc32_str(str/*:string*/)/*:CRC32Type*/ {
|
||||
for(var crc = -1, i = 0, L=str.length, c, d; i < L;) {
|
||||
var C = -1;
|
||||
for(var i = 0, L=str.length, c, d; i < L;) {
|
||||
c = str.charCodeAt(i++);
|
||||
if(c < 0x80) {
|
||||
crc = (crc >>> 8) ^ table[(crc ^ c) & 0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ 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];
|
||||
C = (C>>>8) ^ T[(C ^ (192|((c>>6)&31)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (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)<<4))) & 0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc ^ (128|(d&63))) & 0xFF];
|
||||
c = (c&1023)+64; d = str.charCodeAt(i++)&1023;
|
||||
C = (C>>>8) ^ T[(C ^ (240|((c>>8)&7)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|((c>>2)&63)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (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];
|
||||
C = (C>>>8) ^ T[(C ^ (224|((c>>12)&15)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|((c>>6)&63)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|(c&63)))&0xFF];
|
||||
}
|
||||
}
|
||||
return crc ^ -1;
|
||||
return C ^ -1;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
CRC32.table = table;
|
||||
CRC32.table = T;
|
||||
CRC32.bstr = crc32_bstr;
|
||||
CRC32.buf = crc32_buf;
|
||||
CRC32.str = crc32_str;
|
||||
|
@ -1,9 +1,11 @@
|
||||
/* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
|
||||
/* vim: set ts=2: */
|
||||
/*exported CRC32 */
|
||||
var CRC32;
|
||||
/*:: declare var DO_NOT_EXPORT_CRC: any; */
|
||||
/*:: declare var define: any; */
|
||||
(function (factory) {
|
||||
/*jshint ignore:start */
|
||||
if(typeof DO_NOT_EXPORT_CRC === 'undefined') {
|
||||
if('object' === typeof exports) {
|
||||
factory(exports);
|
||||
@ -19,14 +21,16 @@ var CRC32;
|
||||
} else {
|
||||
factory(CRC32 = {});
|
||||
}
|
||||
/*jshint ignore:end */
|
||||
}(function(CRC32) {
|
||||
CRC32.version = '0.4.0';
|
||||
CRC32.version = '0.4.1';
|
||||
/*::
|
||||
type CRC32Type = number;
|
||||
type ABuf = Array<number> | Buffer;
|
||||
type CRC32TableType = Array<number> | Int32Array;
|
||||
*/
|
||||
/* see perf/crc32table.js */
|
||||
/*global Int32Array */
|
||||
function signed_crc_table()/*:CRC32TableType*/ {
|
||||
var c = 0, table/*:Array<number>*/ = new Array(256);
|
||||
|
||||
@ -46,71 +50,75 @@ function signed_crc_table()/*:CRC32TableType*/ {
|
||||
return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;
|
||||
}
|
||||
|
||||
var table = signed_crc_table();
|
||||
/* charCodeAt is the best approach for binary strings */
|
||||
var T = signed_crc_table();
|
||||
/*# charCodeAt is the best approach for binary strings */
|
||||
/*global Buffer */
|
||||
var use_buffer = typeof Buffer !== 'undefined';
|
||||
function crc32_bstr(bstr/*:string*/)/*:CRC32Type*/ {
|
||||
if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr));
|
||||
var crc = -1, L = bstr.length - 1;
|
||||
var C = -1, L = bstr.length - 1;
|
||||
for(var i = 0; i < L;) {
|
||||
crc = table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);
|
||||
crc = table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);
|
||||
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
|
||||
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
|
||||
}
|
||||
if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF];
|
||||
return crc ^ -1;
|
||||
if(i === L) C = (C>>>8) ^ T[(C ^ bstr.charCodeAt(i))&0xFF];
|
||||
return C ^ -1;
|
||||
}
|
||||
|
||||
function crc32_buf(buf/*:ABuf*/)/*:CRC32Type*/ {
|
||||
if(buf.length > 10000) return crc32_buf_8(buf);
|
||||
for(var crc = -1, i = 0, L=buf.length-3; i < L;) {
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
var C = -1, L = buf.length - 3;
|
||||
for(var i = 0; i < L;) {
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
}
|
||||
while(i < L+3) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
return crc ^ -1;
|
||||
while(i < L+3) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
return C ^ -1;
|
||||
}
|
||||
|
||||
function crc32_buf_8(buf/*:ABuf*/)/*:CRC32Type*/ {
|
||||
for(var crc = -1, i = 0, L=buf.length-7; i < L;) {
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
var C = -1, L = buf.length - 7;
|
||||
for(var i = 0; i < L;) {
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
}
|
||||
while(i < L+7) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
return crc ^ -1;
|
||||
while(i < L+7) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
return C ^ -1;
|
||||
}
|
||||
|
||||
/* much much faster to intertwine utf8 and crc */
|
||||
/*# much much faster to intertwine utf8 and C */
|
||||
function crc32_str(str/*:string*/)/*:CRC32Type*/ {
|
||||
for(var crc = -1, i = 0, L=str.length, c, d; i < L;) {
|
||||
var C = -1;
|
||||
for(var i = 0, L=str.length, c, d; i < L;) {
|
||||
c = str.charCodeAt(i++);
|
||||
if(c < 0x80) {
|
||||
crc = (crc >>> 8) ^ table[(crc ^ c) & 0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ 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];
|
||||
C = (C>>>8) ^ T[(C ^ (192|((c>>6)&31)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (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)<<4))) & 0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc ^ (128|(d&63))) & 0xFF];
|
||||
c = (c&1023)+64; d = str.charCodeAt(i++)&1023;
|
||||
C = (C>>>8) ^ T[(C ^ (240|((c>>8)&7)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|((c>>2)&63)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (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];
|
||||
C = (C>>>8) ^ T[(C ^ (224|((c>>12)&15)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|((c>>6)&63)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|(c&63)))&0xFF];
|
||||
}
|
||||
}
|
||||
return crc ^ -1;
|
||||
return C ^ -1;
|
||||
}
|
||||
CRC32.table = table;
|
||||
CRC32.table = T;
|
||||
CRC32.bstr = crc32_bstr;
|
||||
CRC32.buf = crc32_buf;
|
||||
CRC32.str = crc32_str;
|
||||
|
88
crc32.js
88
crc32.js
@ -1,7 +1,9 @@
|
||||
/* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
|
||||
/* vim: set ts=2: */
|
||||
/*exported CRC32 */
|
||||
var CRC32;
|
||||
(function (factory) {
|
||||
/*jshint ignore:start */
|
||||
if(typeof DO_NOT_EXPORT_CRC === 'undefined') {
|
||||
if('object' === typeof exports) {
|
||||
factory(exports);
|
||||
@ -17,9 +19,11 @@ var CRC32;
|
||||
} else {
|
||||
factory(CRC32 = {});
|
||||
}
|
||||
/*jshint ignore:end */
|
||||
}(function(CRC32) {
|
||||
CRC32.version = '0.4.0';
|
||||
CRC32.version = '0.4.1';
|
||||
/* see perf/crc32table.js */
|
||||
/*global Int32Array */
|
||||
function signed_crc_table() {
|
||||
var c = 0, table = new Array(256);
|
||||
|
||||
@ -39,71 +43,73 @@ function signed_crc_table() {
|
||||
return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;
|
||||
}
|
||||
|
||||
var table = signed_crc_table();
|
||||
/* charCodeAt is the best approach for binary strings */
|
||||
var T = signed_crc_table();
|
||||
/*global Buffer */
|
||||
var use_buffer = typeof Buffer !== 'undefined';
|
||||
function crc32_bstr(bstr) {
|
||||
if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr));
|
||||
var crc = -1, L = bstr.length - 1;
|
||||
var C = -1, L = bstr.length - 1;
|
||||
for(var i = 0; i < L;) {
|
||||
crc = table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);
|
||||
crc = table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);
|
||||
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
|
||||
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
|
||||
}
|
||||
if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF];
|
||||
return crc ^ -1;
|
||||
if(i === L) C = (C>>>8) ^ T[(C ^ bstr.charCodeAt(i))&0xFF];
|
||||
return C ^ -1;
|
||||
}
|
||||
|
||||
function crc32_buf(buf) {
|
||||
if(buf.length > 10000) return crc32_buf_8(buf);
|
||||
for(var crc = -1, i = 0, L=buf.length-3; i < L;) {
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
var C = -1, L = buf.length - 3;
|
||||
for(var i = 0; i < L;) {
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
}
|
||||
while(i < L+3) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
return crc ^ -1;
|
||||
while(i < L+3) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
return C ^ -1;
|
||||
}
|
||||
|
||||
function crc32_buf_8(buf) {
|
||||
for(var crc = -1, i = 0, L=buf.length-7; i < L;) {
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
var C = -1, L = buf.length - 7;
|
||||
for(var i = 0; i < L;) {
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
}
|
||||
while(i < L+7) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
return crc ^ -1;
|
||||
while(i < L+7) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
return C ^ -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;) {
|
||||
var C = -1;
|
||||
for(var i = 0, L=str.length, c, d; i < L;) {
|
||||
c = str.charCodeAt(i++);
|
||||
if(c < 0x80) {
|
||||
crc = (crc >>> 8) ^ table[(crc ^ c) & 0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ 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];
|
||||
C = (C>>>8) ^ T[(C ^ (192|((c>>6)&31)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (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)<<4))) & 0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc ^ (128|(d&63))) & 0xFF];
|
||||
c = (c&1023)+64; d = str.charCodeAt(i++)&1023;
|
||||
C = (C>>>8) ^ T[(C ^ (240|((c>>8)&7)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|((c>>2)&63)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (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];
|
||||
C = (C>>>8) ^ T[(C ^ (224|((c>>12)&15)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|((c>>6)&63)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|(c&63)))&0xFF];
|
||||
}
|
||||
}
|
||||
return crc ^ -1;
|
||||
return C ^ -1;
|
||||
}
|
||||
CRC32.table = table;
|
||||
CRC32.table = T;
|
||||
CRC32.bstr = crc32_bstr;
|
||||
CRC32.buf = crc32_buf;
|
||||
CRC32.str = crc32_str;
|
||||
|
@ -1,7 +1,9 @@
|
||||
/* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
|
||||
/* vim: set ts=2: */
|
||||
/*exported CRC32 */
|
||||
var CRC32;
|
||||
(function (factory) {
|
||||
/*jshint ignore:start */
|
||||
if(typeof DO_NOT_EXPORT_CRC === 'undefined') {
|
||||
if('object' === typeof exports) {
|
||||
factory(exports);
|
||||
@ -17,9 +19,11 @@ var CRC32;
|
||||
} else {
|
||||
factory(CRC32 = {});
|
||||
}
|
||||
/*jshint ignore:end */
|
||||
}(function(CRC32) {
|
||||
CRC32.version = '0.4.0';
|
||||
CRC32.version = '0.4.1';
|
||||
/* see perf/crc32table.js */
|
||||
/*global Int32Array */
|
||||
function signed_crc_table() {
|
||||
var c = 0, table = new Array(256);
|
||||
|
||||
@ -39,71 +43,73 @@ function signed_crc_table() {
|
||||
return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;
|
||||
}
|
||||
|
||||
var table = signed_crc_table();
|
||||
/* charCodeAt is the best approach for binary strings */
|
||||
var T = signed_crc_table();
|
||||
/*global Buffer */
|
||||
var use_buffer = typeof Buffer !== 'undefined';
|
||||
function crc32_bstr(bstr) {
|
||||
if(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr));
|
||||
var crc = -1, L = bstr.length - 1;
|
||||
var C = -1, L = bstr.length - 1;
|
||||
for(var i = 0; i < L;) {
|
||||
crc = table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);
|
||||
crc = table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);
|
||||
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
|
||||
C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
|
||||
}
|
||||
if(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF];
|
||||
return crc ^ -1;
|
||||
if(i === L) C = (C>>>8) ^ T[(C ^ bstr.charCodeAt(i))&0xFF];
|
||||
return C ^ -1;
|
||||
}
|
||||
|
||||
function crc32_buf(buf) {
|
||||
if(buf.length > 10000) return crc32_buf_8(buf);
|
||||
for(var crc = -1, i = 0, L=buf.length-3; i < L;) {
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
var C = -1, L = buf.length - 3;
|
||||
for(var i = 0; i < L;) {
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
}
|
||||
while(i < L+3) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
return crc ^ -1;
|
||||
while(i < L+3) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
return C ^ -1;
|
||||
}
|
||||
|
||||
function crc32_buf_8(buf) {
|
||||
for(var crc = -1, i = 0, L=buf.length-7; i < L;) {
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
var C = -1, L = buf.length - 7;
|
||||
for(var i = 0; i < L;) {
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
}
|
||||
while(i < L+7) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];
|
||||
return crc ^ -1;
|
||||
while(i < L+7) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
|
||||
return C ^ -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;) {
|
||||
var C = -1;
|
||||
for(var i = 0, L=str.length, c, d; i < L;) {
|
||||
c = str.charCodeAt(i++);
|
||||
if(c < 0x80) {
|
||||
crc = (crc >>> 8) ^ table[(crc ^ c) & 0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ 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];
|
||||
C = (C>>>8) ^ T[(C ^ (192|((c>>6)&31)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (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)<<4))) & 0xFF];
|
||||
crc = (crc >>> 8) ^ table[(crc ^ (128|(d&63))) & 0xFF];
|
||||
c = (c&1023)+64; d = str.charCodeAt(i++)&1023;
|
||||
C = (C>>>8) ^ T[(C ^ (240|((c>>8)&7)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|((c>>2)&63)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (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];
|
||||
C = (C>>>8) ^ T[(C ^ (224|((c>>12)&15)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|((c>>6)&63)))&0xFF];
|
||||
C = (C>>>8) ^ T[(C ^ (128|(c&63)))&0xFF];
|
||||
}
|
||||
}
|
||||
return crc ^ -1;
|
||||
return C ^ -1;
|
||||
}
|
||||
CRC32.table = table;
|
||||
CRC32.table = T;
|
||||
CRC32.bstr = crc32_bstr;
|
||||
CRC32.buf = crc32_buf;
|
||||
CRC32.str = crc32_str;
|
||||
|
@ -1,13 +1,27 @@
|
||||
var o = "foo bar baz٪☃🍣";
|
||||
var m = "foobar"; for(var i = 0; i != 11; ++i) m+=m;
|
||||
var bits = [
|
||||
[ "foobar", -1628037227, 1 ],
|
||||
[ "foo bar baz", -228401567, 1 ],
|
||||
[ "foo bar baz٪", 984445192 ],
|
||||
[ "foo bar baz٪☃", 140429620],
|
||||
[ "foo bar baz٪☃🍣", 1531648243],
|
||||
[ m, 40270464, 1 ]
|
||||
[ m, 40270464, 1 ],
|
||||
[ o, 1531648243],
|
||||
[ o+o, -218791105 ],
|
||||
[ o+o+o, 1834240887 ]
|
||||
];
|
||||
if(typeof module !== "undefined") module.exports = bits;
|
||||
/*::
|
||||
type ArrayLike = any;
|
||||
type Stringifier = {(d:ArrayLike):string};
|
||||
|
||||
declare class CRC32Module {
|
||||
table:CRC32TableType;
|
||||
bstr(s:string):CRC32Type;
|
||||
buf(b:ABuf):CRC32Type;
|
||||
str(s:string):CRC32Type;
|
||||
};
|
||||
*/
|
||||
/* vim: set ts=2: */
|
||||
if(typeof require !== 'undefined') {
|
||||
var js_crc32 = require('../');
|
||||
|
@ -8,45 +8,59 @@ if(typeof require !== 'undefined') {
|
||||
fs = require("fs");
|
||||
} else { X = CRC32; }
|
||||
|
||||
function readlines(f) { return fs.readFileSync(f, "ascii").split("\n").filter(function(f) { return !!f; }); }
|
||||
function readlines(f) { return fs.readFileSync(f, "ascii").split("\n"); }
|
||||
|
||||
describe('crc32 table', function() {
|
||||
it('should match fixed table', function() {
|
||||
var badness = 0;
|
||||
var overflow = 0;
|
||||
for(var i = 0; i != crc32table.length; ++i) {
|
||||
assert.equal(crc32table[i]|0, X.table[i]);
|
||||
if(crc32table[i] !== X.table[i]) ++badness;
|
||||
if(crc32table[i] !== X.table[i]) ++overflow;
|
||||
}
|
||||
assert.equal(badness, 128);
|
||||
assert.equal(overflow, 128);
|
||||
});
|
||||
});
|
||||
|
||||
describe('crc32 bits', function() {
|
||||
bits.forEach(function(i) {
|
||||
var l = i[0].length;
|
||||
var msg = i[0];
|
||||
var msg = i[0], l = i[0].length, L = i[1]|0;
|
||||
if(l > 20) msg = 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);
|
||||
if(i[2] === 1) assert.equal(X.bstr(i[0]), L);
|
||||
assert.equal(X.str(i[0]), i[1]|0);
|
||||
if(typeof Buffer !== 'undefined') assert.equal(X.buf(new Buffer(i[0])), i[1]|0);
|
||||
if(typeof Buffer !== 'undefined') assert.equal(X.buf(new Buffer(i[0])), L);
|
||||
});
|
||||
});
|
||||
});
|
||||
if(typeof require !== 'undefined') describe("unicode", function() {
|
||||
if(!fs.existsSync("./test_files/uccat.txt")) return;;
|
||||
if(!fs.existsSync("./test_files/uccat.txt")) return;
|
||||
var uccat = readlines("./test_files/uccat.txt");
|
||||
uccat.forEach(function(cat) {
|
||||
it("Category " + cat, function() {
|
||||
if(!fs.existsSync("./test_files/baseline." + cat + ".txt")) return;
|
||||
var corpus = readlines("./test_files/baseline." + cat + ".txt");
|
||||
var uctable = require("./test_files/uctable." + cat + ".js");
|
||||
uctable.forEach(function(c, i) {
|
||||
for(var ucidx = 0; ucidx < uctable.length; ++ucidx) {
|
||||
var c = uctable[ucidx];
|
||||
/* since the baselines are passed via utf8, discard invalid codes */
|
||||
if(c.charCodeAt(0) >= 0xD800 && c.charCodeAt(0) < 0xE000) return;
|
||||
var cc = corpus[i], dd = X.str(c);
|
||||
assert.equal(dd, cc, ":" + i + ":" + c + ":" + cc + ":" + dd);
|
||||
});
|
||||
if(c.charCodeAt(0) >= 0xD800 && c.charCodeAt(0) < 0xE000) continue;
|
||||
var cc = corpus[ucidx], dd = X.str(c);
|
||||
assert.equal(dd, cc, ":" + ucidx + ":" + c + ":" + cc + ":" + dd);
|
||||
var ee = X.buf(new Buffer(c, "utf8"));
|
||||
assert.equal(ee, cc, ":" + ucidx + ":" + c + ":" + cc + ":" + ee);
|
||||
if(typeof Buffer !== 'undefined') {
|
||||
var ff = X.bstr(String.fromCharCode.apply(null, new Buffer(c, "utf8")));
|
||||
assert.equal(ff, cc, ":" + ucidx + ":" + c + ":" + cc + ":" + ff);
|
||||
}
|
||||
};
|
||||
});
|
||||
});
|
||||
});
|
||||
if(typeof require !== 'undefined') describe("corpora", function() {
|
||||
require("./test_files/corpus.json").forEach(function(text) {
|
||||
if(!fs.existsSync(text[1])) return;
|
||||
it("should match '" + text[0] + "' (" + text[2] + ")", function() {
|
||||
assert.equal(text[2], X.buf(fs.readFileSync(text[1])));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
117
demo/browser.flow.js
Normal file
117
demo/browser.flow.js
Normal file
@ -0,0 +1,117 @@
|
||||
/*jshint browser:true */
|
||||
/*global CRC32, console */
|
||||
/*:: declare var CRC32: CRC32Module; */
|
||||
var X = CRC32;
|
||||
|
||||
function console_log() { if(typeof console !== 'undefined') console.log.apply(console, [].slice.call(arguments)); }
|
||||
|
||||
function lpad(s/*:string*/, len/*:number*/, chr/*:?string*/)/*:string*/{
|
||||
var L/*:number*/ = len - s.length, C/*:string*/ = chr || " ";
|
||||
if(L <= 0) return s;
|
||||
return new Array(L+1).join(C) + s;
|
||||
}
|
||||
|
||||
function is_defined(val/*:any*/, keys/*:Array<string>*/)/*:boolean*/ {
|
||||
if(typeof val === "undefined") return false;
|
||||
return keys.length === 0 || is_defined(val[keys[0]], keys.slice(1));
|
||||
}
|
||||
|
||||
/*# buffer to string; IE String.fromCharCode.apply limit, manual chunk */
|
||||
function make_chunk_buf_to_str(BType/*:function*/)/*:Stringifier*/ {
|
||||
return function(data/*:any*/)/*:string*/ {
|
||||
var o = "", l = 0, w = 10240, L = data.byteLength/w;
|
||||
for(; l<L; ++l) o+=String.fromCharCode.apply(null, ((new BType(data.slice(l*w,l*w+w)))/*:any*/));
|
||||
o+=String.fromCharCode.apply(null, ((new BType(data.slice(l*w)))/*:any*/));
|
||||
return o;
|
||||
};
|
||||
}
|
||||
/*# buffer to binary string */
|
||||
var bstrify/*:Stringifier*/ = make_chunk_buf_to_str(Uint8Array);
|
||||
|
||||
/*# readAsBinaryString support */
|
||||
var rABS/*:boolean*/ = is_defined(FileReader, ['prototype', 'readAsBinaryString']);
|
||||
var userABS/*:HTMLInputElement*/ = (document.getElementsByName("userabs")[0]/*:any*/);
|
||||
if(!rABS) {
|
||||
userABS.disabled = true;
|
||||
userABS.checked = false;
|
||||
}
|
||||
|
||||
/*## Process Result */
|
||||
/*:: declare class HTMLPreElement extends HTMLElement { innerText:string; } */
|
||||
function process_value(val/*:CRC32Type*/) {
|
||||
var output = [];
|
||||
output[0] = "Signed : " + val;
|
||||
output[1] = "Unsigned : " + (val>>>0);
|
||||
output[2] = "Hex value : " + lpad((val>>>0).toString(16),8,'0');
|
||||
|
||||
var out/*:HTMLPreElement*/ = (document.getElementById('out')/*:any*/);
|
||||
var o = output.join("\n");
|
||||
if(typeof out.innerText == "undefined") out.textContent = o;
|
||||
else out.innerText = o;
|
||||
console_log("output", new Date());
|
||||
}
|
||||
|
||||
/*## Raw Text */
|
||||
var dotxt/*:HTMLInputElement*/ = (document.getElementById('dotext')/*:any*/);
|
||||
dotxt.onclick = function() {
|
||||
var txt/*:HTMLTextAreaElement*/=(document.getElementById('rawdata')/*:any*/);
|
||||
console_log("onload", new Date());
|
||||
var wb/*:CRC32Type*/ = X.str(txt.value);
|
||||
process_value(wb);
|
||||
};
|
||||
|
||||
/*# HTML5 */
|
||||
|
||||
var readcb = function(e/*:Event*/) {
|
||||
console_log("onload", new Date(), rABS, false);
|
||||
var target/*:FileReader*/ = (e.target/*:any*/);
|
||||
var data = target.result;
|
||||
var val/*:CRC32Type*/ = rABS ? X.bstr(data) : X.str(bstrify(data));
|
||||
process_value(val);
|
||||
};
|
||||
|
||||
/*## File Input */
|
||||
var handle_file = function(e/*:Event*/) {
|
||||
rABS = userABS.checked;
|
||||
var otarget/*:HTMLInputElement*/ = (e.target/*:any*/);
|
||||
var files/*:FileList*/ = otarget.files;
|
||||
var f/*:File*/ = files[0];
|
||||
|
||||
var reader/*:FileReader*/ = new FileReader();
|
||||
reader.onload = readcb;
|
||||
|
||||
if(rABS) (reader/*:any*/).readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||
};
|
||||
|
||||
var xlf/*:HTMLInputElement*/ = (document.getElementById('xlf')/*:any*/);
|
||||
if(xlf.addEventListener) xlf.addEventListener('change', handle_file, false);
|
||||
|
||||
/*## Drag and Drop File */
|
||||
var handle_drop/*:EventHandler*/ = (function(e/*:DragEvent*/) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
rABS = userABS.checked;
|
||||
if(!e.dataTransfer) return;
|
||||
var files/*:FileList*/ = e.dataTransfer.files;
|
||||
var f/*:File*/ = files[0];
|
||||
|
||||
var reader/*:FileReader*/ = new FileReader();
|
||||
reader.onload = readcb;
|
||||
|
||||
if(rABS) (reader/*:any*/).readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||
}/*:any*/);
|
||||
|
||||
var handle_drag/*:EventHandler*/ = (function (e/*:DragEvent*/) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
if(e.dataTransfer) e.dataTransfer.dropEffect = 'copy';
|
||||
}/*:any*/);
|
||||
|
||||
var drop/*:HTMLDivElement*/ = (document.getElementById('drop')/*:any*/);
|
||||
if(drop.addEventListener) {
|
||||
drop.addEventListener('dragenter', handle_drag, false);
|
||||
drop.addEventListener('dragover', handle_drag, false);
|
||||
drop.addEventListener('drop', handle_drop, false);
|
||||
}
|
106
demo/browser.js
Normal file
106
demo/browser.js
Normal file
@ -0,0 +1,106 @@
|
||||
/*jshint browser:true */
|
||||
/*global CRC32, console */
|
||||
var X = CRC32;
|
||||
|
||||
function console_log() { if(typeof console !== 'undefined') console.log.apply(console, [].slice.call(arguments)); }
|
||||
|
||||
function lpad(s, len, chr){
|
||||
var L = len - s.length, C = chr || " ";
|
||||
if(L <= 0) return s;
|
||||
return new Array(L+1).join(C) + s;
|
||||
}
|
||||
|
||||
function is_defined(val, keys) {
|
||||
if(typeof val === "undefined") return false;
|
||||
return keys.length === 0 || is_defined(val[keys[0]], keys.slice(1));
|
||||
}
|
||||
|
||||
function make_chunk_buf_to_str(BType) {
|
||||
return function(data) {
|
||||
var o = "", l = 0, w = 10240, L = data.byteLength/w;
|
||||
for(; l<L; ++l) o+=String.fromCharCode.apply(null, ((new BType(data.slice(l*w,l*w+w)))));
|
||||
o+=String.fromCharCode.apply(null, ((new BType(data.slice(l*w)))));
|
||||
return o;
|
||||
};
|
||||
}
|
||||
var bstrify = make_chunk_buf_to_str(Uint8Array);
|
||||
|
||||
var rABS = is_defined(FileReader, ['prototype', 'readAsBinaryString']);
|
||||
var userABS = (document.getElementsByName("userabs")[0]);
|
||||
if(!rABS) {
|
||||
userABS.disabled = true;
|
||||
userABS.checked = false;
|
||||
}
|
||||
|
||||
function process_value(val) {
|
||||
var output = [];
|
||||
output[0] = "Signed : " + val;
|
||||
output[1] = "Unsigned : " + (val>>>0);
|
||||
output[2] = "Hex value : " + lpad((val>>>0).toString(16),8,'0');
|
||||
|
||||
var out = (document.getElementById('out'));
|
||||
var o = output.join("\n");
|
||||
if(typeof out.innerText == "undefined") out.textContent = o;
|
||||
else out.innerText = o;
|
||||
console_log("output", new Date());
|
||||
}
|
||||
|
||||
var dotxt = (document.getElementById('dotext'));
|
||||
dotxt.onclick = function() {
|
||||
var txt=(document.getElementById('rawdata'));
|
||||
console_log("onload", new Date());
|
||||
var wb = X.str(txt.value);
|
||||
process_value(wb);
|
||||
};
|
||||
|
||||
var readcb = function(e) {
|
||||
console_log("onload", new Date(), rABS, false);
|
||||
var target = (e.target);
|
||||
var data = target.result;
|
||||
var val = rABS ? X.bstr(data) : X.str(bstrify(data));
|
||||
process_value(val);
|
||||
};
|
||||
|
||||
var handle_file = function(e) {
|
||||
rABS = userABS.checked;
|
||||
var otarget = (e.target);
|
||||
var files = otarget.files;
|
||||
var f = files[0];
|
||||
|
||||
var reader = new FileReader();
|
||||
reader.onload = readcb;
|
||||
|
||||
if(rABS) (reader).readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||
};
|
||||
|
||||
var xlf = (document.getElementById('xlf'));
|
||||
if(xlf.addEventListener) xlf.addEventListener('change', handle_file, false);
|
||||
|
||||
var handle_drop = (function(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
rABS = userABS.checked;
|
||||
if(!e.dataTransfer) return;
|
||||
var files = e.dataTransfer.files;
|
||||
var f = files[0];
|
||||
|
||||
var reader = new FileReader();
|
||||
reader.onload = readcb;
|
||||
|
||||
if(rABS) (reader).readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||