cc.h: Reorder the declarations.
[u/mdw/catacomb] / hashsum.c
index 9721410..554b079 100644 (file)
--- a/hashsum.c
+++ b/hashsum.c
@@ -29,6 +29,8 @@
 
 /*----- Header files ------------------------------------------------------*/
 
+#define _FILE_OFFSET_BITS 64
+
 #include "config.h"
 
 #include <assert.h>
@@ -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;