/*----- Header files ------------------------------------------------------*/
+#define _FILE_OFFSET_BITS 64
+
#include "config.h"
#include <assert.h>
#define f_oddhash 64u
#define f_escape 128u
#define f_oddenc 256u
+#define f_progress 512u
/*----- Encoding and decoding ---------------------------------------------*/
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);
{ "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;
case 'v':
f |= f_verbose;
break;
+ case 'p':
+ f |= f_progress;
+ break;
default:
f |= f_bogus;
break;