#include "./pxtn.h"
#include "./pxtnText.h"
static bool _read4_malloc( char **pp, int32_t* p_buf_size, pxtnDescriptor *p_doc )
{
if( !pp ) return false;
if( !p_doc->r( p_buf_size, 4, 1 ) ) return false;
if( *p_buf_size < 0 ) return false;
bool b_ret = false;
if( !( *pp = (char *)malloc( *p_buf_size + 1 ) ) ) return false;
memset( *pp, 0, *p_buf_size + 1 );
if( *p_buf_size )
{
if( !p_doc->r( *pp, sizeof(char), *p_buf_size ) ) goto term;
}
b_ret = true;
term:
if( !b_ret ){ free( *pp ); *pp = NULL; }
return b_ret;
}
static bool _write4( const char *p, int32_t buf_size, pxtnDescriptor *p_doc )
{
if( !p_doc->w_asfile( &buf_size, 4, 1 ) ) return false;
if( !p_doc->w_asfile( p, 1, buf_size ) ) return false;
return true;
}
bool pxtnText::set_name_buf( const char *name, int32_t buf_size )
{
if( !name ) return false;
if( _p_name_buf ) free( _p_name_buf ); _p_name_buf = NULL;
if( buf_size <= 0 ){ _name_size = 0; return true; }
if( !( _p_name_buf = (char *)malloc( buf_size + 1 ) ) ) return false;
memcpy( _p_name_buf, name , buf_size );
_p_name_buf[ buf_size ] = '\0';
_name_size = buf_size;
return true;
}
bool pxtnText::set_comment_buf( const char *comment, int32_t buf_size )
{
if( !comment ) return false;
if( _p_comment_buf ) free( _p_comment_buf ); _p_comment_buf = NULL;
if( buf_size <= 0 ){ _comment_size = 0; return true; }
if( !( _p_comment_buf = (char *)malloc( buf_size + 1 ) ) ) return false;
memcpy( _p_comment_buf, comment, buf_size );
_p_comment_buf[ buf_size ] = '\0';
_comment_size = buf_size;
return true;
}
const char* pxtnText::get_name_buf( int32_t* p_buf_size ) const
{
if( p_buf_size ) *p_buf_size = _name_size;
return _p_name_buf;
}
const char* pxtnText::get_comment_buf( int32_t* p_buf_size ) const
{
if( p_buf_size ) *p_buf_size = _comment_size;
return _p_comment_buf;
}
bool pxtnText::is_name_buf () const{ if( _name_size > 0 ) return true; return false; }
bool pxtnText::is_comment_buf() const{ if( _comment_size > 0 ) return true; return false; }
pxtnText::pxtnText()
{
_p_comment_buf = NULL;
_p_name_buf = NULL;
_comment_size = 0;
_name_size = 0;
}
pxtnText::~pxtnText()
{
if( _p_comment_buf ) free( _p_comment_buf ); _p_comment_buf = NULL; _comment_size = 0;
if( _p_name_buf ) free( _p_name_buf ); _p_name_buf = NULL; _name_size = 0;
}
bool pxtnText::Comment_w( pxtnDescriptor *p_doc )
{
if( !_p_comment_buf ) return false;
return _write4( _p_comment_buf, _comment_size, p_doc );
}
bool pxtnText::Name_w( pxtnDescriptor *p_doc )
{
if( !_p_name_buf ) return false;
return _write4( _p_name_buf, _name_size, p_doc );
}
bool pxtnText::Comment_r( pxtnDescriptor* p_doc )
{
return _read4_malloc( &_p_comment_buf, &_comment_size, p_doc );
}
bool pxtnText::Name_r( pxtnDescriptor* p_doc )
{
return _read4_malloc( &_p_name_buf, &_name_size, p_doc );
}