|
Packit |
1c1d7e |
#include "ftextstream.h"
|
|
Packit |
1c1d7e |
#include <qfile.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
class QGStringBuffer : public QIODevice
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
QGStringBuffer( QGString* str );
|
|
Packit |
1c1d7e |
~QGStringBuffer();
|
|
Packit |
1c1d7e |
bool open( int m );
|
|
Packit |
1c1d7e |
void close();
|
|
Packit |
1c1d7e |
void flush();
|
|
Packit |
1c1d7e |
uint size() const;
|
|
Packit |
1c1d7e |
int at() const;
|
|
Packit |
1c1d7e |
bool at( int pos );
|
|
Packit |
1c1d7e |
int readBlock( char *, uint) { return -1; }
|
|
Packit |
1c1d7e |
int writeBlock( const char *p, uint len );
|
|
Packit |
1c1d7e |
int getch() { return -1; }
|
|
Packit |
1c1d7e |
int putch( int ch );
|
|
Packit |
1c1d7e |
int ungetch( int ) { return -1; }
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
protected:
|
|
Packit |
1c1d7e |
QGString* m_str;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
private: // Disabled copy constructor and operator=
|
|
Packit |
1c1d7e |
QGStringBuffer( const QGStringBuffer & );
|
|
Packit |
1c1d7e |
QGStringBuffer &operator=( const QGStringBuffer & );
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGStringBuffer::QGStringBuffer( QGString* str ) : m_str(str)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("QGStringBuffer::QGStringBuffer(%p)\n",str);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGStringBuffer::~QGStringBuffer()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QGStringBuffer::open( int m )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( !m_str )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
qWarning( "QGStringBuffer::open: No string" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( isOpen() )
|
|
Packit |
1c1d7e |
{ // buffer already open
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
qWarning( "QGStringBuffer::open: Buffer already open" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
setMode( m );
|
|
Packit |
1c1d7e |
if ( m & IO_Truncate )
|
|
Packit |
1c1d7e |
{ // truncate buffer
|
|
Packit |
1c1d7e |
m_str->truncate( 0 );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( m & IO_Append )
|
|
Packit |
1c1d7e |
{ // append to end of buffer
|
|
Packit |
1c1d7e |
ioIndex = m_str->length();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ioIndex = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
setState( IO_Open );
|
|
Packit |
1c1d7e |
setStatus( 0 );
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QGStringBuffer::close()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( isOpen() )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
setFlags( IO_Direct );
|
|
Packit |
1c1d7e |
ioIndex = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QGStringBuffer::flush()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
uint QGStringBuffer::size() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_str ? m_str->length() : 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QGStringBuffer::at() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return ioIndex;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QGStringBuffer::at( int pos )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
if ( !isOpen() )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
qWarning( "QGStringBuffer::at: Buffer is not open" );
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
if ( (uint)pos >= m_str->length() )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_RANGE)
|
|
Packit |
1c1d7e |
qWarning( "QGStringBuffer::at: Index %d out of range", pos );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ioIndex = pos;
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QGStringBuffer::writeBlock( const char *p, uint len )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("QGStringBuffer::writeBlock(%p,%d) m_str=%p ioIndex=%d\n",p,len,
|
|
Packit |
1c1d7e |
// m_str,ioIndex);
|
|
Packit |
1c1d7e |
m_str->enlarge(ioIndex+len+1);
|
|
Packit |
1c1d7e |
memcpy(m_str->data()+ioIndex,p,len);
|
|
Packit |
1c1d7e |
ioIndex+=len;
|
|
Packit |
1c1d7e |
m_str->data()[ioIndex]='\0';
|
|
Packit |
1c1d7e |
m_str->setLen(ioIndex);
|
|
Packit |
1c1d7e |
return len;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QGStringBuffer::putch( int ch )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("QGStringBuffer::putch(%d) m_str=%p ioIndex=%d\n",
|
|
Packit |
1c1d7e |
// ch,m_str,ioIndex);
|
|
Packit |
1c1d7e |
m_str->enlarge(ioIndex+2);
|
|
Packit |
1c1d7e |
m_str->data()[ioIndex] = (char)ch;
|
|
Packit |
1c1d7e |
ioIndex++;
|
|
Packit |
1c1d7e |
m_str->data()[ioIndex] = '\0';
|
|
Packit |
1c1d7e |
m_str->setLen(ioIndex);
|
|
Packit |
1c1d7e |
return ch;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream::FTextStream()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_dev = 0;
|
|
Packit |
1c1d7e |
m_owndev = FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream::FTextStream( QIODevice *dev )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_dev = dev;
|
|
Packit |
1c1d7e |
m_owndev = FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream::FTextStream( QGString *s )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_dev = new QGStringBuffer(s);
|
|
Packit |
1c1d7e |
((QGStringBuffer*)m_dev)->open( IO_WriteOnly );
|
|
Packit |
1c1d7e |
m_owndev = TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream::FTextStream( FILE *fh )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_dev = new QFile;
|
|
Packit |
1c1d7e |
((QFile *)m_dev)->open( IO_WriteOnly, fh);
|
|
Packit |
1c1d7e |
m_owndev = TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream::~FTextStream()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_owndev) delete m_dev;
|
|
Packit |
1c1d7e |
m_dev = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QIODevice *FTextStream::device() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_dev;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void FTextStream::setDevice( QIODevice *dev )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_owndev)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
delete m_dev;
|
|
Packit |
1c1d7e |
m_owndev = FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_dev = dev;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void FTextStream::unsetDevice()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
setDevice(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream &FTextStream::output_int( ulong n, bool neg )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char buf[20];
|
|
Packit |
1c1d7e |
char *p = &buf[19];
|
|
Packit |
1c1d7e |
*p = '\0';
|
|
Packit |
1c1d7e |
if ( neg )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
n = (ulong)(-(long)n);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
do
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
*--p = ((int)(n%10)) + '0';
|
|
Packit |
1c1d7e |
n /= 10;
|
|
Packit |
1c1d7e |
} while ( n );
|
|
Packit |
1c1d7e |
if ( neg ) *--p = '-';
|
|
Packit |
1c1d7e |
return operator<<(p);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream &FTextStream::operator<<( signed short i )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return output_int( i, i < 0 );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream &FTextStream::operator<<( unsigned short i )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return output_int( i, FALSE );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream &FTextStream::operator<<( signed int i )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return output_int( i, i < 0 );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream &FTextStream::operator<<( unsigned int i )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return output_int( i, FALSE );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream &FTextStream::operator<<( signed long i )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return output_int( i, i < 0 );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream &FTextStream::operator<<( unsigned long i )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return output_int( i, FALSE );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream &FTextStream::operator<<( float f )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return *this << (double)f;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FTextStream &FTextStream::operator<<( double d )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char buf[64];
|
|
Packit |
1c1d7e |
sprintf(buf,"%f",d);
|
|
Packit |
1c1d7e |
return *this << buf;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|