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
Next Next commit
Fix for AMI NVAR parser based on kaitai struct by modifing 1 line (li…
…ne 128) for ami_nvar.ksy.
  • Loading branch information
chunqing286 committed Aug 3, 2023
commit ade5a59807d54086f368c2ad47f61fbf95833a48
118 changes: 89 additions & 29 deletions common/generated/ami_nvar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,25 @@

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; (void)p__root;
m_entries = nullptr;
_read();
m__root = this;
m_entries = 0;

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

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

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

void ami_nvar_t::nvar_attributes_t::_read() {
Expand All @@ -57,12 +75,18 @@ 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 = nullptr;
_read();
m_ucs2_chars = 0;

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

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

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

void ami_nvar_t::nvar_extended_attributes_t::_read() {
Expand All @@ -105,12 +138,18 @@ 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 = nullptr;
m_body = nullptr;
m__io__raw_body = nullptr;
m_attributes = 0;
m_body = 0;
m__io__raw_body = 0;
f_offset = false;
f_end_offset = false;
_read();

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

void ami_nvar_t::nvar_entry_t::_read() {
Expand Down Expand Up @@ -148,14 +187,14 @@ void ami_nvar_t::nvar_entry_t::_read() {
n_attributes = true;
if (signature_first() == 78) {
n_attributes = false;
m_attributes = std::unique_ptr<nvar_attributes_t>(new nvar_attributes_t(m__io, this, m__root));
m_attributes = 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 = 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));
m__io__raw_body = new kaitai::kstream(m__raw_body);
m_body = new nvar_entry_body_t(m__io__raw_body, this, m__root);
}
n_invoke_end_offset = true;
if ( ((signature_first() == 78) && (end_offset() >= 0)) ) {
Expand All @@ -178,8 +217,17 @@ 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 @@ -188,24 +236,24 @@ void ami_nvar_t::nvar_entry_t::_clean_up() {
int32_t ami_nvar_t::nvar_entry_t::offset() {
if (f_offset)
return m_offset;
m_offset = (int32_t)_io()->pos();
m_offset = _io()->pos();
f_offset = true;
return m_offset;
}

int32_t ami_nvar_t::nvar_entry_t::end_offset() {
if (f_end_offset)
return m_end_offset;
m_end_offset = (int32_t)_io()->pos();
m_end_offset = _io()->pos();
f_end_offset = true;
return m_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 = nullptr;
m_extended_header_attributes = nullptr;
m_ucs2_name = 0;
m_extended_header_attributes = 0;
f_extended_header_attributes = false;
f_data_start_offset = false;
f_extended_header_size_field = false;
Expand All @@ -215,7 +263,13 @@ 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;
_read();

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

void ami_nvar_t::nvar_entry_body_t::_read() {
Expand All @@ -237,7 +291,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 = std::unique_ptr<ucs2_string_t>(new ucs2_string_t(m__io, this, m__root));
m_ucs2_name = new ucs2_string_t(m__io, this, m__root);
}
n_invoke_data_start = true;
if (data_start_offset() >= 0) {
Expand All @@ -259,10 +313,16 @@ 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 @@ -276,23 +336,23 @@ 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.get();
return m_extended_header_attributes;
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 = std::unique_ptr<nvar_extended_attributes_t>(new nvar_extended_attributes_t(m__io, this, m__root));
m_extended_header_attributes = new nvar_extended_attributes_t(m__io, this, m__root);
m__io->seek(_pos);
f_extended_header_attributes = true;
}
return m_extended_header_attributes.get();
return m_extended_header_attributes;
}

int32_t ami_nvar_t::nvar_entry_body_t::data_start_offset() {
if (f_data_start_offset)
return m_data_start_offset;
m_data_start_offset = (int32_t)_io()->pos();
m_data_start_offset = _io()->pos();
f_data_start_offset = true;
return m_data_start_offset;
}
Expand Down Expand Up @@ -353,15 +413,15 @@ uint8_t ami_nvar_t::nvar_entry_body_t::extended_header_checksum() {
int32_t ami_nvar_t::nvar_entry_body_t::data_end_offset() {
if (f_data_end_offset)
return m_data_end_offset;
m_data_end_offset = (int32_t)_io()->pos();
m_data_end_offset = _io()->pos();
f_data_end_offset = true;
return m_data_end_offset;
}

uint16_t ami_nvar_t::nvar_entry_body_t::extended_header_size() {
if (f_extended_header_size)
return m_extended_header_size;
m_extended_header_size = ((_parent()->attributes()->extended_header()) ? (((extended_header_size_field() >= (1 + 2)) ? (extended_header_size_field()) : (0))) : (0));
m_extended_header_size = (( ((_parent()->attributes()->extended_header()) && (_parent()->attributes()->valid()) && (_parent()->size() > (((4 + 2) + 4) + 2))) ) ? (((extended_header_size_field() >= (1 + 2)) ? (extended_header_size_field()) : (0))) : (0));
f_extended_header_size = true;
return m_extended_header_size;
}
Expand Down
Loading