-#define f_binary 1u
-#define f_bogus 2u
-#define f_verbose 4u
-#define f_check 8u
-#define f_files 16u
-#define f_raw 32u
-#define f_oddhash 64u
-#define f_escape 128u
-
-/*----- Support functions -------------------------------------------------*/
-
-/* --- @fhash@ --- *
- *
- * Arguments: @const char *file@ = file name to be hashed (null for stdin)
- * @unsigned f@ = flags to set
- * @const gchash *gch@ = pointer to hash function to use
- * @void *buf@ = pointer to hash output buffer
- *
- * Returns: Zero if it worked, nonzero on error.
- *
- * Use: Hashes a file.
- */
-
-static int fhash(const char *file, unsigned f, const gchash *gch, void *buf)
-{
- FILE *fp;
- char fbuf[BUFSIZ];
- size_t sz;
- ghash *h;
- int e;
-
- if (!file)
- fp = stdin;
- else if ((fp = fopen(file, f & f_binary ? "rb" : "r")) == 0)
- return (-1);
-
- h = gch->init();
- while ((sz = fread(fbuf, 1, sizeof(fbuf), fp)) > 0)
- h->ops->hash(h, fbuf, sz);
- h->ops->done(h, buf);
- h->ops->destroy(h);
- e = ferror(fp);
- if (file)
- fclose(fp);
- return (e ? -1 : 0);
-}
-
-/* --- @puthex@ --- *
- *
- * Arguments: @const octet *buf@ = pointer to a binary buffer
- * @size_t sz@ = size of the buffer
- * @FILE *fp@ = pointer to output file handle
- *
- * Returns: ---
- *
- * Use: Writes a hex dump of a block of memory.
- */
-
-static void puthex(const octet *buf, size_t sz, FILE *fp)
-{
- while (sz) {
- fprintf(fp, "%02x", *buf++);
- sz--;
- }
-}
-
-/* --- @gethex@ --- *
- *
- * Arguments: @const char *p@ = pointer to input string
- * @octet *q@ = pointer to output buffer
- * @size_t sz@ = size of the output buffer
- * @char **pp@ = where to put the end pointer
- *
- * Returns: The number of bytes written to the buffer.
- *
- * Use: Reads hex dumps from the input string.
- */
-
-static size_t gethex(const char *p, octet *q, size_t sz, char **pp)
-{
- size_t i = 0;
- while (sz > 0 &&
- isxdigit((unsigned char)p[0]) &&
- isxdigit((unsigned char)p[1])) {
- char buf[3];
- buf[0] = p[0];
- buf[1] = p[1];
- buf[2] = 0;
- *q++ = strtoul(buf, 0, 16);
- sz--;
- p += 2;
- i++;
- }
- if (pp)
- *pp = (char *)p;
- return (i);
-}
-
-/* --- @gethash@ --- *
- *
- * Arguments: @const char *name@ = pointer to name string
- *
- * Returns: Pointer to appropriate hash class.
- *
- * Use: Chooses a hash function by name.
- */
-
-static const gchash *gethash(const char *name)
-{
- const gchash *const *g, *gg = 0;
- size_t sz = strlen(name);
- for (g = ghashtab; *g; g++) {
- if (strncmp(name, (*g)->name, sz) == 0) {
- if ((*g)->name[sz] == 0) {
- gg = *g;
- break;
- } else if (gg)
- return (0);
- else
- gg = *g;
- }
- }
- return (gg);
-}