X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/45c0fd363937c6e9b05da04a9167e9912c05ca0c..a1e745ad3b306d1e5173588e39d71b132466365e:/hashsum.c diff --git a/hashsum.c b/hashsum.c index b9afe70..554b079 100644 --- a/hashsum.c +++ b/hashsum.c @@ -29,6 +29,8 @@ /*----- Header files ------------------------------------------------------*/ +#define _FILE_OFFSET_BITS 64 + #include "config.h" #include @@ -64,6 +66,7 @@ #define f_oddhash 64u #define f_escape 128u #define f_oddenc 256u +#define f_progress 512u /*----- Encoding and decoding ---------------------------------------------*/ @@ -206,21 +209,29 @@ static const encodeops *getencoding(const char *ename) static int fhash(const char *file, unsigned f, const gchash *gch, void *buf) { FILE *fp; - char fbuf[BUFSIZ]; + char fbuf[1024 * 128]; size_t sz; ghash *h; int e; + fprogress ff; if (!file || strcmp(file, "-") == 0) fp = stdin; else if ((fp = fopen(file, f & f_binary ? "rb" : "r")) == 0) return (-1); + if (f & f_progress) { + if (fprogress_init(&ff, file, fp)) return (-1); + } + h = GH_INIT(gch); - while ((sz = fread(fbuf, 1, sizeof(fbuf), fp)) > 0) + while ((sz = fread(fbuf, 1, sizeof(fbuf), fp)) > 0) { GH_HASH(h, fbuf, sz); + if (f & f_progress) fprogress_update(&ff, sz); + } GH_DONE(h, buf); GH_DESTROY(h); + if (f & f_progress) fprogress_done(&ff); e = ferror(fp); if (file) fclose(fp); @@ -691,10 +702,11 @@ int main(int argc, char *argv[]) { "check", 0, 0, 'c' }, { "binary", 0, 0, 'b' }, { "verbose", 0, 0, 'v' }, + { "progress", 0, 0, 'p' }, { 0, 0, 0, 0 } }; - int i = mdwopt(argc, argv, "hVu a:E:l f0 ecbv", opts, 0, 0, 0); + int i = mdwopt(argc, argv, "hVu a:E:l f0 ecbvp", opts, 0, 0, 0); if (i < 0) break; @@ -738,6 +750,9 @@ int main(int argc, char *argv[]) case 'v': f |= f_verbose; break; + case 'p': + f |= f_progress; + break; default: f |= f_bogus; break; @@ -753,6 +768,11 @@ int main(int argc, char *argv[]) /* --- Generate output --- */ + if (!(f & f_check) && (argc || (f & f_files))) { + if (f & f_oddhash) printf("#hash %s\n", gch->name); + if (f & f_oddenc) printf("#encoding %s\n", e->name); + if (f & f_escape) fputs("#escape\n", stdout); + } if (!argc) rc = hashsum(0, f, gch, e); else { @@ -760,11 +780,6 @@ int main(int argc, char *argv[]) int rrc; rc = 0; - if (!(f & f_check)) { - if (f & f_oddhash) printf("#hash %s\n", gch->name); - if (f & f_oddenc) printf("#encoding %s\n", e->name); - if (f & f_escape) fputs("#escape\n", stdout); - } for (i = 0; i < argc; i++) { if ((rrc = hashsum(argv[i], f, gch, e)) != 0) rc = rrc;