diff --git a/lib/libimhex/include/hex/pattern_language/ast_node.hpp b/lib/libimhex/include/hex/pattern_language/ast_node.hpp index 86b0e04d4..e2d6e5f11 100644 --- a/lib/libimhex/include/hex/pattern_language/ast_node.hpp +++ b/lib/libimhex/include/hex/pattern_language/ast_node.hpp @@ -89,7 +89,7 @@ namespace hex::pl { } public: - void addAttribute(ASTNodeAttribute *attribute) { + virtual void addAttribute(ASTNodeAttribute *attribute) { this->m_attributes.push_back(attribute); } @@ -482,6 +482,13 @@ namespace hex::pl { return patterns; } + void addAttribute(ASTNodeAttribute *attribute) override { + Attributable::addAttribute(attribute); + + if (auto attributable = dynamic_cast(this->m_type); attributable != nullptr) + attributable->addAttribute(static_cast(attribute->clone())); + } + private: std::string m_name; ASTNode *m_type; @@ -1517,6 +1524,15 @@ namespace hex::pl { delete field; }; + auto &attributes = this->getAttributes(); + + bool isLeftToRight = false; + + if (std::any_of(attributes.begin(), attributes.end(), [](ASTNodeAttribute *attribute) { return attribute->getAttribute() == "left_to_right" && !attribute->getValue().has_value(); })) + isLeftToRight = true; + else if (std::any_of(attributes.begin(), attributes.end(), [](ASTNodeAttribute *attribute) { return attribute->getAttribute() == "right_to_left" && !attribute->getValue().has_value(); })) + isLeftToRight = false; + evaluator->pushScope(pattern, fields); for (auto [name, bitSizeNode] : this->m_entries) { auto literal = bitSizeNode->evaluate(evaluator); @@ -1532,7 +1548,11 @@ namespace hex::pl { if (name != "padding") { auto field = new PatternDataBitfieldField(evaluator, evaluator->dataOffset(), bitOffset, bitSize, pattern); field->setVariableName(name); - fields.push_back(field); + + if (isLeftToRight) + fields.insert(fields.begin(), field); + else + fields.push_back(field); } bitOffset += bitSize; diff --git a/lib/libimhex/include/hex/pattern_language/pattern_data.hpp b/lib/libimhex/include/hex/pattern_language/pattern_data.hpp index 0d762889e..c49912832 100644 --- a/lib/libimhex/include/hex/pattern_language/pattern_data.hpp +++ b/lib/libimhex/include/hex/pattern_language/pattern_data.hpp @@ -1469,7 +1469,7 @@ namespace hex::pl { std::vector value(this->m_bitField->getSize(), 0); provider->read(this->m_bitField->getOffset(), &value[0], value.size()); - if (this->m_bitField->getEndian() == std::endian::little) + if (this->m_bitField->getEndian() != std::endian::native) std::reverse(value.begin(), value.end()); ImGui::TableNextRow();