|
Packit |
1c1d7e |
/****************************************************************************
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Implementation of QBuffer class
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Created : 930812
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file is part of the tools module of the Qt GUI Toolkit.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file may be distributed under the terms of the Q Public License
|
|
Packit |
1c1d7e |
** as defined by Trolltech AS of Norway and appearing in the file
|
|
Packit |
1c1d7e |
** LICENSE.QPL included in the packaging of this file.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file may be distributed and/or modified under the terms of the
|
|
Packit |
1c1d7e |
** GNU General Public License version 2 as published by the Free Software
|
|
Packit |
1c1d7e |
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
Packit |
1c1d7e |
** packaging of this file.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
|
|
Packit |
1c1d7e |
** licenses may use this file in accordance with the Qt Commercial License
|
|
Packit |
1c1d7e |
** Agreement provided with the Software.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
Packit |
1c1d7e |
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
|
|
Packit |
1c1d7e |
** information about Qt Commercial License Agreements.
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/qpl/ for QPL licensing information.
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/gpl/ for GPL licensing information.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Contact info@trolltech.com if any conditions of this licensing are
|
|
Packit |
1c1d7e |
** not clear to you.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
**********************************************************************/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "qbuffer.h"
|
|
Packit |
1c1d7e |
#include <stdlib.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// REVISED: paul
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\class QBuffer qbuffer.h
|
|
Packit |
1c1d7e |
\brief The QBuffer class is an I/O device that operates on a QByteArray
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\ingroup io
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QBuffer allows reading and writing a memory buffer. It is normally
|
|
Packit |
1c1d7e |
used together with a QTextStream or a QDataStream. QBuffer has an
|
|
Packit |
1c1d7e |
associated QByteArray which holds the buffer data. The size() of the
|
|
Packit |
1c1d7e |
buffer is automatically adjusted as data is written.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The constructor \c QBuffer(QByteArray) creates a QBuffer with an
|
|
Packit |
1c1d7e |
existing byte array. The byte array can also be set with setBuffer().
|
|
Packit |
1c1d7e |
Writing to the QBuffer will modify the original byte array, since
|
|
Packit |
1c1d7e |
QByteArray is \link shclass.html explicitly shared.\endlink
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Use open() to open the buffer before use, and to set the mode
|
|
Packit |
1c1d7e |
(read-only,write-only, etc.). close() closes the buffer. The buffer
|
|
Packit |
1c1d7e |
must be closed before reopening or calling setBuffer().
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The common way to use QBuffer is through \l QDataStream or \l QTextStream
|
|
Packit |
1c1d7e |
which have constructors that take a QBuffer parameter. For
|
|
Packit |
1c1d7e |
convenience, there are also QDataStream and QTextStream constructors
|
|
Packit |
1c1d7e |
that take a QByteArray parameter. These constructors create and open
|
|
Packit |
1c1d7e |
an internal QBuffer.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Note that QTextStream can also operate on a QString (a Unicode
|
|
Packit |
1c1d7e |
string); a QBuffer cannot.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
You can also use QBuffer directly through the standard QIODevice
|
|
Packit |
1c1d7e |
functions readBlock(), writeBlock() readLine(), at(), getch(), putch() and
|
|
Packit |
1c1d7e |
ungetch().
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa QFile, QDataStream, QTextStream, QByteArray, \link shclass.html Shared Classes\endlink
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Constructs an empty buffer.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QBuffer::QBuffer()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
setFlags( IO_Direct );
|
|
Packit |
1c1d7e |
a_inc = 16; // initial increment
|
|
Packit |
1c1d7e |
a_len = 0;
|
|
Packit |
1c1d7e |
ioIndex = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Constructs a buffer that operates on \a buf.
|
|
Packit |
1c1d7e |
If you open the buffer in write mode (\c IO_WriteOnly or
|
|
Packit |
1c1d7e |
\c IO_ReadWrite) and write something into the buffer, \a buf
|
|
Packit |
1c1d7e |
will be modified.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Example:
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
QCString str = "abc";
|
|
Packit |
1c1d7e |
QBuffer b( str );
|
|
Packit |
1c1d7e |
b.open( IO_WriteOnly );
|
|
Packit |
1c1d7e |
b.at( 3 ); // position at \0
|
|
Packit |
1c1d7e |
b.writeBlock( "def", 4 ); // write including \0
|
|
Packit |
1c1d7e |
b.close();
|
|
Packit |
1c1d7e |
// Now, str == "abcdef"
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa setBuffer()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QBuffer::QBuffer( QByteArray buf ) : a(buf)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
setFlags( IO_Direct );
|
|
Packit |
1c1d7e |
a_len = a.size();
|
|
Packit |
1c1d7e |
a_inc = (a_len > 512) ? 512 : a_len; // initial increment
|
|
Packit |
1c1d7e |
if ( a_inc < 16 )
|
|
Packit |
1c1d7e |
a_inc = 16;
|
|
Packit |
1c1d7e |
ioIndex = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Destructs the buffer.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QBuffer::~QBuffer()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Replaces the buffer's contents with \a buf.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
This may not be done when isOpen() is TRUE.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Note that if you open the buffer in write mode (\c IO_WriteOnly or
|
|
Packit |
1c1d7e |
IO_ReadWrite) and write something into the buffer, \a buf is also
|
|
Packit |
1c1d7e |
modified because QByteArray is an explicitly shared class.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa buffer(), open(), close()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QBuffer::setBuffer( QByteArray buf )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( isOpen() ) {
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::setBuffer: Buffer is open");
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
a = buf;
|
|
Packit |
1c1d7e |
a_len = a.size();
|
|
Packit |
1c1d7e |
a_inc = (a_len > 512) ? 512 : a_len; // initial increment
|
|
Packit |
1c1d7e |
if ( a_inc < 16 )
|
|
Packit |
1c1d7e |
a_inc = 16;
|
|
Packit |
1c1d7e |
ioIndex = 0;
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn QByteArray QBuffer::buffer() const
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Returns this buffer's byte array.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa setBuffer()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\reimp
|
|
Packit |
1c1d7e |
Opens the buffer in the mode \a m. Returns TRUE if successful,
|
|
Packit |
1c1d7e |
otherwise FALSE. The buffer must be opened before use.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The mode parameter \a m must be a combination of the following flags.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\c IO_ReadOnly opens a buffer in read-only mode.
|
|
Packit |
1c1d7e |
\c IO_WriteOnly opens a buffer in write-only mode.
|
|
Packit |
1c1d7e |
\c IO_ReadWrite opens a buffer in read/write mode.
|
|
Packit |
1c1d7e |
\c IO_Append sets the buffer index to the end of the buffer.
|
|
Packit |
1c1d7e |
\c IO_Truncate truncates the buffer.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa close(), isOpen()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QBuffer::open( int m )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( isOpen() ) { // buffer already open
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::open: Buffer already open" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
setMode( m );
|
|
Packit |
1c1d7e |
if ( m & IO_Truncate ) { // truncate buffer
|
|
Packit |
1c1d7e |
a.resize( 0 );
|
|
Packit |
1c1d7e |
a_len = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( m & IO_Append ) { // append to end of buffer
|
|
Packit |
1c1d7e |
ioIndex = a.size();
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
ioIndex = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
a_inc = 16;
|
|
Packit |
1c1d7e |
setState( IO_Open );
|
|
Packit |
1c1d7e |
setStatus( 0 );
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\reimp
|
|
Packit |
1c1d7e |
Closes an open buffer.
|
|
Packit |
1c1d7e |
\sa open()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QBuffer::close()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( isOpen() ) {
|
|
Packit |
1c1d7e |
setFlags( IO_Direct );
|
|
Packit |
1c1d7e |
ioIndex = 0;
|
|
Packit |
1c1d7e |
a_inc = 16;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\reimp
|
|
Packit |
1c1d7e |
The flush function does nothing for a QBuffer.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QBuffer::flush()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn int QBuffer::at() const
|
|
Packit |
1c1d7e |
\reimp
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn uint QBuffer::size() const
|
|
Packit |
1c1d7e |
\reimp
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\reimp
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QBuffer::at( int pos )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
if ( !isOpen() ) {
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::at: Buffer is not open" );
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
if ( (uint)pos > a_len ) {
|
|
Packit |
1c1d7e |
#if defined(CHECK_RANGE)
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::at: Index %d out of range", pos );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ioIndex = pos;
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\reimp
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QBuffer::readBlock( char *p, uint len )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
CHECK_PTR( p );
|
|
Packit |
1c1d7e |
if ( !isOpen() ) { // buffer not open
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::readBlock: Buffer not open" );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( !isReadable() ) { // reading not permitted
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::readBlock: Read operation not permitted" );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
if ( (uint)ioIndex + len > a.size() ) { // overflow
|
|
Packit |
1c1d7e |
if ( (uint)ioIndex >= a.size() ) {
|
|
Packit |
1c1d7e |
setStatus( IO_ReadError );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
len = a.size() - (uint)ioIndex;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
memcpy( p, a.data()+ioIndex, len );
|
|
Packit |
1c1d7e |
ioIndex += len;
|
|
Packit |
1c1d7e |
return len;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\reimp
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Writes \a len bytes from \a p into the buffer at the current index,
|
|
Packit |
1c1d7e |
overwriting any characters there and extending the buffer if necessary.
|
|
Packit |
1c1d7e |
Returns the number of bytes actually written.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Returns -1 if a serious error occurred.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa readBlock()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QBuffer::writeBlock( const char *p, uint len )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
if ( p == 0 && len != 0 )
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::writeBlock: Null pointer error" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
if ( !isOpen() ) { // buffer not open
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::writeBlock: Buffer not open" );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( !isWritable() ) { // writing not permitted
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::writeBlock: Write operation not permitted" );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
if ( (uint)ioIndex + len >= a_len ) { // overflow
|
|
Packit |
1c1d7e |
uint new_len = a_len + a_inc*(((uint)ioIndex+len-a_len)/a_inc+1);
|
|
Packit |
1c1d7e |
if ( !a.resize( new_len ) ) { // could not resize
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::writeBlock: Memory allocation error" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
setStatus( IO_ResourceError );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
a_inc *= 2; // double increment
|
|
Packit |
1c1d7e |
a_len = new_len;
|
|
Packit |
1c1d7e |
a.shd->len = (uint)ioIndex + len;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
memcpy( a.data()+ioIndex, p, len );
|
|
Packit |
1c1d7e |
ioIndex += len;
|
|
Packit |
1c1d7e |
if ( a.shd->len < (uint)ioIndex )
|
|
Packit |
1c1d7e |
a.shd->len = (uint)ioIndex; // fake (not alloc'd) length
|
|
Packit |
1c1d7e |
return len;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\reimp
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QBuffer::readLine( char *p, uint maxlen )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
CHECK_PTR( p );
|
|
Packit |
1c1d7e |
if ( !isOpen() ) { // buffer not open
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::readLine: Buffer not open" );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( !isReadable() ) { // reading not permitted
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::readLine: Read operation not permitted" );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
if ( maxlen == 0 )
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
uint start = (uint)ioIndex;
|
|
Packit |
1c1d7e |
char *d = a.data() + ioIndex;
|
|
Packit |
1c1d7e |
maxlen--; // make room for 0-terminator
|
|
Packit |
1c1d7e |
if ( a.size() - (uint)ioIndex < maxlen )
|
|
Packit |
1c1d7e |
maxlen = a.size() - (uint)ioIndex;
|
|
Packit |
1c1d7e |
while ( maxlen-- ) {
|
|
Packit |
1c1d7e |
if ( (*p++ = *d++) == '\n' )
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
*p = '\0';
|
|
Packit |
1c1d7e |
ioIndex = (int)(d - a.data());
|
|
Packit |
1c1d7e |
return (uint)ioIndex - start;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\reimp
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QBuffer::getch()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
if ( !isOpen() ) { // buffer not open
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::getch: Buffer not open" );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( !isReadable() ) { // reading not permitted
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::getch: Read operation not permitted" );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
if ( (uint)ioIndex+1 > a.size() ) { // overflow
|
|
Packit |
1c1d7e |
setStatus( IO_ReadError );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return uchar(*(a.data()+ioIndex++));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\reimp
|
|
Packit |
1c1d7e |
Writes the character \a ch into the buffer, overwriting
|
|
Packit |
1c1d7e |
the character at the current index, extending the buffer
|
|
Packit |
1c1d7e |
if necessary.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Returns \a ch, or -1 if some error occurred.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa getch(), ungetch()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QBuffer::putch( int ch )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
if ( !isOpen() ) { // buffer not open
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::putch: Buffer not open" );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( !isWritable() ) { // writing not permitted
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::putch: Write operation not permitted" );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
if ( (uint)ioIndex + 1 >= a_len ) { // overflow
|
|
Packit |
1c1d7e |
char buf[1];
|
|
Packit |
1c1d7e |
buf[0] = (char)ch;
|
|
Packit |
1c1d7e |
if ( writeBlock(buf,1) != 1 )
|
|
Packit |
1c1d7e |
return -1; // write error
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
*(a.data() + ioIndex++) = (char)ch;
|
|
Packit |
1c1d7e |
if ( a.shd->len < (uint)ioIndex )
|
|
Packit |
1c1d7e |
a.shd->len = (uint)ioIndex;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return ch;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\reimp
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QBuffer::ungetch( int ch )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
if ( !isOpen() ) { // buffer not open
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::ungetch: Buffer not open" );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( !isReadable() ) { // reading not permitted
|
|
Packit |
1c1d7e |
qWarning( "QBuffer::ungetch: Read operation not permitted" );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
if ( ch != -1 ) {
|
|
Packit |
1c1d7e |
if ( ioIndex )
|
|
Packit |
1c1d7e |
ioIndex--;
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
ch = -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return ch;
|
|
Packit |
1c1d7e |
}
|