• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <iostream>
18 #include <sstream>
19 #include <string>
20 #include "flatbuffers/hash.h"
21 #include <stdio.h>
22 
23 enum OutputFormat {
24   kDecimal,
25   kHexadecimal,
26   kHexadecimal0x
27 };
28 
main(int argc,char * argv[])29 int main(int argc, char* argv[]) {
30   const char* name = argv[0];
31   if (argc <= 1) {
32     printf("%s HASH [OPTION]... STRING... [-- STRING...]\n", name);
33     printf("Available hashing algorithms:\n  32 bit:\n");
34     size_t size = sizeof(flatbuffers::kHashFunctions32) /
35                   sizeof(flatbuffers::kHashFunctions32[0]);
36     for (size_t i = 0; i < size; ++i) {
37       printf("    * %s\n", flatbuffers::kHashFunctions32[i].name);
38     }
39     printf("  64 bit:\n");
40     size = sizeof(flatbuffers::kHashFunctions64) /
41            sizeof(flatbuffers::kHashFunctions64[0]);
42     for (size_t i = 0; i < size; ++i) {
43       printf("    * %s\n", flatbuffers::kHashFunctions64[i].name);
44     }
45     printf(
46         "  -d         Output hash in decimal.\n"
47         "  -x         Output hash in hexadecimal.\n"
48         "  -0x        Output hash in hexadecimal and prefix with 0x.\n"
49         "  -c         Append the string to the output in a c-style comment.\n");
50     return 0;
51   }
52 
53   const char* hash_algorithm = argv[1];
54 
55   flatbuffers::NamedHashFunction<uint32_t>::HashFunction hash_function32 =
56       flatbuffers::FindHashFunction32(hash_algorithm);
57   flatbuffers::NamedHashFunction<uint64_t>::HashFunction hash_function64 =
58       flatbuffers::FindHashFunction64(hash_algorithm);
59 
60   if (!hash_function32 && !hash_function64) {
61     printf("\"%s\" is not a known hash algorithm.\n", hash_algorithm);
62     return 0;
63   }
64 
65   OutputFormat output_format = kHexadecimal;
66   bool annotate = false;
67   bool escape_dash = false;
68   for (int i = 2; i < argc; i++) {
69     const char* arg = argv[i];
70     if (!escape_dash && arg[0] == '-') {
71       std::string opt = arg;
72       if (opt == "-d")       output_format = kDecimal;
73       else if (opt == "-x")  output_format = kHexadecimal;
74       else if (opt == "-0x") output_format = kHexadecimal0x;
75       else if (opt == "-c")  annotate = true;
76       else if (opt == "--")  escape_dash = true;
77       else printf("Unrecognized argument: \"%s\"\n", arg);
78     } else {
79       std::stringstream ss;
80       if (output_format == kDecimal) {
81         ss << std::dec;
82       } else if (output_format == kHexadecimal) {
83         ss << std::hex;
84       } else if (output_format == kHexadecimal0x) {
85         ss << std::hex;
86         ss << "0x";
87       }
88       if (hash_function32)
89         ss << hash_function32(arg);
90       else if (hash_function64)
91         ss << hash_function64(arg);
92 
93       if (annotate)
94         ss << " /* \"" << arg << "\" */";
95 
96       ss << "\n";
97 
98       std::cout << ss.str();
99     }
100   }
101   return 0;
102 }
103 
104