Commit e78825e7 authored by desqaz's avatar desqaz Committed by Wouter van Oortmerssen

Json : Add --size-prefixed option to flatc (#4645)

to be able to convert to json size prefixed buffers.
parent cc158e70
...@@ -1664,13 +1664,14 @@ const T *GetTemporaryPointer(FlatBufferBuilder &fbb, Offset<T> offset) { ...@@ -1664,13 +1664,14 @@ const T *GetTemporaryPointer(FlatBufferBuilder &fbb, Offset<T> offset) {
/// This function is UNDEFINED for FlatBuffers whose schema does not include /// This function is UNDEFINED for FlatBuffers whose schema does not include
/// a file_identifier (likely points at padding or the start of a the root /// a file_identifier (likely points at padding or the start of a the root
/// vtable). /// vtable).
inline const char *GetBufferIdentifier(const void *buf) { inline const char *GetBufferIdentifier(const void *buf, bool size_prefixed = false) {
return reinterpret_cast<const char *>(buf) + sizeof(uoffset_t); return reinterpret_cast<const char *>(buf) +
((size_prefixed) ? 2 * sizeof(uoffset_t) : sizeof(uoffset_t));
} }
// Helper to see if the identifier in a buffer has the expected value. // Helper to see if the identifier in a buffer has the expected value.
inline bool BufferHasIdentifier(const void *buf, const char *identifier) { inline bool BufferHasIdentifier(const void *buf, const char *identifier, bool size_prefixed = false) {
return strncmp(GetBufferIdentifier(buf), identifier, return strncmp(GetBufferIdentifier(buf, size_prefixed), identifier,
FlatBufferBuilder::kFileIdentifierLength) == 0; FlatBufferBuilder::kFileIdentifierLength) == 0;
} }
......
...@@ -387,6 +387,7 @@ struct IDLOptions { ...@@ -387,6 +387,7 @@ struct IDLOptions {
std::string go_namespace; std::string go_namespace;
bool reexport_ts_modules; bool reexport_ts_modules;
bool protobuf_ascii_alike; bool protobuf_ascii_alike;
bool size_prefixed;
// Possible options for the more general generator below. // Possible options for the more general generator below.
enum Language { enum Language {
...@@ -442,6 +443,7 @@ struct IDLOptions { ...@@ -442,6 +443,7 @@ struct IDLOptions {
skip_flatbuffers_import(false), skip_flatbuffers_import(false),
reexport_ts_modules(true), reexport_ts_modules(true),
protobuf_ascii_alike(false), protobuf_ascii_alike(false),
size_prefixed(false),
lang(IDLOptions::kJava), lang(IDLOptions::kJava),
mini_reflect(IDLOptions::kNone), mini_reflect(IDLOptions::kNone),
lang_to_generate(0) {} lang_to_generate(0) {}
......
...@@ -100,6 +100,7 @@ std::string FlatCompiler::GetUsageString(const char *program_name) const { ...@@ -100,6 +100,7 @@ std::string FlatCompiler::GetUsageString(const char *program_name) const {
" (default is \"github.com/google/flatbuffers/go\")\n" " (default is \"github.com/google/flatbuffers/go\")\n"
" --raw-binary Allow binaries without file_indentifier to be read.\n" " --raw-binary Allow binaries without file_indentifier to be read.\n"
" This may crash flatc given a mismatched schema.\n" " This may crash flatc given a mismatched schema.\n"
" --size-prefixed Input binaries are size prefixed buffers.\n"
" --proto Input is a .proto, translate to .fbs.\n" " --proto Input is a .proto, translate to .fbs.\n"
" --oneof-union Translate .proto oneofs to flatbuffer unions.\n" " --oneof-union Translate .proto oneofs to flatbuffer unions.\n"
" --grpc Generate GRPC interfaces for the specified languages\n" " --grpc Generate GRPC interfaces for the specified languages\n"
...@@ -233,6 +234,8 @@ int FlatCompiler::Compile(int argc, const char **argv) { ...@@ -233,6 +234,8 @@ int FlatCompiler::Compile(int argc, const char **argv) {
opts.one_file = true; opts.one_file = true;
} else if (arg == "--raw-binary") { } else if (arg == "--raw-binary") {
raw_binary = true; raw_binary = true;
} else if (arg == "--size-prefixed") {
opts.size_prefixed = true;
} else if (arg == "--") { // Separator between text and binary inputs. } else if (arg == "--") { // Separator between text and binary inputs.
binary_files_from = filenames.size(); binary_files_from = filenames.size();
} else if (arg == "--proto") { } else if (arg == "--proto") {
...@@ -325,7 +328,7 @@ int FlatCompiler::Compile(int argc, const char **argv) { ...@@ -325,7 +328,7 @@ int FlatCompiler::Compile(int argc, const char **argv) {
"\" matches the schema, use --raw-binary to read this file" "\" matches the schema, use --raw-binary to read this file"
" anyway."); " anyway.");
} else if (!flatbuffers::BufferHasIdentifier( } else if (!flatbuffers::BufferHasIdentifier(
contents.c_str(), parser->file_identifier_.c_str())) { contents.c_str(), parser->file_identifier_.c_str(), opts.size_prefixed)) {
Error("binary \"" + filename + Error("binary \"" + filename +
"\" does not have expected file_identifier \"" + "\" does not have expected file_identifier \"" +
parser->file_identifier_ + parser->file_identifier_ +
......
...@@ -263,8 +263,9 @@ bool GenerateText(const Parser &parser, const void *flatbuffer, ...@@ -263,8 +263,9 @@ bool GenerateText(const Parser &parser, const void *flatbuffer,
std::string &text = *_text; std::string &text = *_text;
assert(parser.root_struct_def_); // call SetRootType() assert(parser.root_struct_def_); // call SetRootType()
text.reserve(1024); // Reduce amount of inevitable reallocs. text.reserve(1024); // Reduce amount of inevitable reallocs.
if (!GenStruct(*parser.root_struct_def_, GetRoot<Table>(flatbuffer), 0, auto root = parser.opts.size_prefixed ?
parser.opts, _text)) { GetSizePrefixedRoot<Table>(flatbuffer) : GetRoot<Table>(flatbuffer);
if (!GenStruct(*parser.root_struct_def_, root, 0, parser.opts, _text)) {
return false; return false;
} }
text += NewLine(parser.opts); text += NewLine(parser.opts);
......
...@@ -2412,9 +2412,15 @@ CheckedError Parser::DoParse(const char *source, const char **include_paths, ...@@ -2412,9 +2412,15 @@ CheckedError Parser::DoParse(const char *source, const char **include_paths,
} }
uoffset_t toff; uoffset_t toff;
ECHECK(ParseTable(*root_struct_def_, nullptr, &toff)); ECHECK(ParseTable(*root_struct_def_, nullptr, &toff));
builder_.Finish(Offset<Table>(toff), file_identifier_.length() if (opts.size_prefixed) {
? file_identifier_.c_str() builder_.FinishSizePrefixed(Offset<Table>(toff), file_identifier_.length()
: nullptr); ? file_identifier_.c_str()
: nullptr);
} else {
builder_.Finish(Offset<Table>(toff), file_identifier_.length()
? file_identifier_.c_str()
: nullptr);
}
} else if (IsIdent("enum")) { } else if (IsIdent("enum")) {
ECHECK(ParseEnum(false, nullptr)); ECHECK(ParseEnum(false, nullptr));
} else if (IsIdent("union")) { } else if (IsIdent("union")) {
...@@ -2521,7 +2527,11 @@ void Parser::Serialize() { ...@@ -2521,7 +2527,11 @@ void Parser::Serialize() {
builder_.CreateString(file_identifier_), builder_.CreateString(file_identifier_),
builder_.CreateString(file_extension_), builder_.CreateString(file_extension_),
root_struct_def_ ? root_struct_def_->serialized_location : 0); root_struct_def_ ? root_struct_def_->serialized_location : 0);
builder_.Finish(schema_offset, reflection::SchemaIdentifier()); if (opts.size_prefixed) {
builder_.FinishSizePrefixed(schema_offset, reflection::SchemaIdentifier());
} else {
builder_.Finish(schema_offset, reflection::SchemaIdentifier());
}
} }
Offset<reflection::Object> StructDef::Serialize(FlatBufferBuilder *builder, Offset<reflection::Object> StructDef::Serialize(FlatBufferBuilder *builder,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment