mirror of
https://github.com/serge1/ELFIO.git
synced 2025-03-20 13:20:45 +00:00
Support stringstream by filling gaps in output stream
This commit is contained in:
parent
57e614a486
commit
becd79d05c
@ -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() );
|
||||
}
|
||||
|
||||
|
@ -168,7 +168,7 @@ template <class T> class segment_impl : public segment
|
||||
data = 0;
|
||||
}
|
||||
else {
|
||||
data = new (std::nothrow) char[size + 1];
|
||||
data = new ( std::nothrow ) char[size + 1];
|
||||
|
||||
if ( 0 != data ) {
|
||||
stream.read( data, size );
|
||||
@ -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 ) );
|
||||
}
|
||||
|
||||
|
@ -23,9 +23,11 @@ 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 ); }
|
||||
|
||||
|
||||
#define ELFIO_SET_ACCESS( TYPE, NAME, FIELD ) \
|
||||
void set_##NAME( TYPE value ) \
|
||||
{ \
|
||||
@ -175,17 +177,26 @@ inline uint32_t elf_hash( const unsigned char* name )
|
||||
inline std::string to_hex_string( Elf64_Addr t )
|
||||
{
|
||||
std::string s;
|
||||
while( t ) {
|
||||
while ( t ) {
|
||||
auto d = t & 0xf;
|
||||
if ( d < 0xa )
|
||||
s = char('0' + d) + s;
|
||||
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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user