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

Commit 6b23b966 authored by Myles Watson's avatar Myles Watson
Browse files

PDL: Add variable-sized structs

Test: bluetooth_packet_parser_test
Change-Id: Ib003d3b9e125167c14c89bdca316d013dee9bd0d
parent d539cc98
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ cc_binary_host {
        "fields/scalar_field.cc",
        "fields/size_field.cc",
        "fields/struct_field.cc",
        "fields/variable_length_struct_field.cc",
        "checksum_def.cc",
        "custom_field_def.cc",
        "enum_def.cc",
@@ -27,6 +28,7 @@ cc_binary_host {
        "packet_def.cc",
        "parent_def.cc",
        "struct_def.cc",
        "struct_parser_generator.cc",
        "main.cc",
        "language_y.yy",
        "language_l.ll",
+1 −0
Original line number Diff line number Diff line
@@ -32,4 +32,5 @@
#include "fields/scalar_field.h"
#include "fields/size_field.h"
#include "fields/struct_field.h"
#include "fields/variable_length_struct_field.h"
#include "fields/vector_field.h"
+23 −2
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

#include "fields/array_field.h"

#include "fields/custom_field.h"
#include "fields/scalar_field.h"
#include "util.h"

const std::string ArrayField::kFieldType = "ArrayField";
@@ -52,6 +54,10 @@ Size ArrayField::GetSize() const {
Size ArrayField::GetBuilderSize() const {
  if (!element_size_.empty() && !element_size_.has_dynamic()) {
    return GetSize();
  } else if (element_field_->BuilderParameterMustBeMoved()) {
    std::string ret = "[this](){ size_t length = 0; for (const auto& elem : " + GetName() +
                      "_) { length += elem->size() * 8; } return length; }()";
    return ret;
  } else {
    std::string ret = "[this](){ size_t length = 0; for (const auto& elem : " + GetName() +
                      "_) { length += elem.size() * 8; } return length; }()";
@@ -73,8 +79,15 @@ void ArrayField::GenExtractor(std::ostream& s, int num_leading_bits) const {
    s << "while (" << element_field_->GetName() << "_it.NumBytesRemaining() > 0 ";
    s << " && ret_it < " << GetName() << "_ptr->end()) {";
  }
  if (element_field_->BuilderParameterMustBeMoved()) {
    s << element_field_->GetDataType() << " " << element_field_->GetName() << "_ptr;";
  } else {
    s << element_field_->GetDataType() << "* " << element_field_->GetName() << "_ptr = ret_it;";
  }
  element_field_->GenExtractor(s, num_leading_bits);
  if (element_field_->BuilderParameterMustBeMoved()) {
    s << "*ret_it = std::move(" << element_field_->GetName() << "_ptr);";
  }
  s << "ret_it++;";
  s << "}";
}
@@ -96,10 +109,18 @@ void ArrayField::GenGetter(std::ostream& s, Size start_offset, Size end_offset)
}

bool ArrayField::GenBuilderParameter(std::ostream& s) const {
  if (element_field_->BuilderParameterMustBeMoved()) {
    s << "std::array<" << element_field_->GetDataType() << "," << array_size_ << "> " << GetName();
  } else {
    s << "const std::array<" << element_field_->GetDataType() << "," << array_size_ << ">& " << GetName();
  }
  return true;
}

bool ArrayField::BuilderParameterMustBeMoved() const {
  return element_field_->BuilderParameterMustBeMoved();
}

bool ArrayField::GenBuilderMember(std::ostream& s) const {
  s << "std::array<" << element_field_->GetDataType() << "," << array_size_ << "> " << GetName();
  return true;
+3 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

#pragma once

#include "fields/all_fields.h"
#include "fields/packet_field.h"
#include "parse_location.h"
#include "type_def.h"

@@ -42,6 +42,8 @@ class ArrayField : public PacketField {

  virtual bool GenBuilderParameter(std::ostream& s) const override;

  virtual bool BuilderParameterMustBeMoved() const override;

  virtual bool GenBuilderMember(std::ostream& s) const override;

  virtual bool HasParameterValidator() const override;
+4 −0
Original line number Diff line number Diff line
@@ -68,6 +68,10 @@ int PacketField::GenBounds(std::ostream& s, Size start_offset, Size end_offset)
  return 0;  // num_leading_bits
}

bool PacketField::BuilderParameterMustBeMoved() const {
  return false;
}

bool PacketField::GenBuilderMember(std::ostream& s) const {
  return GenBuilderParameter(s);
}
Loading