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);
|
||||
});
|
||||
|
||||
var handle_drag = (function (e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
if(e.dataTransfer) e.dataTransfer.dropEffect = 'copy';
|
||||
});
|
||||
|
||||
var drop = (document.getElementById('drop'));
|
||||
if(drop.addEventListener) {
|
||||
drop.addEventListener('dragenter', handle_drag, false);
|
||||
drop.addEventListener('dragover', handle_drag, false);
|
||||
drop.addEventListener('drop', handle_drop, false);
|
||||
}
|
51
index.html
Normal file
51
index.html
Normal file
@ -0,0 +1,51 @@
|
||||
<!DOCTYPE html>
|
||||
<!-- crc32.js (C) 2014-present SheetJS http://sheetjs.com -->
|
||||
<!-- vim: set ts=2: -->
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>JS-CRC32 Live Demo</title>
|
||||
<style>
|
||||
#drop{
|
||||
border:2px dashed #bbb;
|
||||
-moz-border-radius:5px;
|
||||
-webkit-border-radius:5px;
|
||||
border-radius:5px;
|
||||
padding:25px;
|
||||
text-align:center;
|
||||
font:20pt bold,"Vollkorn";color:#bbb
|
||||
}
|
||||
#rawdata{
|
||||
width:100%;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<b>JS-CRC32 Live Demo</b><br />
|
||||
<a href="https://git.io/crc32">Source Code Repo</a><br />
|
||||
<a href="https://git.io/crc32_issues">Issues? Something look weird? Click here and report an issue</a><br />
|
||||
|
||||
<div id="drop">Drop a text file to compute the CRC-32 checksum</div>
|
||||
<p><input type="file" name="xlfile" id="xlf" /> ... or click here to select a file</p>
|
||||
<textarea id="rawdata">... or paste text here ......</textarea>
|
||||
<input type="button" id="dotext" value="Click here to process the text"/><br />
|
||||
Advanced Demo Options: <br />
|
||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked><br />
|
||||
<pre id="out">.</pre>
|
||||
<br />
|
||||
<script type="text/javascript">/* jshint browser: true */</script>
|
||||
<script src="crc32.js"></script>
|
||||
<script src="demo/browser.flow.js"></script>
|
||||
<script type="text/javascript">
|
||||
var _gaq = _gaq || [];
|
||||
_gaq.push(['_setAccount', 'UA-36810333-1']);
|
||||
_gaq.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
||||
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -1,10 +1,13 @@
|
||||
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;
|
||||
|
11
misc/flow.js
Normal file
11
misc/flow.js
Normal file
@ -0,0 +1,11 @@
|
||||
/*::
|
||||
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;
|
||||
};
|
||||
*/
|
42
misc/help.sh
Executable file
42
misc/help.sh
Executable file
@ -0,0 +1,42 @@
|
||||
#!/bin/bash
|
||||
# make_help.sh -- process listing of targets and special items in Makefile
|
||||
# Copyright (C) 2016-present SheetJS
|
||||
#
|
||||
# usage in makefile: pipe the output of the following command:
|
||||
# @grep -hE '(^[a-zA-Z_-][ a-zA-Z_-]*:.*?|^#[#*])' $(MAKEFILE_LIST)
|
||||
#
|
||||
# lines starting with "## " are treated as subtitles
|
||||
# lines starting with "#* " are treated as plaintext comments
|
||||
# multiple targets with "## " after the ":" are rendered as separate targets
|
||||
# if the presumed default target is labeled, it will be assigned a unique color
|
||||
|
||||
awk '
|
||||
BEGIN{recipes=0;}
|
||||
!/#[#*] .*$/ {next;}
|
||||
{multi=0; isrecipe=0;}
|
||||
/^[^#]*:/ {isrecipe=1; ++recipes;}
|
||||
/^[^ :]* .*:/ {multi=1}
|
||||
multi==0 && isrecipe>0 { if(recipes > 1) print; else print $0, "[default]"; next}
|
||||
isrecipe == 0 {print; next}
|
||||
multi>0 {
|
||||
k=split($0, msg, "##"); m=split($0, a, ":"); n=split(a[1], b, " ");
|
||||
for(i=1; i<=n; ++i) print b[i] ":", "##" msg[2], (recipes==1 && i==1 ? "[default]" : "")
|
||||
}
|
||||
END {}
|
||||
' | if [[ -t 1 ]]; then
|
||||
awk '
|
||||
BEGIN {FS = ":.*?## "}
|
||||
{color=36}
|
||||
/\[default\]/ {color=35}
|
||||
NF==1 && /^##/ {color=34}
|
||||
NF==1 && /^#\*/ {color=20; $1 = substr($1, 4)}
|
||||
{printf "\033[" color "m%-20s\033[0m %s\n", $1, $2;}
|
||||
END{}' -
|
||||
else
|
||||
awk '
|
||||
BEGIN {FS = ":.*?## "}
|
||||
/^#\* / {$1 = substr($1, 4)}
|
||||
{printf "%-20s %s\n", $1, $2;}
|
||||
END{}' -
|
||||
fi
|
||||
|
@ -5,35 +5,44 @@ OUTD=../test_files
|
||||
CATURL=https://mathias.html5.org/data/unicode/8.0.0/categories/
|
||||
CATF=$OUTD/uccat.txt
|
||||
|
||||
ECHORED() { echo -ne '\x1B[0;31m'; echo -n $1; echo -ne '\x1B[0m'; echo; }
|
||||
ECHORED() { echo -ne '\x1B[0;31m'; echo -n "$1"; echo -ne '\x1B[0m'; echo; }
|
||||
|
||||
if [[ "$1" == "clean" ]]; then
|
||||
if [ ! -d test_files ]; then cd ..; fi
|
||||
if [ -d test_files ]; then cd test_files; fi
|
||||
rm -f uccat.txt baseline.*.txt uctable.*.js uctable_*.py
|
||||
exit
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2164
|
||||
if [ -d misc ]; then cd misc; fi
|
||||
mkdir -p $OUTD
|
||||
if [ ! -e $CATF ]; then curl "$CATURL" | grep "code-points" | sed 's/.*="//g;s/-.*//g' > $CATF; fi
|
||||
|
||||
while read line; do
|
||||
while read -r line; do
|
||||
JSF=uctable.${line}.js
|
||||
PYF=uctable_${line}.py
|
||||
BLF=baseline.${line}.txt
|
||||
JSURL="https://mathias.html5.org/data/unicode/format?version=8.0.0&category=${line}&type=symbols&prepend=var+unicode%20%3D%20&append=%3Bif(typeof%20module%20!%3D%3D%20'undefined')%20module.exports%20%3D%20unicode%3B"
|
||||
if [[ ! -e $OUTD/$JSF || ! -e $OUTD/$PYF || ! -e $OUTD/$BLF ]]; then
|
||||
ECHORED "Processing ${line}"
|
||||
if [ ! -e $JSF ]; then
|
||||
rm -f $PYF $BLF ${PYF}c
|
||||
for i in $JSF $PYF $BLF; do if [[ ! -e $i && -e $OUTD/$i ]]; then mv $OUTD/"$i" .; fi done
|
||||
if [ ! -e "$JSF" ]; then
|
||||
rm -f "$PYF" "$BLF" "${PYF}c"
|
||||
echo "Downloading JS"
|
||||
</dev/null curl -o $JSF "$JSURL"
|
||||
</dev/null curl -o "$JSF" "$JSURL"
|
||||
fi
|
||||
if [ ! -e $PYF ]; then
|
||||
if [ ! -e "$PYF" ]; then
|
||||
echo "Building Python script"
|
||||
rm -f $BLF ${PYF}c
|
||||
</dev/null node make_unicode_crc.njs ${line} | sed 's/\[ \[/uctable = \[ \[/' > $PYF
|
||||
rm -f "$BLF" "${PYF}c"
|
||||
</dev/null node make_unicode.njs "${line}" | sed 's/\[ \[/uctable = \[ \[/' > "$PYF"
|
||||
fi
|
||||
if [ ! -e $BLF ]; then
|
||||
if [ ! -e "$BLF" ]; then
|
||||
echo "Building Baseline text"
|
||||
python make_unicode_crc.py ${line} > baseline.${line}.txt
|
||||
python make_unicode_crc.py "${line}" > "baseline.${line}.txt"
|
||||
fi
|
||||
for i in $JSF $PYF $BLF; do if [ -e $i ]; then mv $i $OUTD/; fi; done
|
||||
rm -f uctable_${line}.pyc
|
||||
for i in $JSF $PYF $BLF; do if [ -e "$i" ]; then mv "$i" $OUTD/; fi; done
|
||||
rm -f "uctable_${line}.pyc"
|
||||
fi
|
||||
done < $CATF
|
||||
|
||||
|
14
misc/make_unicode.njs
Normal file
14
misc/make_unicode.njs
Normal file
@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env node
|
||||
/* make_unicode.njs -- generate baselines for tests
|
||||
* Copyright (C) 2016-present SheetJS
|
||||
* vim: set ft=javascript: */
|
||||
|
||||
var argv = process.argv.slice(2);
|
||||
var enc = require('codepage').utils.encode;
|
||||
function arr(x) { return [].slice.call(enc(65001, x)); }
|
||||
var o = require('./uctable.' + argv[0]).map(arr);
|
||||
|
||||
/* node 6 changed default behavior for arrays */
|
||||
if(+process.version.replace(/v(\d)+\..*/,"$1") >= 6) o = require("util").inspect(o, {maxArrayLength: null});
|
||||
|
||||
console.log(o);
|
@ -1,5 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
argv = process.argv.slice(2);
|
||||
var enc = require('codepage').utils.encode;
|
||||
function arr(x) { return [].slice.call(enc(65001, x)); }
|
||||
console.log(require('./uctable.' + argv[0]).map(arr));
|
13
package.json
13
package.json
@ -1,14 +1,20 @@
|
||||
{
|
||||
"name": "crc-32",
|
||||
"version": "0.4.0",
|
||||
"version": "0.4.1",
|
||||
"author": "sheetjs",
|
||||
"description": "Pure-JS CRC-32",
|
||||
"keywords": [ "crc32", "checksum", "crc" ],
|
||||
"bin": {
|
||||
"crc32": "./bin/crc32.njs"
|
||||
},
|
||||
"main": "./crc32",
|
||||
"dependencies": {
|
||||
"concat-stream":"",
|
||||
"exit-on-epipe":""
|
||||
},
|
||||
"devDependencies": {
|
||||
"codepage":"",
|
||||
"mocha":"",
|
||||
"uglify-js":""
|
||||
"codepage":""
|
||||
},
|
||||
"repository": { "type":"git", "url":"git://github.com/SheetJS/js-crc32.git" },
|
||||
"scripts": {
|
||||
@ -20,6 +26,7 @@
|
||||
"pattern": "crc32.js"
|
||||
}
|
||||
},
|
||||
"files": ["crc32.js", "bin/crc32.njs", "LICENSE", "README.md"],
|
||||
"bugs": { "url": "https://github.com/SheetJS/js-crc32/issues" },
|
||||
"license": "Apache-2.0",
|
||||
"engines": { "node": ">=0.8" }
|
||||
|
10
perf/bm.js
10
perf/bm.js
@ -4,7 +4,11 @@ var c = require('ansi')(process.stdout);
|
||||
|
||||
function test_end(e) { c.horizontalAbsolute(0).write("✓ "+e.target); c.write('\n'); }
|
||||
|
||||
function suite_end() { console.log('Fastest is ' + this.filter('fastest').pluck('name')); }
|
||||
function suite_end() {
|
||||
var o = this.filter('fastest');
|
||||
var m = typeof o.pluck === 'undefined' ? o.map('name') : o.pluck('name');
|
||||
console.log('Fastest is ' + m);
|
||||
}
|
||||
|
||||
function test_cycle(e) { c.horizontalAbsolute(0); c.eraseLine(); c.write("→ "+e.target); }
|
||||
|
||||
@ -25,9 +29,9 @@ BM.prototype.run = function(skip) {
|
||||
|
||||
BM.prototype.add = function(msg, test) {
|
||||
this.suites.push([msg, {
|
||||
onCycle: test_cycle,
|
||||
onCycle: test_cycle,
|
||||
onComplete: test_end,
|
||||
defer: false,
|
||||
defer: false,
|
||||
fn: test
|
||||
}]);
|
||||
this.maxlen = Math.max(this.maxlen, msg.length);
|
||||
|
42
test.js
42
test.js
@ -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])));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
3
test_files/corpus.json
Normal file
3
test_files/corpus.json
Normal file
@ -0,0 +1,3 @@
|
||||
[
|
||||
["UTF-8 Corpus", "./test_files/utf8.corpus", -106649927]
|
||||
]
|
2
test_files/utf8.corpus
Normal file
2
test_files/utf8.corpus
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user