Various <ctype.h> fixes.
[u/mdw/catacomb] / hashsum.c
index 0e537ee..db7d7f7 100644 (file)
--- a/hashsum.c
+++ b/hashsum.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: hashsum.c,v 1.2 2000/07/15 21:14:05 mdw Exp $
+ * $Id: hashsum.c,v 1.4 2000/08/04 23:23:44 mdw Exp $
  *
  * Hash files using some secure hash function
  *
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: hashsum.c,v $
+ * Revision 1.4  2000/08/04 23:23:44  mdw
+ * Various <ctype.h> fixes.
+ *
+ * Revision 1.3  2000/07/29 17:02:43  mdw
+ * (checkhash): Be pettier about spaces between the hash and filename, for
+ * compatiblity with `md5sum'.
+ *
  * Revision 1.2  2000/07/15 21:14:05  mdw
  * Missed `-e' out of the usage string.
  *
@@ -221,7 +228,7 @@ static int getstring(FILE *fp, const char *p, dstr *d, unsigned raw)
 
   /* --- Raw: just read exactly what's written up to a null byte --- */
 
-#define NEXTCH (fp ? getc(fp) : *p++)
+#define NEXTCH (fp ? getc(fp) : (unsigned char)*p++)
 #define EOFCH (fp ? EOF : 0)
 
   if (raw) {
@@ -245,7 +252,7 @@ static int getstring(FILE *fp, const char *p, dstr *d, unsigned raw)
 
 again:
   ch = NEXTCH;
-  while (isspace((unsigned char)ch))
+  while (isspace(ch))
     ch = NEXTCH;
   if (ch == '#') {
     do ch = NEXTCH; while (ch != '\n' && ch != EOFCH);
@@ -294,7 +301,7 @@ again:
 
     if (ch == q)
       break;
-    if (!q && isspace((unsigned char)ch))
+    if (!q && isspace(ch))
       break;
 
     /* --- Otherwise contribute and continue --- */
@@ -422,18 +429,19 @@ static int checkhash(const char *file, unsigned f, const gchash *gch)
 
     /* --- Otherwise it's a hex thing --- */
 
-    if ((q = str_getword(&p)) == 0)
+    q = p;
+    while (*p && *p != ' ')
+      p++;
+    if (!*p)
       continue;
+    *p++ = 0;
     if (gethex(q, buf, gch->hashsz, 0) < gch->hashsz)
       continue;
-    while (isspace((unsigned char)*p))
-      p++;
-    if (*p == '*') {
-      p++;
+    if (*p == '*')
       ff |= f_binary;
-    }
-    if (!*p)
+    else if (*p != ' ')
       continue;
+    p++;
 
     if (f & f_escape) {
       DRESET(&dd);
@@ -495,6 +503,11 @@ static int dohash(const char *file, unsigned f, const gchash *gch)
   return (rc);
 }
 
+static int dofile(const char *file, unsigned f, const gchash *gch)
+{
+  return (f & f_check ? checkhash : dohash)(file, f, gch);
+}
+
 static int hashfiles(const char *file, unsigned f, const gchash *gch)
 {
   FILE *fp;
@@ -513,7 +526,7 @@ static int hashfiles(const char *file, unsigned f, const gchash *gch)
     DRESET(&d);
     if (getstring(fp, 0, &d, f & f_raw))
       break;
-    if ((rrc = dohash(d.buf, f, gch)) != 0)
+    if ((rrc = dofile(d.buf, f, gch)) != 0)
       rc = rrc;
   }
 
@@ -522,11 +535,7 @@ static int hashfiles(const char *file, unsigned f, const gchash *gch)
 
 static int hashsum(const char *file, unsigned f, const gchash *gch)
 {
-  if (f & f_check)
-    return (checkhash(file, f, gch));
-  if (f & f_files)
-    return (hashfiles(file, f, gch));
-  return (dohash(file, f, gch));
+  return (f & f_files ? hashfiles : dofile)(file, f, gch);
 }
 
 /*----- Main driver -------------------------------------------------------*/