Skip to content

Commit

Permalink
[BinaryAnnotator] Add more options that control the generation of `.a…
Browse files Browse the repository at this point in the history
…fb` files (#8323)

* [BinaryAnnotator] Add more options that control the generation of `.afb` files.

* [BinaryAnnotator] Update the include paths.
  • Loading branch information
anton-bobukh authored May 29, 2024
1 parent 8755c35 commit 6ede1cc
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 23 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -153,3 +153,5 @@ cmake-build-debug/
_deps/
**/.gradle/**
kotlin/**/generated
MODULE.bazel
MODULE.bazel.lock
24 changes: 15 additions & 9 deletions src/annotated_binary_text_gen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,8 @@ static void GenerateSection(std::ostream &os, const BinarySection &section,
} // namespace

bool AnnotatedBinaryTextGenerator::Generate(
const std::string &filename, const std::string &schema_filename) {
const std::string &filename, const std::string &schema_filename,
const std::string &output_filename) {
OutputConfig output_config;
output_config.max_bytes_per_line = options_.max_bytes_per_line;
output_config.include_vector_contents = options_.include_vector_contents;
Expand Down Expand Up @@ -435,18 +436,23 @@ bool AnnotatedBinaryTextGenerator::Generate(
}
}

// Modify the output filename.
std::string output_filename = StripExtension(filename);
output_filename += options_.output_postfix;
output_filename +=
"." + (options_.output_extension.empty() ? GetExtension(filename)
: options_.output_extension);
std::string out = output_filename;
if (out.empty()) {
// Modify the output filename.
out = StripExtension(filename);
out += options_.output_postfix;
out +=
"." + (options_.output_extension.empty() ? GetExtension(filename)
: options_.output_extension);
}

std::ofstream ofs(output_filename.c_str());
std::ofstream ofs(out.c_str());

ofs << "// Annotated Flatbuffer Binary" << std::endl;
ofs << "//" << std::endl;
ofs << "// Schema file: " << schema_filename << std::endl;
if (!schema_filename.empty()) {
ofs << "// Schema file: " << schema_filename << std::endl;
}
ofs << "// Binary file: " << filename << std::endl;

// Generate each of the binary sections
Expand Down
4 changes: 2 additions & 2 deletions src/annotated_binary_text_gen.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ class AnnotatedBinaryTextGenerator {

// Generate the annotated binary for the given `filename`. Returns true if the
// annotated binary was successfully saved.
bool Generate(const std::string &filename,
const std::string &schema_filename);
bool Generate(const std::string &filename, const std::string &schema_filename,
const std::string &output_filename = "");

private:
const std::map<uint64_t, BinarySection> annotations_;
Expand Down
25 changes: 16 additions & 9 deletions src/binary_annotator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,12 +120,13 @@ static BinarySection GenerateMissingSection(const uint64_t offset,
} // namespace

std::map<uint64_t, BinarySection> BinaryAnnotator::Annotate() {
flatbuffers::Verifier verifier(bfbs_, static_cast<size_t>(bfbs_length_));

if ((is_size_prefixed_ &&
!reflection::VerifySizePrefixedSchemaBuffer(verifier)) ||
!reflection::VerifySchemaBuffer(verifier)) {
return {};
if (bfbs_ != nullptr && bfbs_length_ != 0) {
flatbuffers::Verifier verifier(bfbs_, static_cast<size_t>(bfbs_length_));
if ((is_size_prefixed_ &&
!reflection::VerifySizePrefixedSchemaBuffer(verifier)) ||
!reflection::VerifySchemaBuffer(verifier)) {
return {};
}
}

// The binary is too short to read as a flatbuffers.
Expand All @@ -141,8 +142,7 @@ std::map<uint64_t, BinarySection> BinaryAnnotator::Annotate() {

if (IsValidOffset(root_table_offset)) {
// Build the root table, and all else will be referenced from it.
BuildTable(root_table_offset, BinarySectionType::RootTable,
schema_->root_table());
BuildTable(root_table_offset, BinarySectionType::RootTable, RootTable());
}

// Now that all the sections are built, make sure the binary sections are
Expand Down Expand Up @@ -203,7 +203,7 @@ uint64_t BinaryAnnotator::BuildHeader(const uint64_t header_offset) {

BinaryRegionComment root_offset_comment;
root_offset_comment.type = BinaryRegionCommentType::RootTableOffset;
root_offset_comment.name = schema_->root_table()->name()->str();
root_offset_comment.name = RootTable()->name()->str();

if (!IsValidOffset(root_table_loc)) {
SetError(root_offset_comment,
Expand Down Expand Up @@ -1516,4 +1516,11 @@ bool BinaryAnnotator::ContainsSection(const uint64_t offset) {
it->second.regions.back().length;
}

const reflection::Object *BinaryAnnotator::RootTable() const {
if (!root_table_.empty()) {
return schema_->objects()->LookupByKey(root_table_);
}
return schema_->root_table();
}

} // namespace flatbuffers
27 changes: 24 additions & 3 deletions src/binary_annotator.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,21 @@
#ifndef FLATBUFFERS_BINARY_ANNOTATOR_H_
#define FLATBUFFERS_BINARY_ANNOTATOR_H_

#include <cstddef>
#include <cstdint>
#include <iomanip>
#include <ios>
#include <list>
#include <map>
#include <sstream>
#include <string>
#include <utility>
#include <vector>

#include "flatbuffers/base.h"
#include "flatbuffers/reflection.h"
#include "flatbuffers/reflection_generated.h"
#include "flatbuffers/stl_emulation.h"
#include "flatbuffers/util.h"

namespace flatbuffers {

Expand Down Expand Up @@ -227,7 +233,7 @@ inline static std::string ToString(const BinaryRegionType type) {
case BinaryRegionType::Uint8: return "uint8_t";
case BinaryRegionType::Uint16: return "uint16_t";
case BinaryRegionType::Uint32: return "uint32_t";
case BinaryRegionType::Uint64: return "uint64_t"; ;
case BinaryRegionType::Uint64: return "uint64_t";
case BinaryRegionType::Int8: return "int8_t";
case BinaryRegionType::Int16: return "int16_t";
case BinaryRegionType::Int32: return "int32_t";
Expand All @@ -250,6 +256,18 @@ class BinaryAnnotator {
: bfbs_(bfbs),
bfbs_length_(bfbs_length),
schema_(reflection::GetSchema(bfbs)),
root_table_(""),
binary_(binary),
binary_length_(binary_length),
is_size_prefixed_(is_size_prefixed) {}

BinaryAnnotator(const reflection::Schema *schema,
const std::string &root_table, const uint8_t *binary,
uint64_t binary_length, bool is_size_prefixed)
: bfbs_(nullptr),
bfbs_length_(0),
schema_(schema),
root_table_(root_table),
binary_(binary),
binary_length_(binary_length),
is_size_prefixed_(is_size_prefixed) {}
Expand Down Expand Up @@ -329,7 +347,7 @@ class BinaryAnnotator {
}

// Adds the provided `section` keyed by the `offset` it occurs at. If a
// section is already added at that offset, it doesn't replace the exisiting
// section is already added at that offset, it doesn't replace the existing
// one.
void AddSection(const uint64_t offset, const BinarySection &section) {
sections_.insert(std::make_pair(offset, section));
Expand Down Expand Up @@ -384,10 +402,13 @@ class BinaryAnnotator {

bool ContainsSection(const uint64_t offset);

const reflection::Object *RootTable() const;

// The schema for the binary file
const uint8_t *bfbs_;
const uint64_t bfbs_length_;
const reflection::Schema *schema_;
const std::string root_table_;

// The binary data itself.
const uint8_t *binary_;
Expand Down

0 comments on commit 6ede1cc

Please sign in to comment.