diff options
author | Rangi <remy.oukaour+rangi42@gmail.com> | 2020-09-15 15:48:55 -0400 |
---|---|---|
committer | Rangi <remy.oukaour+rangi42@gmail.com> | 2020-09-15 15:48:55 -0400 |
commit | e0a4184dc2ec6075d5d581789396f0764cc5efd3 (patch) | |
tree | 109287ff72d7e1a713614561b400e4851a8e3294 | |
parent | f77f7ae58916fe0bfe342f80fc8429f647727ece (diff) |
xor_compress can output the run count value for bc
-rw-r--r-- | tools/xor_compress.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/tools/xor_compress.c b/tools/xor_compress.c index 468c2c3..f186f05 100644 --- a/tools/xor_compress.c +++ b/tools/xor_compress.c @@ -1,5 +1,6 @@ #include <stdio.h> #include <stdlib.h> +#include <stdbool.h> #include <string.h> #include <errno.h> @@ -54,15 +55,16 @@ failure: return buffer; } -int write_compressed(const char *filename, unsigned char *data, size_t n) { +int write_compressed(const char *filename, unsigned char *data, size_t n, bool verbose) { FILE *f = fopen(filename, "wb"); if (!f) { fprintf(stderr, PROGRAM_NAME ": %s: %s\n", filename, strerror(errno)); return errno; } + int runs = 0; unsigned char v = 0x00; - for (size_t i = 0; i < n;) { + for (size_t i = 0; i < n; runs++) { unsigned char byte = data[i++]; unsigned char size = 0; if (data[i] == v) { @@ -88,14 +90,23 @@ int write_compressed(const char *filename, unsigned char *data, size_t n) { } } + if (verbose) fprintf(stderr, PROGRAM_NAME ": %s: ld bc, $%x\n", filename, runs); + fflush(f); fclose(f); return 0; } int main(int argc, char *argv[]) { + bool verbose = false; + if (argc > 1 && !strcmp(argv[1], "-v")) { + verbose = true; + argv++; + argc--; + } + if (argc < 3) { - fputs("Usage: " PROGRAM_NAME " file... files.xor\n", stderr); + fputs("Usage: " PROGRAM_NAME " [-v] file... files.xor\n", stderr); exit(1); } argv++; @@ -104,7 +115,7 @@ int main(int argc, char *argv[]) { int err = 0; size_t data_size = 0; unsigned char *data = read_files(argv, argc, &data_size, &err); - if (!err) err = write_compressed(argv[argc], data, data_size); + if (!err) err = write_compressed(argv[argc], data, data_size, verbose); free(data); return err; } |