Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f069e92e authored by Myles Watson's avatar Myles Watson
Browse files

PDL: Add GenExtractor functions to fields

Test: bluetooth_packet_parser_test
Change-Id: I6ee3ae82e8e7949f0fd30dfae6f322dcc4769190
parent 3fb8a788
Loading
Loading
Loading
Loading
+24 −37
Original line number Diff line number Diff line
@@ -71,28 +71,27 @@ Size ArrayField::GetSize() const {

  // size_field_ is of type SIZE
  if (size_field_->GetFieldType() == SizeField::kFieldType) {
    std::string ret = "Get" + util::UnderscoreToCamelCase(size_field_->GetName()) + "()";
    std::string ret = "(Get" + util::UnderscoreToCamelCase(size_field_->GetName()) + "() * 8)";
    if (!size_modifier_.empty()) ret += size_modifier_;
    return ret;
  }

  // size_field_ is of type COUNT and it is a scalar array
  if (!IsEnumArray() && !IsCustomFieldArray()) {
    return "(Get" + util::UnderscoreToCamelCase(size_field_->GetName()) + "() * " + std::to_string(element_size_ / 8) +
           ")";
  if (type_def_ == nullptr) {
    return "(Get" + util::UnderscoreToCamelCase(size_field_->GetName()) + "() * " + std::to_string(element_size_) + ")";
  }

  if (IsCustomFieldArray()) {
    if (type_def_->size_ != -1) {
      return "(Get" + util::UnderscoreToCamelCase(size_field_->GetName()) + "() * " +
             std::to_string(type_def_->size_ / 8) + ")";
      return "(Get" + util::UnderscoreToCamelCase(size_field_->GetName()) + "() * " + std::to_string(type_def_->size_) +
             ")";
    } else {
      return Size();
    }
  }

  // size_field_ is of type COUNT and it is an enum array
  return "(Get" + util::UnderscoreToCamelCase(size_field_->GetName()) + "() * " + std::to_string(type_def_->size_ / 8) +
  return "(Get" + util::UnderscoreToCamelCase(size_field_->GetName()) + "() * " + std::to_string(type_def_->size_) +
         ")";
}

@@ -114,46 +113,34 @@ std::string ArrayField::GetDataType() const {
  return "std::vector<" + util::GetTypeForSize(element_size_) + ">";
}

void ArrayField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
  if (start_offset.empty()) {
    ERROR(this) << "Can not have an array with an ambiguous start offset.";
  }

  if (start_offset.bits() % 8 != 0) {
    ERROR(this) << "Can not have an array that isn't byte aligned.";
  }

  if (GetSize().empty() && end_offset.empty()) {
    ERROR(this) << "Ambiguous end offset for array with no defined size.";
  }

  s << GetDataType();
  s << " Get" << util::UnderscoreToCamelCase(GetName()) << "() {";
  s << "ASSERT(was_validated_);";

  s << "auto it = begin() + " << start_offset.bytes() << " + " << start_offset.dynamic_string() << ";";
void ArrayField::GenExtractor(std::ostream& s, Size start_offset, Size end_offset) const {
  GenBounds(s, start_offset, end_offset, GetSize());

  if (!GetSize().empty()) {
    auto size = GetSize();
    s << "auto array_end = it + " << size.bytes() << " /* bytes */ + " << size.dynamic_string() << ";";
  } else {
    s << "auto array_end = end() - " << end_offset.bytes() << " /* bytes */ - " << end_offset.dynamic_string() << ";";
  }
  s << " auto subview = GetLittleEndianSubview(field_begin, field_end); ";
  s << "auto it = subview.begin();";

  // Add the element size so that we will extract as many elements as we can.
  s << GetDataType() << " ret;";
  s << GetDataType() << " vec;";
  if (element_size_ != -1) {
    std::string type = (type_def_ != nullptr) ? type_def_->name_ : util::GetTypeForSize(element_size_);
    s << "while (it + sizeof(" << type << ") <= array_end) {";
    s << "ret.push_back(it.extract<" << type << ">());";
    s << "while (it + sizeof(" << type << ") <= subview.end()) {";
    s << "vec.push_back(it.extract<" << type << ">());";
    s << "}";
  } else {
    s << "while (it < array_end) {";
    s << "it = " << type_def_->name_ << "::Parse(ret, it);";
    s << "while (it < subview.end()) {";
    s << "it = " << type_def_->name_ << "::Parse(vec, it);";
    s << "}";
  }
}

void ArrayField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
  s << GetDataType();
  s << " Get" << util::UnderscoreToCamelCase(GetName()) << "() {";
  s << "ASSERT(was_validated_);";

  GenExtractor(s, start_offset, end_offset);

  s << "return ret;";
  s << "return vec;";
  s << "}\n";
}

+2 −0
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@ class ArrayField : public PacketField {

  virtual std::string GetDataType() const override;

  virtual void GenExtractor(std::ostream& s, Size start_offset, Size end_offset) const override;

  virtual void GenGetter(std::ostream& s, Size start_offset, Size end_offset) const override;

  virtual bool GenBuilderParameter(std::ostream& s) const override;
+2 −0
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ std::string BodyField::GetDataType() const {
  return "BodyType";
}

void BodyField::GenExtractor(std::ostream&, Size, Size) const {}

void BodyField::GenGetter(std::ostream&, Size, Size) const {}

bool BodyField::GenBuilderParameter(std::ostream&) const {
+2 −0
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@ class BodyField : public PacketField {

  virtual std::string GetDataType() const override;

  virtual void GenExtractor(std::ostream& s, Size start_offset, Size end_offset) const override;

  virtual void GenGetter(std::ostream&, Size, Size) const override;

  virtual bool GenBuilderParameter(std::ostream&) const override;
+2 −0
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@ std::string ChecksumStartField::GetDataType() const {
  return "There's no type for Checksum Start fields";
}

void ChecksumStartField::GenExtractor(std::ostream&, Size, Size) const {}

void ChecksumStartField::GenGetter(std::ostream&, Size, Size) const {}

bool ChecksumStartField::GenBuilderParameter(std::ostream&) const {
Loading