diff options
-rw-r--r-- | README | 7 | ||||
-rw-r--r-- | holes.1 | 5 | ||||
-rw-r--r-- | holes.c | 16 |
3 files changed, 23 insertions, 5 deletions
diff --git a/README b/README index 91f6cca..3edaccd 100644 --- a/README +++ b/README @@ -4,7 +4,7 @@ NAME holes – find runs of zero bytes SYNOPSIS - holes [-b byte] [-n minlen] [files ...] + holes [-b byte] [-n minlen] [-s] [files ...] DESCRIPTION holes looks for runs of zero bytes (a.k.a. holes) in the specified input @@ -22,6 +22,9 @@ DESCRIPTION Change minimum size of holes reported. By default, only holes of at least 64 bytes are reported. + -s Print a summary at the end how many percent of the file are runs + of zeroes. + EXIT STATUS The holes utility exits 0 on success, and >0 if an error occurs. @@ -39,4 +42,4 @@ LICENSE http://creativecommons.org/publicdomain/zero/1.0/ -Void Linux August 21, 2017 Void Linux +Void Linux November 8, 2017 Void Linux diff --git a/holes.1 b/holes.1 index 2edbaf9..284fe6e 100644 --- a/holes.1 +++ b/holes.1 @@ -1,4 +1,4 @@ -.Dd August 21, 2017 +.Dd November 8, 2017 .Dt HOLES 1 .Os .Sh NAME @@ -8,6 +8,7 @@ .Nm .Op Fl b Ar byte .Op Fl n Ar minlen +.Op Fl s .Op Ar files\ ... .Sh DESCRIPTION .Nm @@ -30,6 +31,8 @@ instead of zero bytes. Change minimum size of holes reported. By default, only holes of at least 64 bytes are reported. +.It Fl s +Print a summary at the end how many percent of the file are runs of zeroes. .El .Sh EXIT STATUS .Ex -std diff --git a/holes.c b/holes.c index 78a90af..7cfe08e 100644 --- a/holes.c +++ b/holes.c @@ -10,6 +10,7 @@ ssize_t minlen = 64; char byte = 0; int ret = 0; char *argv0; +ssize_t total, totalz; void holes(FILE *input, char *filename) @@ -42,6 +43,7 @@ holes(FILE *input, char *filename) if (filename) printf("%s: ", filename); printf("%08lx %ld\n", offset - run, run); + totalz += run; } run = 0; } @@ -60,7 +62,10 @@ holes(FILE *input, char *filename) if (filename) printf("%s: ", filename); printf("%08lx %ld\n", offset - run, run); + totalz += run; } + + total += offset; } int @@ -69,10 +74,11 @@ main(int argc, char *argv[]) int c, i; long b; char *e; + int sflag = 0; argv0 = argv[0]; - while ((c = getopt(argc, argv, "b:n:")) != -1) + while ((c = getopt(argc, argv, "b:n:s")) != -1) switch (c) { case 'b': errno = 0; @@ -101,9 +107,10 @@ main(int argc, char *argv[]) exit(2); } break; + case 's': sflag++; break; default: fprintf(stderr, - "Usage: %s [-b BYTE] [-n MINLEN] [FILES...]\n", + "Usage: %s [-b BYTE] [-n MINLEN] [-s] [FILES...]\n", argv0); exit(2); } @@ -124,5 +131,10 @@ main(int argc, char *argv[]) } } + if (sflag) + printf("total %jd/%jd (%.2f%%)\n", + totalz, total, + total == 0 ? 0.0 : 100.0*totalz / total); + return ret; } |