mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-02 04:04:19 +00:00
Added .proto parsing and convertion to .fbs.
Bug: 15777858 Change-Id: Iabef9b8c8044e593bb89510feebdee00d2f1840b Tested: on Linux and Windows.
This commit is contained in:
107
src/flatc.cpp
107
src/flatc.cpp
@@ -60,29 +60,29 @@ struct Generator {
|
||||
const std::string &path,
|
||||
const std::string &file_name,
|
||||
const flatbuffers::GeneratorOptions &opts);
|
||||
const char *extension;
|
||||
const char *opt;
|
||||
const char *name;
|
||||
flatbuffers::GeneratorOptions::Language lang;
|
||||
const char *help;
|
||||
};
|
||||
|
||||
const Generator generators[] = {
|
||||
{ flatbuffers::GenerateBinary, "b", "binary",
|
||||
{ flatbuffers::GenerateBinary, "-b", "binary",
|
||||
flatbuffers::GeneratorOptions::kMAX,
|
||||
"Generate wire format binaries for any data definitions" },
|
||||
{ flatbuffers::GenerateTextFile, "t", "text",
|
||||
{ flatbuffers::GenerateTextFile, "-t", "text",
|
||||
flatbuffers::GeneratorOptions::kMAX,
|
||||
"Generate text output for any data definitions" },
|
||||
{ flatbuffers::GenerateCPP, "c", "C++",
|
||||
{ flatbuffers::GenerateCPP, "-c", "C++",
|
||||
flatbuffers::GeneratorOptions::kMAX,
|
||||
"Generate C++ headers for tables/structs" },
|
||||
{ flatbuffers::GenerateGo, "g", "Go",
|
||||
{ flatbuffers::GenerateGo, "-g", "Go",
|
||||
flatbuffers::GeneratorOptions::kMAX,
|
||||
"Generate Go files for tables/structs" },
|
||||
{ flatbuffers::GenerateGeneral, "j", "Java",
|
||||
{ flatbuffers::GenerateGeneral, "-j", "Java",
|
||||
flatbuffers::GeneratorOptions::kJava,
|
||||
"Generate Java classes for tables/structs" },
|
||||
{ flatbuffers::GenerateGeneral, "n", "C#",
|
||||
{ flatbuffers::GenerateGeneral, "-n", "C#",
|
||||
flatbuffers::GeneratorOptions::kCSharp,
|
||||
"Generate C# classes for tables/structs" }
|
||||
};
|
||||
@@ -98,31 +98,33 @@ static void Error(const char *err, const char *obj, bool usage,
|
||||
if (usage) {
|
||||
printf("usage: %s [OPTION]... FILE... [-- FILE...]\n", program_name);
|
||||
for (size_t i = 0; i < sizeof(generators) / sizeof(generators[0]); ++i)
|
||||
printf(" -%s %s.\n", generators[i].extension, generators[i].help);
|
||||
printf(" -o PATH Prefix PATH to all generated files.\n"
|
||||
" -I PATH Search for includes in the specified path.\n"
|
||||
" -S Strict JSON: add quotes to field names.\n"
|
||||
" -P Don\'t prefix enum values with the enum name in C++.\n"
|
||||
" -H Generate include statements for included schemas the\n"
|
||||
" generated file depends on (C++).\n"
|
||||
"FILEs may depend on declarations in earlier files.\n"
|
||||
"FILEs after the -- must be binary flatbuffer format files.\n"
|
||||
"Output files are named using the base file name of the input,"
|
||||
"and written to the current directory or the path given by -o.\n"
|
||||
"example: %s -c -b schema1.fbs schema2.fbs data.json\n",
|
||||
program_name);
|
||||
printf(" %s %s.\n", generators[i].opt, generators[i].help);
|
||||
printf(
|
||||
" -o PATH Prefix PATH to all generated files.\n"
|
||||
" -I PATH Search for includes in the specified path.\n"
|
||||
" --strict-json Strict JSON: add quotes to field names.\n"
|
||||
" --no-prefix Don\'t prefix enum values with the enum type in C++.\n"
|
||||
" --gen-includes Generate include statements for included schemas the\n"
|
||||
" generated file depends on (C++).\n"
|
||||
" --proto Input is a .proto, translate to .fbs.\n"
|
||||
"FILEs may depend on declarations in earlier files.\n"
|
||||
"FILEs after the -- must be binary flatbuffer format files.\n"
|
||||
"Output files are named using the base file name of the input,"
|
||||
"and written to the current directory or the path given by -o.\n"
|
||||
"example: %s -c -b schema1.fbs schema2.fbs data.json\n",
|
||||
program_name);
|
||||
}
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int argc, const char *argv[]) {
|
||||
program_name = argv[0];
|
||||
flatbuffers::Parser parser;
|
||||
flatbuffers::GeneratorOptions opts;
|
||||
std::string output_path;
|
||||
const size_t num_generators = sizeof(generators) / sizeof(generators[0]);
|
||||
bool generator_enabled[num_generators] = { false };
|
||||
bool any_generator = false;
|
||||
bool proto_mode = false;
|
||||
std::vector<std::string> filenames;
|
||||
std::vector<const char *> include_directories;
|
||||
size_t binary_files_from = std::numeric_limits<size_t>::max();
|
||||
@@ -131,40 +133,34 @@ int main(int argc, const char *argv[]) {
|
||||
if (arg[0] == '-') {
|
||||
if (filenames.size() && arg[1] != '-')
|
||||
Error("invalid option location", arg, true);
|
||||
if (strlen(arg) != 2)
|
||||
Error("invalid commandline argument", arg, true);
|
||||
switch (arg[1]) {
|
||||
case 'o':
|
||||
if (++i >= argc) Error("missing path following", arg, true);
|
||||
output_path = flatbuffers::ConCatPathFileName(argv[i], "");
|
||||
break;
|
||||
case 'I':
|
||||
if (++i >= argc) Error("missing path following", arg, true);
|
||||
include_directories.push_back(argv[i]);
|
||||
break;
|
||||
case 'S':
|
||||
opts.strict_json = true;
|
||||
break;
|
||||
case 'P':
|
||||
opts.prefixed_enums = false;
|
||||
break;
|
||||
case 'H':
|
||||
opts.include_dependence_headers = true;
|
||||
break;
|
||||
case '-': // Separator between text and binary input files.
|
||||
binary_files_from = filenames.size();
|
||||
break;
|
||||
default:
|
||||
for (size_t i = 0; i < num_generators; ++i) {
|
||||
if(!strcmp(arg+1, generators[i].extension)) {
|
||||
generator_enabled[i] = true;
|
||||
any_generator = true;
|
||||
goto found;
|
||||
}
|
||||
std::string opt = arg;
|
||||
if (opt == "-o") {
|
||||
if (++i >= argc) Error("missing path following", arg, true);
|
||||
output_path = flatbuffers::ConCatPathFileName(argv[i], "");
|
||||
} else if(opt == "-I") {
|
||||
if (++i >= argc) Error("missing path following", arg, true);
|
||||
include_directories.push_back(argv[i]);
|
||||
} else if(opt == "--strict-json") {
|
||||
opts.strict_json = true;
|
||||
} else if(opt == "--no-prefix") {
|
||||
opts.prefixed_enums = false;
|
||||
} else if(opt == "--gen-includes") {
|
||||
opts.include_dependence_headers = true;
|
||||
} else if(opt == "--") { // Separator between text and binary inputs.
|
||||
binary_files_from = filenames.size();
|
||||
} else if(opt == "--proto") {
|
||||
proto_mode = true;
|
||||
any_generator = true;
|
||||
} else {
|
||||
for (size_t i = 0; i < num_generators; ++i) {
|
||||
if(opt == generators[i].opt) {
|
||||
generator_enabled[i] = true;
|
||||
any_generator = true;
|
||||
goto found;
|
||||
}
|
||||
Error("unknown commandline argument", arg, true);
|
||||
found:
|
||||
break;
|
||||
}
|
||||
Error("unknown commandline argument", arg, true);
|
||||
found:;
|
||||
}
|
||||
} else {
|
||||
filenames.push_back(argv[i]);
|
||||
@@ -178,6 +174,7 @@ int main(int argc, const char *argv[]) {
|
||||
"specify one of -c -g -j -t -b etc.", true);
|
||||
|
||||
// Now process the files:
|
||||
flatbuffers::Parser parser(proto_mode);
|
||||
for (auto file_it = filenames.begin();
|
||||
file_it != filenames.end();
|
||||
++file_it) {
|
||||
@@ -219,6 +216,8 @@ int main(int argc, const char *argv[]) {
|
||||
}
|
||||
}
|
||||
|
||||
if (proto_mode) GenerateFBS(parser, output_path, filebase, opts);
|
||||
|
||||
// We do not want to generate code for the definitions in this file
|
||||
// in any files coming up next.
|
||||
parser.MarkGenerated();
|
||||
|
||||
Reference in New Issue
Block a user