return (gg);
}
+/* --- @fhash_init@ ---*
+ *
+ * Arguments: @fhashstate *fh@ = pointer to fhash state to initialize
+ * @const gchash *gch@ = hash class to set
+ * @unsigned f@ initial flags to set
+ *
+ * Returns: ---
+ *
+ * Use: Initializes an @fhashstate@ structure.
+ */
+
+void fhash_init(fhashstate *fh, const gchash *gch, unsigned f)
+ { fh->f = f; fh->gch = gch; }
+
+/* --- @fhash_free@ --- *
+ *
+ * Arguments: @fhashstate *fh@ = pointer to fhash state to free
+ *
+ * Returns: ---
+ *
+ * Use: Frees an fhash state.
+ */
+
+void fhash_free(fhashstate *fh) { return; }
+
/* --- @fhash@ --- *
*
- * Arguments: @const gchash *gch@ = pointer to hash function to use
- * @unsigned f@ = flags to set
+ * Arguments: @fhashstate *fh@ = pointer to fhash state
* @const char *file@ = file name to be hashed (null for stdin)
* @void *buf@ = pointer to hash output buffer
*
* Use: Hashes a file.
*/
-int fhash(const gchash *gch, unsigned f, const char *file, void *buf)
+int fhash(fhashstate *fh, const char *file, void *buf)
{
FILE *fp;
char fbuf[1024 * 128];
if (!file || strcmp(file, "-") == 0)
fp = stdin;
- else if ((fp = fopen(file, f & FHF_BINARY ? "rb" : "r")) == 0)
+ else if ((fp = fopen(file, fh->f & FHF_BINARY ? "rb" : "r")) == 0)
return (-1);
- if (f & FHF_PROGRESS) {
+ if (fh->f & FHF_PROGRESS) {
if (fprogress_init(&ff, file, fp)) return (-1);
}
- h = GH_INIT(gch);
+ h = GH_INIT(fh->gch);
while ((sz = fread(fbuf, 1, sizeof(fbuf), fp)) > 0) {
GH_HASH(h, fbuf, sz);
- if (f & FHF_PROGRESS) fprogress_update(&ff, sz);
+ if (fh->f & FHF_PROGRESS) fprogress_update(&ff, sz);
}
if (ferror(fp)) rc = -1;
if (fp != stdin) fclose(fp);
- if (f & FHF_PROGRESS) fprogress_done(&ff);
+ if (fh->f & FHF_PROGRESS) fprogress_done(&ff);
GH_DONE(h, buf);
GH_DESTROY(h);
return (rc);