mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-27 20:58:05 +00:00
Json : Add --size-prefixed option to flatc (#4645)
to be able to convert to json size prefixed buffers.
This commit is contained in:
committed by
Wouter van Oortmerssen
parent
cc158e7009
commit
e78825e7a0
@@ -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 {
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
" (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) {
|
|||||||
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) {
|
|||||||
"\" 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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
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() {
|
|||||||
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,
|
||||||
|
|||||||
Reference in New Issue
Block a user