diff options
Diffstat (limited to '.bin/xx.c')
-rwxr-xr-x | .bin/xx.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/.bin/xx.c b/.bin/xx.c index ad71ac98..30bf1708 100755 --- a/.bin/xx.c +++ b/.bin/xx.c @@ -3,14 +3,23 @@ exec cc -Weverything -Wno-vla -o ~/.bin/xx $0 #endif #include <ctype.h> +#include <stdbool.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> +static bool zero(const uint8_t *buf, size_t len) +{ + for (size_t i = 0; i < len; ++i) + if (buf[i]) return false; + return true; +} + enum { ASCII = 1, OFFSETS = 2, + SKIP = 4, }; int main(int argc, char **argv) @@ -20,7 +29,7 @@ int main(int argc, char **argv) uint8_t flags = ASCII | OFFSETS; char *path = NULL; - while (getopt(argc, argv, "ac:g:o") > 0) + while (getopt(argc, argv, "ac:g:os") > 0) if (optopt == 'a') { flags ^= ASCII; } else if (optopt == 'c') { @@ -30,6 +39,8 @@ int main(int argc, char **argv) group = (size_t) strtol(optarg, NULL, 10); } else if (optopt == 'o') { flags ^= OFFSETS; + } else if (optopt == 's') { + flags ^= SKIP; } else return EXIT_FAILURE; if (argc > optind) path = argv[optind]; @@ -41,10 +52,20 @@ int main(int argc, char **argv) } uint8_t buf[cols]; - size_t offset = 0, n, i; + size_t offset = 0, n = 0, i; + bool skip = false; for (;;) { + offset += n; n = fread(buf, 1, sizeof(buf), file); + if ((flags & SKIP) && n == sizeof(buf)) { + if (zero(buf, n)) { + if (!skip) printf("*\n"); + skip = true; + continue; + } else skip = false; + } + if (flags & OFFSETS) printf("%08zx: ", offset); for (i = 0; i < n; ++i) { @@ -53,6 +74,7 @@ int main(int argc, char **argv) } if (flags & ASCII) { + // TODO: Fix alignment with group. for (i = n; i < cols; ++i) printf(" "); printf(" "); @@ -61,7 +83,6 @@ int main(int argc, char **argv) } printf("\n"); - offset += n; if (n < sizeof(buf)) break; } if (ferror(file)) { |