Blame qtools/qbuffer.cpp

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
    }