You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					106 lines
				
				3.8 KiB
			
		
		
			
		
	
	
					106 lines
				
				3.8 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								#!/usr/bin/env node
							 | 
						||
| 
								 | 
							
								/* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
							 | 
						||
| 
								 | 
							
								/* eslint-env node */
							 | 
						||
| 
								 | 
							
								/* vim: set ts=2 ft=javascript: */
							 | 
						||
| 
								 | 
							
								/*jshint node:true */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var X/*:CRC32Module*/;
							 | 
						||
| 
								 | 
							
								try { X = require('../'); } catch(e) { X = require('crc-32'); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function help()/*:number*/ {
							 | 
						||
| 
								 | 
							
								[
							 | 
						||
| 
								 | 
							
								"usage: crc32 [options] [filename]",
							 | 
						||
| 
								 | 
							
								"",
							 | 
						||
| 
								 | 
							
								"Options:",
							 | 
						||
| 
								 | 
							
								"    -h, --help           output usage information",
							 | 
						||
| 
								 | 
							
								"    -V, --version        output the version number",
							 | 
						||
| 
								 | 
							
								"    -S, --seed=<n>       use integer seed as starting value (rolling CRC)",
							 | 
						||
| 
								 | 
							
								"    -H, --hex-seed=<h>   use hex seed as starting value (rolling CRC)",
							 | 
						||
| 
								 | 
							
								"    -d, --signed         print result with format `%d` (default)",
							 | 
						||
| 
								 | 
							
								"    -u, --unsigned       print result with format `%u`",
							 | 
						||
| 
								 | 
							
								"    -x, --hex            print result with format `%0.8x`",
							 | 
						||
| 
								 | 
							
								"    -X, --HEX            print result with format `%0.8X`",
							 | 
						||
| 
								 | 
							
								"    -c, --crc32c         use CRC32C (Castagnoli)",
							 | 
						||
| 
								 | 
							
								"    -F, --format=<s>     use specified printf format",
							 | 
						||
| 
								 | 
							
								"",
							 | 
						||
| 
								 | 
							
								"Set filename = '-' or pipe data into crc32 to read from stdin",
							 | 
						||
| 
								 | 
							
								"Default output mode is signed (-d)",
							 | 
						||
| 
								 | 
							
								""
							 | 
						||
| 
								 | 
							
								].forEach(function(l) { console.log(l); });
							 | 
						||
| 
								 | 
							
									return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function version()/*:number*/ { console.log(X.version); return 0; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var fs = require('fs');
							 | 
						||
| 
								 | 
							
								try { require('exit-on-epipe'); } catch(e) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function die(msg/*:string*/, ec/*:?number*/)/*:void*/ { console.error(msg); process.exit(ec || 0); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var args/*:Array<string>*/ = process.argv.slice(2);
							 | 
						||
| 
								 | 
							
								var filename/*:string*/ = "";
							 | 
						||
| 
								 | 
							
								var fmt/*:string*/ = "";
							 | 
						||
| 
								 | 
							
								var seed = 0, r = 10;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								for(var i = 0; i < args.length; ++i) {
							 | 
						||
| 
								 | 
							
									var arg = args[i];
							 | 
						||
| 
								 | 
							
									if(arg.charCodeAt(0) != 45) { if(filename === "") filename = arg; continue; }
							 | 
						||
| 
								 | 
							
									var m = arg.indexOf("=") == -1 ? arg : arg.substr(0, arg.indexOf("="));
							 | 
						||
| 
								 | 
							
									switch(m) {
							 | 
						||
| 
								 | 
							
										case "-": filename = "-"; break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										case "--help":     case "-h": process.exit(help()); break;
							 | 
						||
| 
								 | 
							
										case "--version":  case "-V": process.exit(version()); break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										case "--crc32c":   case "-c": try { X = require('../crc32c'); } catch(e) { X = require('crc-32/crc32c'); } break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										case "--signed":   case "-d": fmt = "%d"; break;
							 | 
						||
| 
								 | 
							
										case "--unsigned": case "-u": fmt = "%u"; break;
							 | 
						||
| 
								 | 
							
										case "--hex":      case "-x": fmt = "%0.8x"; break;
							 | 
						||
| 
								 | 
							
										case "--HEX":      case "-X": fmt = "%0.8X"; break;
							 | 
						||
| 
								 | 
							
										case "--format":   case "-F":
							 | 
						||
| 
								 | 
							
											try {
							 | 
						||
| 
								 | 
							
												require("printj");
							 | 
						||
| 
								 | 
							
												fmt = ((m!=arg) ? arg.substr(m.length+1) : args[++i])||"";
							 | 
						||
| 
								 | 
							
											} catch(e) {
							 | 
						||
| 
								 | 
							
												console.error("The `crc-32` module removed the `printj` dependency for formatting");
							 | 
						||
| 
								 | 
							
												console.error("Use the `crc32-cli` module instead:");
							 | 
						||
| 
								 | 
							
												console.error("    $ npx crc32-cli [options] [filename]");
							 | 
						||
| 
								 | 
							
											} break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										case "--hex-seed": case "-H": r = 16;
							 | 
						||
| 
								 | 
							
										/* falls through */
							 | 
						||
| 
								 | 
							
										case "--seed":     case "-S":
							 | 
						||
| 
								 | 
							
											seed=parseInt((m!=arg) ? arg.substr(m.length+1) : args[++i], r)||0; break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										default: die("crc32: unrecognized option `" + arg + "'", 22);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if(!process.stdin.isTTY) filename = filename || "-";
							 | 
						||
| 
								 | 
							
								if(filename.length===0) die("crc32: must specify a filename ('-' for stdin)",1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var crc32 = seed;
							 | 
						||
| 
								 | 
							
								// $FlowIgnore -- Writable is callable but type sig disagrees
							 | 
						||
| 
								 | 
							
								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() {
							 | 
						||
| 
								 | 
							
									if(fmt === "") console.log(crc32);
							 | 
						||
| 
								 | 
							
									else try { console.log(require("printj").sprintf(fmt, crc32)); } catch(e) {
							 | 
						||
| 
								 | 
							
										switch(fmt) {
							 | 
						||
| 
								 | 
							
											case "%d": console.log(crc32); break;
							 | 
						||
| 
								 | 
							
											case "%u": console.log(crc32 >>> 0); break;
							 | 
						||
| 
								 | 
							
											case "%0.8x": console.log((crc32 >>> 0).toString(16).padStart(8, "0").toLowerCase()); break;
							 | 
						||
| 
								 | 
							
											case "%0.8X": console.log((crc32 >>> 0).toString(16).padStart(8, "0").toUpperCase()); break;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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);
							 |