From 029cc9924903b2840878ab751860d8848dd0051f Mon Sep 17 00:00:00 2001 From: SheetJS Date: Thu, 27 Apr 2017 17:29:43 -0400 Subject: [PATCH] version bump 1.0.2: demos and CLI --- .npmignore | 14 ----------- .travis.yml | 4 ++-- README.md | 9 +++++++ bin/crc32.njs | 18 +++++++++----- bits/01_version.js | 2 +- crc32.flow.js | 2 +- crc32.js | 2 +- ctest/crc32.js | 2 +- demo/work.js | 28 ++++++++++++++++++++++ demo/worker.flow.js | 58 +++++++++++++++++++++++++++++++++++++++++++++ index.html | 25 ++++++++++++------- large.html | 49 ++++++++++++++++++++++++++++++++++++++ package.json | 3 +-- 13 files changed, 179 insertions(+), 37 deletions(-) delete mode 100644 .npmignore create mode 100644 demo/work.js create mode 100644 demo/worker.flow.js create mode 100644 large.html diff --git a/.npmignore b/.npmignore deleted file mode 100644 index ab99f52..0000000 --- a/.npmignore +++ /dev/null @@ -1,14 +0,0 @@ -node_modules -misc/ -perf/ -bits/ -ctest/ -test_files/ -test.js -.travis.yml -.jscs.json -.jshintrc -.flowconfig -.npmignore -perf.txt -Makefile diff --git a/.travis.yml b/.travis.yml index ecbe283..87a0966 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,8 +8,8 @@ node_js: - "0.10" - "0.8" before_install: - - "npm install -g npm@next" - - "npm install -g mocha" + - "npm install -g npm@4.3.0" + - "npm install -g mocha@2.x voc" - "npm install codepage" - "npm install blanket" - "npm install coveralls mocha-lcov-reporter" diff --git a/README.md b/README.md index d781d21..1546c71 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,15 @@ $ bin/crc32.py t.txt 1912935186 ``` +On OSX the command `cksum` generates unsigned CRC-32 with Algorithm 3: + +```bash +$ cksum -o 3 < IE8.Win7.For.Windows.VMware.zip +1891069052 4161613172 +$ crc32 --unsigned ~/Downloads/IE8.Win7.For.Windows.VMware.zip +1891069052 +``` + ## Performance `make perf` will run algorithmic performance tests (which should justify certain diff --git a/bin/crc32.njs b/bin/crc32.njs index 41a9ea0..cbee101 100755 --- a/bin/crc32.njs +++ b/bin/crc32.njs @@ -68,11 +68,17 @@ for(var i = 0; i < args.length; ++i) { if(!process.stdin.isTTY) filename = filename || "-"; if(filename.length===0) die("crc32: must specify a filename ('-' for stdin)",1); -function process_data(data/*:Buffer*/) { - var out/*:CRC32Type*/ = X.buf(data, seed); - return console.log(fmt === "" ? out : require("printj").sprintf(fmt, out)); -} +var crc32 = seed; +var writable = require('stream').Writable(); +writable._write = function(chunk, e, cb) { crc32 = X.buf(chunk, crc32); cb(); }; +writable._writev = function(chunks, cb) { + chunks.forEach(function(c) { crc32 = X.buf(c.chunk, crc32);}); + cb(); +}; +writable.on('finish', function() { + console.log(fmt === "" ? crc32 : require("printj").sprintf(fmt, crc32)); +}); -if(filename === "-") process.stdin.pipe(require('concat-stream')(process_data)); -else if(fs.existsSync(filename)) process_data(fs.readFileSync(filename)); +if(filename === "-") process.stdin.pipe(writable); +else if(fs.existsSync(filename)) fs.createReadStream(filename).pipe(writable); else die("crc32: " + filename + ": No such file or directory", 2); diff --git a/bits/01_version.js b/bits/01_version.js index 1d455a5..84b64ad 100644 --- a/bits/01_version.js +++ b/bits/01_version.js @@ -1 +1 @@ -CRC32.version = '1.0.1'; +CRC32.version = '1.0.2'; diff --git a/crc32.flow.js b/crc32.flow.js index 0e61492..9416373 100644 --- a/crc32.flow.js +++ b/crc32.flow.js @@ -23,7 +23,7 @@ var CRC32; } /*jshint ignore:end */ }(function(CRC32) { -CRC32.version = '1.0.1'; +CRC32.version = '1.0.2'; /*:: type CRC32Type = number; type ABuf = Array | Buffer; diff --git a/crc32.js b/crc32.js index d7a0bb3..b8cbd1d 100644 --- a/crc32.js +++ b/crc32.js @@ -21,7 +21,7 @@ var CRC32; } /*jshint ignore:end */ }(function(CRC32) { -CRC32.version = '1.0.1'; +CRC32.version = '1.0.2'; /* see perf/crc32table.js */ /*global Int32Array */ function signed_crc_table() { diff --git a/ctest/crc32.js b/ctest/crc32.js index d7a0bb3..b8cbd1d 100644 --- a/ctest/crc32.js +++ b/ctest/crc32.js @@ -21,7 +21,7 @@ var CRC32; } /*jshint ignore:end */ }(function(CRC32) { -CRC32.version = '1.0.1'; +CRC32.version = '1.0.2'; /* see perf/crc32table.js */ /*global Int32Array */ function signed_crc_table() { diff --git a/demo/work.js b/demo/work.js new file mode 100644 index 0000000..4d1c9b7 --- /dev/null +++ b/demo/work.js @@ -0,0 +1,28 @@ +/* js-crc32 (C) 2014-present SheetJS -- http://sheetjs.com */ +/*:: declare var CRC32: CRC32Module; */ +/*:: declare var self: DedicatedWorkerGlobalScope; */ +importScripts('/crc32.js'); +/*::self.*/postMessage({t:"ready"}); + +var recrc = function(f, crc, l) { + /*::self.*/postMessage({t:"iter", f:f, crc:crc, l:l, sz:f.size}); + if(l >= f.size) return /*::self.*/postMessage({t:"done"}); + var sz = 0x100000; if(l + sz > f.size) sz = f.size - l; + var d = f.slice(l, l + sz); + var r = new FileReader(); + r.onload = function(e) { + var b = new Uint8Array(e.target.result); + var newcrc = CRC32.buf(b, crc); + /*::self.*/postMessage({t:"data", crc:newcrc, bytes:l+sz}); + recrc(f, newcrc, l + sz); + }; + r.readAsArrayBuffer(d); +}; + +onmessage = function (oEvent) { + /*::self.*/postMessage({t:"start"}); + var f/*:File*/ = oEvent.data; + var seed = 0; + recrc(f, seed, 0); +}; + diff --git a/demo/worker.flow.js b/demo/worker.flow.js new file mode 100644 index 0000000..a0884f6 --- /dev/null +++ b/demo/worker.flow.js @@ -0,0 +1,58 @@ +/*jshint browser:true */ + +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*/)/*:boolean*/ { + if(typeof val === "undefined") return false; + return keys.length === 0 || is_defined(val[keys[0]], keys.slice(1)); +} + +/*## Process Result */ +/*:: declare class HTMLPreElement extends HTMLElement { innerText?:string; } */ +function process_value(val/*:CRC32Type*/, progress/*:number*/) { + var output = []; + output[0] = "Progress : %" + lpad(progress.toFixed(2), 6, " "); + output[1] = "Signed : " + val; + output[2] = "Unsigned : " + (val>>>0); + output[3] = "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; +} + +/*# Drag and Drop File */ +var handle_drop/*:EventHandler*/ = (function(e/*:DragEvent*/) { + e.stopPropagation(); + e.preventDefault(); + if(!e.dataTransfer) return; + var files/*:FileList*/ = e.dataTransfer.files; + var f/*:File*/ = files[0]; + + var worker = new Worker("/demo/work.js"); + worker.postMessage(f); + worker.onmessage = function(M) { var m = M.data; switch(m.t) { + case 'ready': break; + case 'start': break; + case 'data': process_value(m.crc, 100 * m.bytes / f.size); break; + case 'done': break; + } }; +}/*: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); +} diff --git a/index.html b/index.html index fbd5138..836ff7a 100644 --- a/index.html +++ b/index.html @@ -1,5 +1,5 @@ - + @@ -18,20 +18,27 @@ #rawdata{ width:100%; } +a { text-decoration: none } -JS-CRC32 Live Demo
-Source Code Repo
-Issues? Something look weird? Click here and report an issue
+
+SheetJS JS-CRC32 Live Demo
+(text works back to IE6; drag and drop works back to IE10)
+(This demo loads the entire file at once!  For newer browsers, try the large file demo)
 
+Source Code Repo
+Issues?  Something look weird?  Click here and report an issue
+
Drop a text file to compute the CRC-32 checksum
-

... or click here to select a file

- + ... or click here to select a file + +
-Advanced Demo Options:
-Use readAsBinaryString: (when available)
-
.
+Advanced Demo Options: +Use readAsBinaryString: (when available) +
+

 
diff --git a/large.html b/large.html new file mode 100644 index 0000000..5c53500 --- /dev/null +++ b/large.html @@ -0,0 +1,49 @@ + + + + + + +JS-CRC32 Live Demo + + + +
+SheetJS JS-CRC32 Live Demo
+(text works back to IE6; drag and drop works back to IE10)
+
+Source Code Repo
+Issues?  Something look weird?  Click here and report an issue
+
+
Drop a text file to compute the CRC-32 checksum
+ +

+
+ + + + + + + diff --git a/package.json b/package.json index 745d2b8..c1fca74 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "crc-32", - "version": "1.0.1", + "version": "1.0.2", "author": "sheetjs", "description": "Pure-JS CRC-32", "keywords": [ "crc32", "checksum", "crc" ], @@ -9,7 +9,6 @@ }, "main": "./crc32", "dependencies": { - "concat-stream":"", "printj":"", "exit-on-epipe":"" },