Home | History | Annotate | Download | only in src
      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