cc.h: Reorder the declarations.
[u/mdw/catacomb] / hashsum.c
index 85fc6f4..554b079 100644 (file)
--- a/hashsum.c
+++ b/hashsum.c
@@ -7,7 +7,7 @@
  * (c) 2000 Straylight/Edgeware
  */
 
-/*----- Licensing notice --------------------------------------------------* 
+/*----- Licensing notice --------------------------------------------------*
  *
  * This file is part of Catacomb.
  *
  * it under the terms of the GNU Library General Public License as
  * published by the Free Software Foundation; either version 2 of the
  * License, or (at your option) any later version.
- * 
+ *
  * Catacomb is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Library General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Library General Public
  * License along with Catacomb; if not, write to the Free
  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
@@ -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 ---------------------------------------------*/
 
@@ -94,7 +97,7 @@ static size_t gethex(const char *p, octet *q, size_t sz, char **pp)
   }
   if (pp)
     *pp = (char *)p;
-  return (i); 
+  return (i);
 }
 
 /* --- Base64 encoding --- */
@@ -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;