/* * main - the main function * * See the above usage for details. */ int main(int argc, char *argv[]) { char buf[BUF_SIZE+1]; /* read buffer */ int readcnt; /* number of characters written */ Fnv64_t hval; /* current hash value */ int s_flag = 0; /* 1 => -s was given, hash args as strings */ int m_flag = 0; /* 1 => print multiple hashes, one per arg */ int v_flag = 0; /* 1 => verbose hash print */ int b_flag = WIDTH; /* -b flag value */ Fnv64_t bmask; /* mask to apply to output */ extern char *optarg; /* option argument */ extern int optind; /* argv index of the next arg */ int fd; /* open file to process */ char *p; int i; /* * parse args */ program = argv[0]; while ((i = getopt(argc, argv, "b:msv")) != -1) { switch (i) { case 'b': /* bcnt bit mask count */ b_flag = atoi(optarg); break; case 'm': /* print multiple hashes, one per arg */ m_flag = 1; break; case 's': /* hash args as strings */ s_flag = 1; break; case 'v': /* verbose hash print */ m_flag = 1; v_flag = 1; break; default: fprintf(stderr, usage, program); exit(1); } } /* -s requires at least 1 arg */ if (s_flag && optind >= argc) { fprintf(stderr, usage, program); exit(2); } /* limit -b values */ if (b_flag < 0 || b_flag > WIDTH) { fprintf(stderr, "%s: -b bcnt: %d must be >= 0 and < %d\n", program, b_flag, WIDTH); exit(3); } #if defined(HAVE_64BIT_LONG_LONG) if (b_flag == WIDTH) { bmask = (Fnv64_t)0xffffffffffffffffULL; } else { bmask = (Fnv64_t)((1ULL << b_flag) - 1ULL); } #else if (b_flag == WIDTH) { bmask.w32[0] = 0xffffffffUL; bmask.w32[1] = 0xffffffffUL; } else if (b_flag >= WIDTH/2) { bmask.w32[0] = 0xffffffffUL; bmask.w32[1] = ((1UL << (b_flag-(WIDTH/2))) - 1UL); } else { bmask.w32[0] = ((1UL << b_flag) - 1UL); bmask.w32[1] = 0UL; } #endif /* * start with the initial basis depending on the hash type */ p = strrchr(program, '/'); if (p == NULL) { p = program; } else { ++p; } if (strcmp(p, "fnv0_64") == 0 || strcmp(p, "fnv064") == 0) { /* using non-recommended FNV-0 and zero initial basis */ hval = FNV0_64_INIT; } else { /* using recommended FNV-1 and non-zero initial basis */ hval = FNV1_64_INIT; } /* * string hashing */ if (s_flag) { /* hash any other strings */ for (i=optind; i < argc; ++i) { hval = fnv_64_str(argv[i], hval); if (m_flag) { print_fnv(hval, bmask, v_flag, argv[i]); } } /* * file hashing */ } else { /* * case: process only stdin */ if (optind >= argc) { /* case: process only stdin */ while ((readcnt = read(0, buf, BUF_SIZE)) > 0) { hval = fnv_64_buf(buf, readcnt, hval); } if (m_flag) { print_fnv(hval, bmask, v_flag, "(stdin)"); } } else { /* * process any other files */ for (i=optind; i < argc; ++i) { /* open the file */ fd = open(argv[i], O_RDONLY); if (fd < 0) { fprintf(stderr, "%s: unable to open file: %s\n", program, argv[i]); exit(4); } /* hash the file */ while ((readcnt = read(fd, buf, BUF_SIZE)) > 0) { hval = fnv_64_buf(buf, readcnt, hval); } /* finish processing the file */ if (m_flag) { print_fnv(hval, bmask, v_flag, argv[i]); } close(fd); } } } /* * report hash and exit */ if (!m_flag) { print_fnv(hval, bmask, v_flag, ""); } return 0; /* exit(0); */ }
/* * main - the main function * * See the above usage for details. */ int main(int argc, char *argv[]) { char buf[BUF_SIZE+1]; /* read buffer */ int readcnt; /* number of characters written */ Fnv64_t hval; /* current hash value */ int s_flag = 0; /* 1 => -s was given, hash args as strings */ int m_flag = 0; /* 1 => print multiple hashes, one per arg */ int v_flag = 0; /* 1 => verbose hash print */ int b_flag = WIDTH; /* -b flag value */ int t_flag = -1; /* FNV test vector code (0=>print, 1=>test) */ enum fnv_type hash_type = FNV_NONE; /* type of FNV hash to perform */ Fnv64_t bmask; /* mask to apply to output */ extern char *optarg; /* option argument */ extern int optind; /* argv index of the next arg */ int fd; /* open file to process */ char *p; int i; /* * parse args */ program = argv[0]; while ((i = getopt(argc, argv, "b:mst:v")) != -1) { switch (i) { case 'b': /* bcnt bit mask count */ b_flag = atoi(optarg); break; case 'm': /* print multiple hashes, one per arg */ m_flag = 1; break; case 's': /* hash args as strings */ s_flag = 1; break; case 't': /* FNV test vector code */ t_flag = atoi(optarg); if (t_flag < 0 || t_flag > 1) { fprintf(stderr, "%s: -t code must be 0 or 1\n", program); fprintf(stderr, usage, program, FNV_VERSION); exit(1); } m_flag = 1; break; case 'v': /* verbose hash print */ m_flag = 1; v_flag = 1; break; default: fprintf(stderr, usage, program, FNV_VERSION); exit(1); } } /* -t code incompatible with -b, -m and args */ if (t_flag >= 0) { if (b_flag != WIDTH) { fprintf(stderr, "%s: -t code incompatible with -b\n", program); exit(2); } if (s_flag != 0) { fprintf(stderr, "%s: -t code incompatible with -s\n", program); exit(3); } if (optind < argc) { fprintf(stderr, "%s: -t code incompatible args\n", program); exit(4); } } /* -s requires at least 1 arg */ if (s_flag && optind >= argc) { fprintf(stderr, usage, program, FNV_VERSION); exit(5); } /* limit -b values */ if (b_flag < 0 || b_flag > WIDTH) { fprintf(stderr, "%s: -b bcnt: %d must be >= 0 and < %d\n", program, b_flag, WIDTH); exit(6); } #if defined(HAVE_64BIT_LONG_LONG) if (b_flag == WIDTH) { bmask = (Fnv64_t)0xffffffffffffffffULL; } else { bmask = (Fnv64_t)((1ULL << b_flag) - 1ULL); } #else /* HAVE_64BIT_LONG_LONG */ if (b_flag == WIDTH) { bmask.w32[0] = 0xffffffffUL; bmask.w32[1] = 0xffffffffUL; } else if (b_flag >= WIDTH/2) { bmask.w32[0] = 0xffffffffUL; bmask.w32[1] = ((1UL << (b_flag-(WIDTH/2))) - 1UL); } else { bmask.w32[0] = ((1UL << b_flag) - 1UL); bmask.w32[1] = 0UL; } #endif /* HAVE_64BIT_LONG_LONG */ /* * start with the initial basis depending on the hash type */ p = strrchr(program, '/'); if (p == NULL) { p = program; } else { ++p; } if (strcmp(p, "fnv064") == 0 || strcmp(p, "no64bit_fnv064") == 0) { /* using non-recommended FNV-0 and zero initial basis */ hval = FNV0_64_INIT; hash_type = FNV0_64; } else if (strcmp(p, "fnv164") == 0 || strcmp(p, "no64bit_fnv164") == 0) { /* using FNV-1 and non-zero initial basis */ hval = FNV1_64_INIT; hash_type = FNV1_64; } else if (strcmp(p, "fnv1a64") == 0 || strcmp(p, "no64bit_fnv1a64") == 0) { /* start with the FNV-1a initial basis */ hval = FNV1A_64_INIT; hash_type = FNV1a_64; } else { fprintf(stderr, "%s: unknown program name, unknown hash type\n", program); exit(7); } /* * FNV test vector processing, if needed */ if (t_flag >= 0) { int code; /* test vector that failed, starting at 1 */ /* * perform all tests */ code = test_fnv64(hash_type, hval, bmask, v_flag, t_flag); /* * evaluate the tests */ if (code == 0) { if (v_flag) { printf("passed\n"); } exit(0); } else { printf("failed vector (1 is 1st test): %d\n", code); exit(8); } } /* * string hashing */ if (s_flag) { /* hash any other strings */ for (i=optind; i < argc; ++i) { switch (hash_type) { case FNV0_64: case FNV1_64: hval = fnv_64_str(argv[i], hval); break; case FNV1a_64: hval = fnv_64a_str(argv[i], hval); break; default: unknown_hash_type(program, hash_type, 9); /* exit(9) */ /*NOTREACHED*/ } if (m_flag) { print_fnv64(hval, bmask, v_flag, argv[i]); } } /* * file hashing */ } else { /* * case: process only stdin */ if (optind >= argc) { /* case: process only stdin */ while ((readcnt = read(0, buf, BUF_SIZE)) > 0) { switch (hash_type) { case FNV0_64: case FNV1_64: hval = fnv_64_buf(buf, readcnt, hval); break; case FNV1a_64: hval = fnv_64a_buf(buf, readcnt, hval); default: unknown_hash_type(program, hash_type, 10); /* exit(10) */ /*NOTREACHED*/ } } if (m_flag) { print_fnv64(hval, bmask, v_flag, "(stdin)"); } } else { /* * process any other files */ for (i=optind; i < argc; ++i) { /* open the file */ fd = open(argv[i], O_RDONLY); if (fd < 0) { fprintf(stderr, "%s: unable to open file: %s\n", program, argv[i]); exit(4); } /* hash the file */ while ((readcnt = read(fd, buf, BUF_SIZE)) > 0) { switch (hash_type) { case FNV0_64: case FNV1_64: hval = fnv_64_buf(buf, readcnt, hval); break; case FNV1a_64: hval = fnv_64a_buf(buf, readcnt, hval); default: unknown_hash_type(program, hash_type, 11);/* exit(11) */ /*NOTREACHED*/ } } /* finish processing the file */ if (m_flag) { print_fnv64(hval, bmask, v_flag, argv[i]); } close(fd); } } } /* * report hash and exit */ if (!m_flag) { print_fnv64(hval, bmask, v_flag, ""); } return 0; /* exit(0); */ }