Support stringstream by filling gaps in output stream

This commit is contained in:
Serge Lamikhov-Center 2021-03-27 21:14:56 +03:00
parent 57e614a486
commit becd79d05c
3 changed files with 19 additions and 8 deletions

View File

@ -237,7 +237,7 @@ template <class T> class section_impl : public section
//------------------------------------------------------------------------------
void save_header( std::ostream& stream, std::streampos header_offset ) const
{
stream.seekp( header_offset );
adjust_stream_size( stream, header_offset );
stream.write( reinterpret_cast<const char*>( &header ),
sizeof( header ) );
}
@ -245,7 +245,7 @@ template <class T> class section_impl : public section
//------------------------------------------------------------------------------
void save_data( std::ostream& stream, std::streampos data_offset ) const
{
stream.seekp( data_offset );
adjust_stream_size( stream, data_offset );
stream.write( get_data(), get_size() );
}

View File

@ -185,7 +185,7 @@ template <class T> class segment_impl : public segment
{
ph.p_offset = data_offset;
ph.p_offset = ( *convertor )( ph.p_offset );
stream.seekp( header_offset );
adjust_stream_size( stream, header_offset );
stream.write( reinterpret_cast<const char*>( &ph ), sizeof( ph ) );
}

View File

@ -23,6 +23,8 @@ THE SOFTWARE.
#ifndef ELFIO_UTILS_HPP
#define ELFIO_UTILS_HPP
#include <iostream>
#define ELFIO_GET_ACCESS( TYPE, NAME, FIELD ) \
TYPE get_##NAME() const { return ( *convertor )( FIELD ); }
@ -180,12 +182,21 @@ inline std::string to_hex_string( Elf64_Addr t )
if ( d < 0xa )
s = char( '0' + d ) + s;
else
s = char('A' + d - 0xa) + s;
s = char( 'A' + d - 0xA ) + s;
t >>= 4;
}
return "0x" + s;
}
inline void adjust_stream_size( std::ostream& stream, std::streamsize offset )
{
stream.seekp( 0, stream.end );
if ( stream.tellp() < offset ) {
std::streamsize size = offset - stream.tellp();
stream.write( std::string( size, '\0' ).c_str(), size );
}
stream.seekp( offset );
}
} // namespace ELFIO