Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix for AMI NVAR parser based on kaitai struct #373

Merged
merged 2 commits into from
Aug 4, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Regenerate cpp source files with
  • Loading branch information
chunqing286 committed Aug 4, 2023
commit 9ca73428dbe152b5365be78e99eb40df82c53616
106 changes: 23 additions & 83 deletions common/generated/ami_nvar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,18 @@
ami_nvar_t::ami_nvar_t(kaitai::kstream* p__io, kaitai::kstruct* p__parent, ami_nvar_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = this;
m_entries = 0;

try {
_read();
} catch(...) {
_clean_up();
throw;
}
m_entries = nullptr;
_read();
}

void ami_nvar_t::_read() {
m_entries = new std::vector<nvar_entry_t*>();
m_entries = std::unique_ptr<std::vector<std::unique_ptr<nvar_entry_t>>>(new std::vector<std::unique_ptr<nvar_entry_t>>());
{
int i = 0;
nvar_entry_t* _;
do {
_ = new nvar_entry_t(m__io, this, m__root);
m_entries->push_back(_);
m_entries->push_back(std::move(std::unique_ptr<nvar_entry_t>(_)));
i++;
} while (!( ((_->signature_first() != 78) || (_io()->is_eof())) ));
}
Expand All @@ -34,24 +28,12 @@ ami_nvar_t::~ami_nvar_t() {
}

void ami_nvar_t::_clean_up() {
if (m_entries) {
for (std::vector<nvar_entry_t*>::iterator it = m_entries->begin(); it != m_entries->end(); ++it) {
delete *it;
}
delete m_entries; m_entries = 0;
}
}

ami_nvar_t::nvar_attributes_t::nvar_attributes_t(kaitai::kstream* p__io, ami_nvar_t::nvar_entry_t* p__parent, ami_nvar_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;

try {
_read();
} catch(...) {
_clean_up();
throw;
}
_read();
}

void ami_nvar_t::nvar_attributes_t::_read() {
Expand All @@ -75,18 +57,12 @@ void ami_nvar_t::nvar_attributes_t::_clean_up() {
ami_nvar_t::ucs2_string_t::ucs2_string_t(kaitai::kstream* p__io, ami_nvar_t::nvar_entry_body_t* p__parent, ami_nvar_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_ucs2_chars = 0;

try {
_read();
} catch(...) {
_clean_up();
throw;
}
m_ucs2_chars = nullptr;
_read();
}

void ami_nvar_t::ucs2_string_t::_read() {
m_ucs2_chars = new std::vector<uint16_t>();
m_ucs2_chars = std::unique_ptr<std::vector<uint16_t>>(new std::vector<uint16_t>());
{
int i = 0;
uint16_t _;
Expand All @@ -103,21 +79,12 @@ ami_nvar_t::ucs2_string_t::~ucs2_string_t() {
}

void ami_nvar_t::ucs2_string_t::_clean_up() {
if (m_ucs2_chars) {
delete m_ucs2_chars; m_ucs2_chars = 0;
}
}

ami_nvar_t::nvar_extended_attributes_t::nvar_extended_attributes_t(kaitai::kstream* p__io, ami_nvar_t::nvar_entry_body_t* p__parent, ami_nvar_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;

try {
_read();
} catch(...) {
_clean_up();
throw;
}
_read();
}

void ami_nvar_t::nvar_extended_attributes_t::_read() {
Expand All @@ -138,18 +105,12 @@ void ami_nvar_t::nvar_extended_attributes_t::_clean_up() {
ami_nvar_t::nvar_entry_t::nvar_entry_t(kaitai::kstream* p__io, ami_nvar_t* p__parent, ami_nvar_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_attributes = 0;
m_body = 0;
m__io__raw_body = 0;
m_attributes = nullptr;
m_body = nullptr;
m__io__raw_body = nullptr;
f_offset = false;
f_end_offset = false;

try {
_read();
} catch(...) {
_clean_up();
throw;
}
_read();
}

void ami_nvar_t::nvar_entry_t::_read() {
Expand Down Expand Up @@ -187,14 +148,14 @@ void ami_nvar_t::nvar_entry_t::_read() {
n_attributes = true;
if (signature_first() == 78) {
n_attributes = false;
m_attributes = new nvar_attributes_t(m__io, this, m__root);
m_attributes = std::unique_ptr<nvar_attributes_t>(new nvar_attributes_t(m__io, this, m__root));
}
n_body = true;
if (signature_first() == 78) {
n_body = false;
m__raw_body = m__io->read_bytes((size() - ((4 + 2) + 4)));
m__io__raw_body = new kaitai::kstream(m__raw_body);
m_body = new nvar_entry_body_t(m__io__raw_body, this, m__root);
m__io__raw_body = std::unique_ptr<kaitai::kstream>(new kaitai::kstream(m__raw_body));
m_body = std::unique_ptr<nvar_entry_body_t>(new nvar_entry_body_t(m__io__raw_body.get(), this, m__root));
}
n_invoke_end_offset = true;
if ( ((signature_first() == 78) && (end_offset() >= 0)) ) {
Expand All @@ -217,17 +178,8 @@ void ami_nvar_t::nvar_entry_t::_clean_up() {
if (!n_next) {
}
if (!n_attributes) {
if (m_attributes) {
delete m_attributes; m_attributes = 0;
}
}
if (!n_body) {
if (m__io__raw_body) {
delete m__io__raw_body; m__io__raw_body = 0;
}
if (m_body) {
delete m_body; m_body = 0;
}
}
if (!n_invoke_end_offset) {
}
Expand All @@ -252,8 +204,8 @@ int32_t ami_nvar_t::nvar_entry_t::end_offset() {
ami_nvar_t::nvar_entry_body_t::nvar_entry_body_t(kaitai::kstream* p__io, ami_nvar_t::nvar_entry_t* p__parent, ami_nvar_t* p__root) : kaitai::kstruct(p__io) {
m__parent = p__parent;
m__root = p__root;
m_ucs2_name = 0;
m_extended_header_attributes = 0;
m_ucs2_name = nullptr;
m_extended_header_attributes = nullptr;
f_extended_header_attributes = false;
f_data_start_offset = false;
f_extended_header_size_field = false;
Expand All @@ -263,13 +215,7 @@ ami_nvar_t::nvar_entry_body_t::nvar_entry_body_t(kaitai::kstream* p__io, ami_nva
f_data_end_offset = false;
f_extended_header_size = false;
f_extended_header_hash = false;

try {
_read();
} catch(...) {
_clean_up();
throw;
}
_read();
}

void ami_nvar_t::nvar_entry_body_t::_read() {
Expand All @@ -291,7 +237,7 @@ void ami_nvar_t::nvar_entry_body_t::_read() {
n_ucs2_name = true;
if ( ((!(_parent()->attributes()->ascii_name())) && (!(_parent()->attributes()->data_only())) && (_parent()->attributes()->valid())) ) {
n_ucs2_name = false;
m_ucs2_name = new ucs2_string_t(m__io, this, m__root);
m_ucs2_name = std::unique_ptr<ucs2_string_t>(new ucs2_string_t(m__io, this, m__root));
}
n_invoke_data_start = true;
if (data_start_offset() >= 0) {
Expand All @@ -313,16 +259,10 @@ void ami_nvar_t::nvar_entry_body_t::_clean_up() {
if (!n_ascii_name) {
}
if (!n_ucs2_name) {
if (m_ucs2_name) {
delete m_ucs2_name; m_ucs2_name = 0;
}
}
if (!n_invoke_data_start) {
}
if (f_extended_header_attributes && !n_extended_header_attributes) {
if (m_extended_header_attributes) {
delete m_extended_header_attributes; m_extended_header_attributes = 0;
}
}
if (f_extended_header_size_field && !n_extended_header_size_field) {
}
Expand All @@ -336,17 +276,17 @@ void ami_nvar_t::nvar_entry_body_t::_clean_up() {

ami_nvar_t::nvar_extended_attributes_t* ami_nvar_t::nvar_entry_body_t::extended_header_attributes() {
if (f_extended_header_attributes)
return m_extended_header_attributes;
return m_extended_header_attributes.get();
n_extended_header_attributes = true;
if ( ((_parent()->attributes()->valid()) && (_parent()->attributes()->extended_header()) && (extended_header_size() >= (1 + 2))) ) {
n_extended_header_attributes = false;
std::streampos _pos = m__io->pos();
m__io->seek((_io()->pos() - extended_header_size()));
m_extended_header_attributes = new nvar_extended_attributes_t(m__io, this, m__root);
m_extended_header_attributes = std::unique_ptr<nvar_extended_attributes_t>(new nvar_extended_attributes_t(m__io, this, m__root));
m__io->seek(_pos);
f_extended_header_attributes = true;
}
return m_extended_header_attributes;
return m_extended_header_attributes.get();
}

int32_t ami_nvar_t::nvar_entry_body_t::data_start_offset() {
Expand Down
44 changes: 21 additions & 23 deletions common/generated/ami_nvar.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
#ifndef AMI_NVAR_H_
#define AMI_NVAR_H_
#pragma once

// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild

#include "../kaitai/kaitaistruct.h"
#include <stdint.h>
#include <memory>
#include <vector>

#if KAITAI_STRUCT_VERSION < 9000L
Expand All @@ -20,7 +20,7 @@ class ami_nvar_t : public kaitai::kstruct {
class nvar_entry_t;
class nvar_entry_body_t;

ami_nvar_t(kaitai::kstream* p__io, kaitai::kstruct* p__parent = 0, ami_nvar_t* p__root = 0);
ami_nvar_t(kaitai::kstream* p__io, kaitai::kstruct* p__parent = nullptr, ami_nvar_t* p__root = nullptr);

private:
void _read();
Expand All @@ -33,7 +33,7 @@ class ami_nvar_t : public kaitai::kstruct {

public:

nvar_attributes_t(kaitai::kstream* p__io, ami_nvar_t::nvar_entry_t* p__parent = 0, ami_nvar_t* p__root = 0);
nvar_attributes_t(kaitai::kstream* p__io, ami_nvar_t::nvar_entry_t* p__parent = nullptr, ami_nvar_t* p__root = nullptr);

private:
void _read();
Expand Down Expand Up @@ -71,7 +71,7 @@ class ami_nvar_t : public kaitai::kstruct {

public:

ucs2_string_t(kaitai::kstream* p__io, ami_nvar_t::nvar_entry_body_t* p__parent = 0, ami_nvar_t* p__root = 0);
ucs2_string_t(kaitai::kstream* p__io, ami_nvar_t::nvar_entry_body_t* p__parent = nullptr, ami_nvar_t* p__root = nullptr);

private:
void _read();
Expand All @@ -81,12 +81,12 @@ class ami_nvar_t : public kaitai::kstruct {
~ucs2_string_t();

private:
std::vector<uint16_t>* m_ucs2_chars;
std::unique_ptr<std::vector<uint16_t>> m_ucs2_chars;
ami_nvar_t* m__root;
ami_nvar_t::nvar_entry_body_t* m__parent;

public:
std::vector<uint16_t>* ucs2_chars() const { return m_ucs2_chars; }
std::vector<uint16_t>* ucs2_chars() const { return m_ucs2_chars.get(); }
ami_nvar_t* _root() const { return m__root; }
ami_nvar_t::nvar_entry_body_t* _parent() const { return m__parent; }
};
Expand All @@ -95,7 +95,7 @@ class ami_nvar_t : public kaitai::kstruct {

public:

nvar_extended_attributes_t(kaitai::kstream* p__io, ami_nvar_t::nvar_entry_body_t* p__parent = 0, ami_nvar_t* p__root = 0);
nvar_extended_attributes_t(kaitai::kstream* p__io, ami_nvar_t::nvar_entry_body_t* p__parent = nullptr, ami_nvar_t* p__root = nullptr);

private:
void _read();
Expand Down Expand Up @@ -127,7 +127,7 @@ class ami_nvar_t : public kaitai::kstruct {

public:

nvar_entry_t(kaitai::kstream* p__io, ami_nvar_t* p__parent = 0, ami_nvar_t* p__root = 0);
nvar_entry_t(kaitai::kstream* p__io, ami_nvar_t* p__parent = nullptr, ami_nvar_t* p__root = nullptr);

private:
void _read();
Expand Down Expand Up @@ -180,14 +180,14 @@ class ami_nvar_t : public kaitai::kstruct {
bool _is_null_next() { next(); return n_next; };

private:
nvar_attributes_t* m_attributes;
std::unique_ptr<nvar_attributes_t> m_attributes;
bool n_attributes;

public:
bool _is_null_attributes() { attributes(); return n_attributes; };

private:
nvar_entry_body_t* m_body;
std::unique_ptr<nvar_entry_body_t> m_body;
bool n_body;

public:
Expand All @@ -210,28 +210,28 @@ class ami_nvar_t : public kaitai::kstruct {
bool _is_null__raw_body() { _raw_body(); return n__raw_body; };

private:
kaitai::kstream* m__io__raw_body;
std::unique_ptr<kaitai::kstream> m__io__raw_body;

public:
std::string invoke_offset() const { return m_invoke_offset; }
uint8_t signature_first() const { return m_signature_first; }
std::string signature_rest() const { return m_signature_rest; }
uint16_t size() const { return m_size; }
uint64_t next() const { return m_next; }
nvar_attributes_t* attributes() const { return m_attributes; }
nvar_entry_body_t* body() const { return m_body; }
nvar_attributes_t* attributes() const { return m_attributes.get(); }
nvar_entry_body_t* body() const { return m_body.get(); }
std::string invoke_end_offset() const { return m_invoke_end_offset; }
ami_nvar_t* _root() const { return m__root; }
ami_nvar_t* _parent() const { return m__parent; }
std::string _raw_body() const { return m__raw_body; }
kaitai::kstream* _io__raw_body() const { return m__io__raw_body; }
kaitai::kstream* _io__raw_body() const { return m__io__raw_body.get(); }
};

class nvar_entry_body_t : public kaitai::kstruct {

public:

nvar_entry_body_t(kaitai::kstream* p__io, ami_nvar_t::nvar_entry_t* p__parent = 0, ami_nvar_t* p__root = 0);
nvar_entry_body_t(kaitai::kstream* p__io, ami_nvar_t::nvar_entry_t* p__parent = nullptr, ami_nvar_t* p__root = nullptr);

private:
void _read();
Expand All @@ -242,7 +242,7 @@ class ami_nvar_t : public kaitai::kstruct {

private:
bool f_extended_header_attributes;
nvar_extended_attributes_t* m_extended_header_attributes;
std::unique_ptr<nvar_extended_attributes_t> m_extended_header_attributes;
bool n_extended_header_attributes;

public:
Expand Down Expand Up @@ -355,7 +355,7 @@ class ami_nvar_t : public kaitai::kstruct {
bool _is_null_ascii_name() { ascii_name(); return n_ascii_name; };

private:
ucs2_string_t* m_ucs2_name;
std::unique_ptr<ucs2_string_t> m_ucs2_name;
bool n_ucs2_name;

public:
Expand All @@ -377,22 +377,20 @@ class ami_nvar_t : public kaitai::kstruct {
uint8_t guid_index() const { return m_guid_index; }
std::string guid() const { return m_guid; }
std::string ascii_name() const { return m_ascii_name; }
ucs2_string_t* ucs2_name() const { return m_ucs2_name; }
ucs2_string_t* ucs2_name() const { return m_ucs2_name.get(); }
std::string invoke_data_start() const { return m_invoke_data_start; }
std::string data() const { return m_data; }
ami_nvar_t* _root() const { return m__root; }
ami_nvar_t::nvar_entry_t* _parent() const { return m__parent; }
};

private:
std::vector<nvar_entry_t*>* m_entries;
std::unique_ptr<std::vector<std::unique_ptr<nvar_entry_t>>> m_entries;
ami_nvar_t* m__root;
kaitai::kstruct* m__parent;

public:
std::vector<nvar_entry_t*>* entries() const { return m_entries; }
std::vector<std::unique_ptr<nvar_entry_t>>* entries() const { return m_entries.get(); }
ami_nvar_t* _root() const { return m__root; }
kaitai::kstruct* _parent() const { return m__parent; }
};

#endif // AMI_NVAR_H_