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