1 /* 2 * Copyright 2015 Google Inc. All rights reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <stdio.h> 18 #include <iostream> 19 #include <sstream> 20 #include <string> 21 #include "flatbuffers/hash.h" 22 23 enum OutputFormat { kDecimal, kHexadecimal, kHexadecimal0x }; 24 25 int main(int argc, char *argv[]) { 26 const char *name = argv[0]; 27 if (argc <= 1) { 28 printf("%s HASH [OPTION]... STRING... [-- STRING...]\n", name); 29 printf("Available hashing algorithms:\n"); 30 printf(" 16 bit:\n"); 31 size_t size = sizeof(flatbuffers::kHashFunctions16) / 32 sizeof(flatbuffers::kHashFunctions16[0]); 33 for (size_t i = 0; i < size; ++i) { 34 printf(" * %s\n", flatbuffers::kHashFunctions16[i].name); 35 } 36 printf(" 32 bit:\n"); 37 size = sizeof(flatbuffers::kHashFunctions32) / 38 sizeof(flatbuffers::kHashFunctions32[0]); 39 for (size_t i = 0; i < size; ++i) { 40 printf(" * %s\n", flatbuffers::kHashFunctions32[i].name); 41 } 42 printf(" 64 bit:\n"); 43 size = sizeof(flatbuffers::kHashFunctions64) / 44 sizeof(flatbuffers::kHashFunctions64[0]); 45 for (size_t i = 0; i < size; ++i) { 46 printf(" * %s\n", flatbuffers::kHashFunctions64[i].name); 47 } 48 printf( 49 " -d Output hash in decimal.\n" 50 " -x Output hash in hexadecimal.\n" 51 " -0x Output hash in hexadecimal and prefix with 0x.\n" 52 " -c Append the string to the output in a c-style comment.\n"); 53 return 0; 54 } 55 56 const char *hash_algorithm = argv[1]; 57 58 flatbuffers::NamedHashFunction<uint16_t>::HashFunction hash_function16 = 59 flatbuffers::FindHashFunction16(hash_algorithm); 60 flatbuffers::NamedHashFunction<uint32_t>::HashFunction hash_function32 = 61 flatbuffers::FindHashFunction32(hash_algorithm); 62 flatbuffers::NamedHashFunction<uint64_t>::HashFunction hash_function64 = 63 flatbuffers::FindHashFunction64(hash_algorithm); 64 65 if (!hash_function16 && !hash_function32 && !hash_function64) { 66 printf("\"%s\" is not a known hash algorithm.\n", hash_algorithm); 67 return 0; 68 } 69 70 OutputFormat output_format = kHexadecimal; 71 bool annotate = false; 72 bool escape_dash = false; 73 for (int i = 2; i < argc; i++) { 74 const char *arg = argv[i]; 75 if (!escape_dash && arg[0] == '-') { 76 std::string opt = arg; 77 if (opt == "-d") 78 output_format = kDecimal; 79 else if (opt == "-x") 80 output_format = kHexadecimal; 81 else if (opt == "-0x") 82 output_format = kHexadecimal0x; 83 else if (opt == "-c") 84 annotate = true; 85 else if (opt == "--") 86 escape_dash = true; 87 else 88 printf("Unrecognized argument: \"%s\"\n", arg); 89 } else { 90 std::stringstream ss; 91 if (output_format == kDecimal) { 92 ss << std::dec; 93 } else if (output_format == kHexadecimal) { 94 ss << std::hex; 95 } else if (output_format == kHexadecimal0x) { 96 ss << std::hex; 97 ss << "0x"; 98 } 99 if (hash_function16) 100 ss << hash_function16(arg); 101 else if (hash_function32) 102 ss << hash_function32(arg); 103 else if (hash_function64) 104 ss << hash_function64(arg); 105 106 if (annotate) ss << " /* \"" << arg << "\" */"; 107 108 ss << "\n"; 109 110 std::cout << ss.str(); 111 } 112 } 113 return 0; 114 } 115