Skip to content

Commit bb141c5

Browse files
committed
More tests are added
1 parent 6c77f9b commit bb141c5

File tree

4 files changed

+312
-46
lines changed

4 files changed

+312
-46
lines changed

ario/ario.hpp

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,28 @@ class ario
202202
return parent->members_.cend();
203203
}
204204

205+
//------------------------------------------------------------------------------
206+
//! @brief Get a const reference to the first member
207+
//! @return Const reference to the first member
208+
const Member& front() const
209+
{
210+
if ( parent->members_.empty() ) {
211+
throw std::out_of_range( "No members in archive" );
212+
}
213+
return parent->members_.front();
214+
}
215+
216+
//------------------------------------------------------------------------------
217+
//! @brief Get a const reference to the last member
218+
//! @return Const reference to the last member
219+
const Member& back() const
220+
{
221+
if ( parent->members_.empty() ) {
222+
throw std::out_of_range( "No members in archive" );
223+
}
224+
return parent->members_.back();
225+
}
226+
205227
private:
206228
ario* parent; //!< Pointer to the parent ario object
207229
};
@@ -383,14 +405,14 @@ class ario
383405
//! @brief Add a member to the archive
384406
//! @param member The member to add
385407
//! @param data The data associated with the member
386-
//! @param added_member Reference to store the added member
387408
//! @return Error object indicating success or failure
388-
Result
389-
add_member( const Member& member,
390-
const std::string& data,
391-
std::optional<std::reference_wrapper<const ario::Member>>&
392-
added_member )
409+
Result add_member( const Member& member, const std::string& data )
393410
{
411+
// Don't allow empty member names
412+
if ( member.name.empty() ) {
413+
return { "Member name cannot be empty" };
414+
}
415+
394416
// Check if the member with such name already exists
395417
for ( const auto& mem : members_ ) {
396418
if ( mem.name == member.name ) {
@@ -412,7 +434,6 @@ class ario
412434
new_member.short_name = "/" + std::to_string( location );
413435
}
414436

415-
added_member = new_member;
416437
return {};
417438
}
418439

@@ -476,7 +497,10 @@ class ario
476497

477498
pstream->read( header, HEADER_SIZE );
478499
if ( pstream->gcount() < HEADER_SIZE ) {
479-
break; // End of file or error
500+
if ( pstream->gcount() > 0 ) {
501+
return { "Corrupted archive" }; // End of file or error
502+
}
503+
break; // End of file reached
480504
}
481505
std::streamoff current_pos = pstream->tellg();
482506
m.short_name = std::string( header, FIELD_NAME_SIZE );

examples/arioso/arioso.cpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,8 @@ static int copy_members( const CommandLineOptions& opts,
164164
continue; // Skip this member
165165
}
166166

167-
std::optional<std::reference_wrapper<const ario::Member>> added_member =
168-
std::nullopt;
169-
auto result =
170-
target_archive.add_member( member, member.data(), added_member );
171-
if ( !result.ok() || added_member == std::nullopt ) {
167+
auto result = target_archive.add_member( member, member.data() );
168+
if ( !result.ok() ) {
172169
std::cerr << "Error adding member '" << member.name
173170
<< "': " << result.what() << std::endl;
174171
return 3;
@@ -177,7 +174,8 @@ static int copy_members( const CommandLineOptions& opts,
177174
// Copy member symbols
178175
std::vector<std::string> symbols;
179176
archive.get_symbols_for_member( member, symbols );
180-
target_archive.add_symbols_for_member( added_member->get(), symbols );
177+
target_archive.add_symbols_for_member( target_archive.members.back(),
178+
symbols );
181179
}
182180

183181
return 0;
@@ -241,9 +239,7 @@ static ario::Result add_new_member( ario& archive,
241239
const std::string data( ( std::istreambuf_iterator<char>( input ) ),
242240
std::istreambuf_iterator<char>() );
243241

244-
std::optional<std::reference_wrapper<const ario::Member>> added_member =
245-
std::nullopt;
246-
const auto result = archive.add_member( new_member, data, added_member );
242+
const auto result = archive.add_member( new_member, data );
247243
if ( !result.ok() ) {
248244
return result;
249245
}
@@ -252,7 +248,8 @@ static ario::Result add_new_member( ario& archive,
252248
if ( elf.load( full_file_path.string() ) ) {
253249
std::vector<std::string> gathered_symbols;
254250
collect_elf_global_symbols( elf, gathered_symbols );
255-
archive.add_symbols_for_member( added_member->get(), gathered_symbols );
251+
archive.add_symbols_for_member( archive.members.back(),
252+
gathered_symbols );
256253
}
257254

258255
return {}; // Return success

0 commit comments

Comments
 (0)