diff options
author | Rangi <remy.oukaour+rangi42@gmail.com> | 2020-09-17 14:54:11 -0400 |
---|---|---|
committer | Rangi <remy.oukaour+rangi42@gmail.com> | 2020-09-17 15:19:17 -0400 |
commit | a46a02097a0a00081dc2173aeb6bf3ca1187a868 (patch) | |
tree | f12ed48ae2f7860715d1bad0e66c353e86c82985 | |
parent | 331c9043d2d6d39cb71d4460de97f22fb5ebab3c (diff) |
Slight refactor to all xor_compress
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | tools/tools.mk | 3 | ||||
-rw-r--r-- | tools/xor_compress.c | 5 | ||||
-rw-r--r-- | tools/xor_compress.py | 11 | ||||
-rw-r--r-- | tools/xor_compress.rs | 47 |
5 files changed, 40 insertions, 28 deletions
@@ -9,7 +9,9 @@ __pycache__ *.pyc *.exe +*.pdb /coverage.png /picross.png tools/scan_includes tools/xor_compress +tools/xor-compress diff --git a/tools/tools.mk b/tools/tools.mk index 0857fcb..da1041d 100644 --- a/tools/tools.mk +++ b/tools/tools.mk @@ -7,3 +7,6 @@ CFLAGS := -O3 -std=c99 -Wall -Wextra -pedantic tools/%: tools/%.c $(CC) $(CFLAGS) -o $@ $< + +tools/xor-compress: tools/xor_compress.rs + rustc -C opt-level=3 -o $@ $< diff --git a/tools/xor_compress.c b/tools/xor_compress.c index 48e5167..2e1f4fe 100644 --- a/tools/xor_compress.c +++ b/tools/xor_compress.c @@ -98,9 +98,8 @@ int write_compressed(const char *filename, unsigned char *data, size_t n, bool v } int main(int argc, char *argv[]) { - bool verbose = false; - if (argc > 1 && !strcmp(argv[1], "-v")) { - verbose = true; + bool verbose = argc > 1 && !strcmp(argv[1], "-v"); + if (verbose) { argv++; argc--; } diff --git a/tools/xor_compress.py b/tools/xor_compress.py index 015c80e..1c3a2f1 100644 --- a/tools/xor_compress.py +++ b/tools/xor_compress.py @@ -2,15 +2,16 @@ import sys +PROGRAM_NAME = "xor_compress.py" + sys.argv.pop(0) -verbose = False -if sys.argv and sys.argv[0] == '-v': - verbose = True +verbose = sys.argv and sys.argv[0] == '-v' +if verbose: sys.argv.pop(0) if len(sys.argv) < 2: - print('Usage: xor_compress.py [-v] file... files.xor', file=sys.stderr) + print('Usage: %s [-v] file... files.xor' % PROGRAM_NAME, file=sys.stderr) exit(1) out_filename = sys.argv.pop() @@ -61,4 +62,4 @@ with open(out_filename, 'wb') as f: f.write(output) if verbose: - print('%s: ld bc, $%x' % (out_filename, runs)) + print('%s: %s: ld bc, $%x' % (PROGRAM_NAME, out_filename, runs)) diff --git a/tools/xor_compress.rs b/tools/xor_compress.rs index 0d912ba..fd6c674 100644 --- a/tools/xor_compress.rs +++ b/tools/xor_compress.rs @@ -1,17 +1,25 @@ -const PROGRAM_NAME: &str = "xor_compress"; +use std::env::args; +use std::process::exit; +use std::fs::write; +use std::io::{Read, Error}; -fn read_files(filenames: &[String]) -> Result<Vec<u8>, (&String, std::io::Error)> { +const PROGRAM_NAME: &str = "xor-compress"; + +fn read_files(filenames: &[String]) -> Result<Vec<u8>, (&String, Error)> { let mut data = Vec::new(); - for filename in filenames.iter() { - match std::fs::read(filename) { - Ok(bytes) => data.extend(&bytes), - Err(err) => return Err((filename, err)), + for filename in filenames { + match std::fs::File::open(filename) { + Ok(mut f) => match f.read_to_end(&mut data) { + Ok(_) => (), + Err(err) => return Err((filename, err)), + }, + Err(err) => return Err((filename, err)), } } Ok(data) } -fn write_compressed(filename: &String, data: Vec<u8>) -> Result<u32, std::io::Error> { +fn write_compressed(filename: &String, data: &[u8]) -> Result<u32, Error> { let n = data.len(); let mut output = Vec::new(); @@ -55,42 +63,41 @@ fn write_compressed(filename: &String, data: Vec<u8>) -> Result<u32, std::io::Er } } - match std::fs::write(filename, &output[..]) { + match write(filename, &output[..]) { Ok(()) => Ok(runs), Err(err) => Err(err), } } fn main() { - let mut args: Vec<String> = std::env::args().skip(1).collect(); + let mut argv: Vec<String> = args().skip(1).collect(); - let mut verbose = false; - if !args.is_empty() && args[0] == "-v" { - verbose = true; - args.remove(0); + let verbose = !argv.is_empty() && argv[0] == "-v"; + if verbose { + argv.remove(0); } - if args.len() < 2 { + if argv.len() < 2 { eprintln!("Usage: {} [-v] file... files.xor", PROGRAM_NAME); - std::process::exit(1); + exit(1); } - let out_filename = args.pop().unwrap(); - let data = match read_files(&args[..]) { + let out_filename = argv.pop().unwrap(); + let data = match read_files(&argv[..]) { Ok(data) => data, Err((filename, err)) => { eprintln!("{}: {}: {}", PROGRAM_NAME, filename, err); - std::process::exit(err.raw_os_error().unwrap_or(1)); + exit(err.raw_os_error().unwrap_or(1)); } }; if !data.is_empty() { - match write_compressed(&out_filename, data) { + match write_compressed(&out_filename, &data[..]) { Ok(runs) => if verbose { println!("{}: {}: ld bc, ${:x}", PROGRAM_NAME, out_filename, runs); }, Err(err) => { eprintln!("{}: {}: {}", PROGRAM_NAME, out_filename, err); - std::process::exit(err.raw_os_error().unwrap_or(1)); + exit(err.raw_os_error().unwrap_or(1)); }, } } |