-rw-r--r-- | qmake/tools/qdatastream.cpp | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/qmake/tools/qdatastream.cpp b/qmake/tools/qdatastream.cpp index 9c573c7..51a1448 100644 --- a/qmake/tools/qdatastream.cpp +++ b/qmake/tools/qdatastream.cpp @@ -369,656 +369,670 @@ void QDataStream::unsetDevice() Returns FALSE if the current position of the read/write head of the IO device is somewhere before the end position. \sa QIODevice::atEnd() */ /*! \fn int QDataStream::byteOrder() const Returns the current byte order setting -- either \c BigEndian or \c LittleEndian. \sa setByteOrder() */ /*! Sets the serialization byte order to \a bo. The \a bo parameter can be \c QDataStream::BigEndian or \c QDataStream::LittleEndian. The default setting is big endian. We recommend leaving this setting unless you have special requirements. \sa byteOrder() */ void QDataStream::setByteOrder( int bo ) { byteorder = bo; if ( systemBigEndian ) noswap = byteorder == BigEndian; else noswap = byteorder == LittleEndian; } /*! \fn bool QDataStream::isPrintableData() const Returns TRUE if the printable data flag has been set; otherwise returns FALSE. \sa setPrintableData() */ /*! \fn void QDataStream::setPrintableData( bool enable ) If \a enable is TRUE, data will be output in a human readable format. If \a enable is FALSE, data will be output in a binary format. If \a enable is TRUE, the write functions will generate output that consists of printable characters (7 bit ASCII). This output will typically be a lot larger than the default binary output, and consequently slower to write. We recommend only enabling printable data for debugging purposes. */ /*! \fn int QDataStream::version() const Returns the version number of the data serialization format. In Qt 3.1, this number is 5. \sa setVersion() */ /*! \fn void QDataStream::setVersion( int v ) Sets the version number of the data serialization format to \a v. You don't need to set a version if you are using the current version of Qt. In order to accommodate new functionality, the datastream serialization format of some Qt classes has changed in some versions of Qt. If you want to read data that was created by an earlier version of Qt, or write data that can be read by a program that was compiled with an earlier version of Qt, use this function to modify the serialization format of QDataStream. \table \header \i Qt Version \i QDataStream Version \row \i Qt 3.1 \i11 5 \row \i Qt 3.0 \i11 4 \row \i Qt 2.1.x and Qt 2.2.x \i11 3 \row \i Qt 2.0.x \i11 2 \row \i Qt 1.x \i11 1 \endtable \sa version() */ /***************************************************************************** QDataStream read functions *****************************************************************************/ static Q_INT32 read_int_ascii( QDataStream *s ) { register int n = 0; char buf[40]; for ( ;; ) { buf[n] = s->device()->getch(); if ( buf[n] == '\n' || n > 38 ) // $-terminator break; n++; } buf[n] = '\0'; return atol( buf ); } /*! \overload QDataStream &QDataStream::operator>>( Q_UINT8 &i ) Reads an unsigned byte from the stream into \a i, and returns a reference to the stream. */ /*! Reads a signed byte from the stream into \a i, and returns a reference to the stream. */ QDataStream &QDataStream::operator>>( Q_INT8 &i ) { CHECK_STREAM_PRECOND if ( printable ) { // printable data i = (Q_INT8)dev->getch(); if ( i == '\\' ) { // read octal code char buf[4]; dev->readBlock( buf, 3 ); i = (buf[2] & 0x07)+((buf[1] & 0x07) << 3)+((buf[0] & 0x07) << 6); } } else { // data or text i = (Q_INT8)dev->getch(); } return *this; } /*! \overload QDataStream &QDataStream::operator>>( Q_UINT16 &i ) Reads an unsigned 16-bit integer from the stream into \a i, and returns a reference to the stream. */ /*! \overload Reads a signed 16-bit integer from the stream into \a i, and returns a reference to the stream. */ QDataStream &QDataStream::operator>>( Q_INT16 &i ) { CHECK_STREAM_PRECOND if ( printable ) { // printable data i = (Q_INT16)read_int_ascii( this ); } else if ( noswap ) { // no conversion needed dev->readBlock( (char *)&i, sizeof(Q_INT16) ); } else { // swap bytes register uchar *p = (uchar *)(&i); char b[2]; dev->readBlock( b, 2 ); *p++ = b[1]; *p = b[0]; } return *this; } /*! \overload QDataStream &QDataStream::operator>>( Q_UINT32 &i ) Reads an unsigned 32-bit integer from the stream into \a i, and returns a reference to the stream. */ /*! \overload Reads a signed 32-bit integer from the stream into \a i, and returns a reference to the stream. */ QDataStream &QDataStream::operator>>( Q_INT32 &i ) { CHECK_STREAM_PRECOND if ( printable ) { // printable data i = read_int_ascii( this ); } else if ( noswap ) { // no conversion needed dev->readBlock( (char *)&i, sizeof(Q_INT32) ); } else { // swap bytes uchar *p = (uchar *)(&i); char b[4]; dev->readBlock( b, 4 ); *p++ = b[3]; *p++ = b[2]; *p++ = b[1]; *p = b[0]; } return *this; } /*! \overload QDataStream &QDataStream::operator>>( Q_ULONG &i ) Reads an unsigned integer of the system's word length from the stream, into \a i, and returns a reference to the stream. */ /*! \overload Reads a signed integer of the system's word length from the stream into \a i, and returns a reference to the stream. */ QDataStream &QDataStream::operator>>( Q_LONG &i ) { CHECK_STREAM_PRECOND if ( printable ) { // printable data i = read_int_ascii( this ); } else if ( noswap ) { // no conversion needed dev->readBlock( (char *)&i, sizeof(Q_LONG) ); } else { // swap bytes register uchar *p = (uchar *)(&i); char b[sizeof(Q_LONG)]; dev->readBlock( b, sizeof(Q_LONG) ); for ( int j = sizeof(Q_LONG); j; ) *p++ = b[--j]; } return *this; } static double read_double_ascii( QDataStream *s ) { register int n = 0; char buf[80]; for ( ;; ) { buf[n] = s->device()->getch(); if ( buf[n] == '\n' || n > 78 ) // $-terminator break; n++; } buf[n] = '\0'; return atof( buf ); } /*! \overload Reads a 32-bit floating point number from the stream into \a f, using the standard IEEE754 format. Returns a reference to the stream. */ QDataStream &QDataStream::operator>>( float &f ) { CHECK_STREAM_PRECOND if ( printable ) { // printable data f = (float)read_double_ascii( this ); } else if ( noswap ) { // no conversion needed dev->readBlock( (char *)&f, sizeof(float) ); } else { // swap bytes uchar *p = (uchar *)(&f); char b[4]; dev->readBlock( b, 4 ); *p++ = b[3]; *p++ = b[2]; *p++ = b[1]; *p = b[0]; } return *this; } /*! \overload Reads a 64-bit floating point number from the stream into \a f, using the standard IEEE754 format. Returns a reference to the stream. */ QDataStream &QDataStream::operator>>( double &f ) { CHECK_STREAM_PRECOND if ( printable ) { // printable data f = read_double_ascii( this ); } else if ( noswap ) { // no conversion needed dev->readBlock( (char *)&f, sizeof(double) ); } else { // swap bytes register uchar *p = (uchar *)(&f); char b[8]; dev->readBlock( b, 8 ); *p++ = b[7]; *p++ = b[6]; *p++ = b[5]; *p++ = b[4]; *p++ = b[3]; *p++ = b[2]; *p++ = b[1]; *p = b[0]; } return *this; } /*! \overload Reads the '\0'-terminated string \a s from the stream and returns a reference to the stream. Space for the string is allocated using \c new -- the caller must destroy it with delete[]. */ QDataStream &QDataStream::operator>>( char *&s ) { uint len = 0; return readBytes( s, len ); } /*! Reads the buffer \a s from the stream and returns a reference to the stream. The buffer \a s is allocated using \c new. Destroy it with the \c delete[] operator. If the length is zero or \a s cannot be allocated, \a s is set to 0. The \a l parameter will be set to the length of the buffer. The serialization format is a Q_UINT32 length specifier first, then \a l bytes of data. Note that the data is \e not encoded. \sa readRawBytes(), writeBytes() */ QDataStream &QDataStream::readBytes( char *&s, uint &l ) { CHECK_STREAM_PRECOND Q_UINT32 len; *this >> len; // first read length spec l = (uint)len; if ( len == 0 || eof() ) { s = 0; return *this; } else { s = new char[len]; // create char array Q_CHECK_PTR( s ); if ( !s ) // no memory return *this; return readRawBytes( s, (uint)len ); } } /*! Reads \a len bytes from the stream into \a s and returns a reference to the stream. The buffer \a s must be preallocated. The data is \e not encoded. \sa readBytes(), QIODevice::readBlock(), writeRawBytes() */ QDataStream &QDataStream::readRawBytes( char *s, uint len ) { CHECK_STREAM_PRECOND if ( printable ) { // printable data register Q_INT8 *p = (Q_INT8*)s; - while ( len-- ) - *this >> *p++; + if ( version() < 4 ) { + while ( len-- ) { + Q_INT32 tmp; + *this >> tmp; + *p++ = tmp; + } + } else { + while ( len-- ) + *this >> *p++; + } } else { // read data char array dev->readBlock( s, len ); } return *this; } /***************************************************************************** QDataStream write functions *****************************************************************************/ /*! \overload QDataStream &QDataStream::operator<<( Q_UINT8 i ) Writes an unsigned byte, \a i, to the stream and returns a reference to the stream. */ /*! Writes a signed byte, \a i, to the stream and returns a reference to the stream. */ QDataStream &QDataStream::operator<<( Q_INT8 i ) { CHECK_STREAM_PRECOND if ( printable && (i == '\\' || !isprint((uchar) i)) ) { char buf[6]; // write octal code buf[0] = '\\'; buf[1] = '0' + ((i >> 6) & 0x07); buf[2] = '0' + ((i >> 3) & 0x07); buf[3] = '0' + (i & 0x07); buf[4] = '\0'; dev->writeBlock( buf, 4 ); } else { dev->putch( i ); } return *this; } /*! \overload QDataStream &QDataStream::operator<<( Q_UINT16 i ) Writes an unsigned 16-bit integer, \a i, to the stream and returns a reference to the stream. */ /*! \overload Writes a signed 16-bit integer, \a i, to the stream and returns a reference to the stream. */ QDataStream &QDataStream::operator<<( Q_INT16 i ) { CHECK_STREAM_PRECOND if ( printable ) { // printable data char buf[16]; sprintf( buf, "%d\n", i ); dev->writeBlock( buf, strlen(buf) ); } else if ( noswap ) { // no conversion needed dev->writeBlock( (char *)&i, sizeof(Q_INT16) ); } else { // swap bytes register uchar *p = (uchar *)(&i); char b[2]; b[1] = *p++; b[0] = *p; dev->writeBlock( b, 2 ); } return *this; } /*! \overload Writes a signed 32-bit integer, \a i, to the stream and returns a reference to the stream. */ QDataStream &QDataStream::operator<<( Q_INT32 i ) { CHECK_STREAM_PRECOND if ( printable ) { // printable data char buf[16]; sprintf( buf, "%d\n", i ); dev->writeBlock( buf, strlen(buf) ); } else if ( noswap ) { // no conversion needed dev->writeBlock( (char *)&i, sizeof(Q_INT32) ); } else { // swap bytes register uchar *p = (uchar *)(&i); char b[4]; b[3] = *p++; b[2] = *p++; b[1] = *p++; b[0] = *p; dev->writeBlock( b, 4 ); } return *this; } /*! \overload QDataStream &QDataStream::operator<<( Q_ULONG i ) Writes an unsigned integer \a i, of the system's word length, to the stream and returns a reference to the stream. */ /*! \overload Writes a signed integer \a i, of the system's word length, to the stream and returns a reference to the stream. */ QDataStream &QDataStream::operator<<( Q_LONG i ) { CHECK_STREAM_PRECOND if ( printable ) { // printable data char buf[20]; sprintf( buf, "%ld\n", i ); dev->writeBlock( buf, strlen(buf) ); } else if ( noswap ) { // no conversion needed dev->writeBlock( (char *)&i, sizeof(Q_LONG) ); } else { // swap bytes register uchar *p = (uchar *)(&i); char b[sizeof(Q_LONG)]; for ( int j = sizeof(Q_LONG); j; ) b[--j] = *p++; dev->writeBlock( b, sizeof(Q_LONG) ); } return *this; } /*! \overload QDataStream &QDataStream::operator<<( Q_UINT32 i ) Writes an unsigned integer, \a i, to the stream as a 32-bit unsigned integer (Q_UINT32). Returns a reference to the stream. */ /*! \overload Writes a 32-bit floating point number, \a f, to the stream using the standard IEEE754 format. Returns a reference to the stream. */ QDataStream &QDataStream::operator<<( float f ) { CHECK_STREAM_PRECOND if ( printable ) { // printable data char buf[32]; sprintf( buf, "%g\n", (double)f ); dev->writeBlock( buf, strlen(buf) ); } else { float g = f; // fixes float-on-stack problem if ( noswap ) { // no conversion needed dev->writeBlock( (char *)&g, sizeof(float) ); } else { // swap bytes register uchar *p = (uchar *)(&g); char b[4]; b[3] = *p++; b[2] = *p++; b[1] = *p++; b[0] = *p; dev->writeBlock( b, 4 ); } } return *this; } /*! \overload Writes a 64-bit floating point number, \a f, to the stream using the standard IEEE754 format. Returns a reference to the stream. */ QDataStream &QDataStream::operator<<( double f ) { CHECK_STREAM_PRECOND if ( printable ) { // printable data char buf[32]; sprintf( buf, "%g\n", f ); dev->writeBlock( buf, strlen(buf) ); } else if ( noswap ) { // no conversion needed dev->writeBlock( (char *)&f, sizeof(double) ); } else { // swap bytes register uchar *p = (uchar *)(&f); char b[8]; b[7] = *p++; b[6] = *p++; b[5] = *p++; b[4] = *p++; b[3] = *p++; b[2] = *p++; b[1] = *p++; b[0] = *p; dev->writeBlock( b, 8 ); } return *this; } /*! \overload Writes the '\0'-terminated string \a s to the stream and returns a reference to the stream. The string is serialized using writeBytes(). */ QDataStream &QDataStream::operator<<( const char *s ) { if ( !s ) { *this << (Q_UINT32)0; return *this; } uint len = qstrlen( s ) + 1; // also write null terminator *this << (Q_UINT32)len; // write length specifier return writeRawBytes( s, len ); } /*! Writes the length specifier \a len and the buffer \a s to the stream and returns a reference to the stream. The \a len is serialized as a Q_UINT32, followed by \a len bytes from \a s. Note that the data is \e not encoded. \sa writeRawBytes(), readBytes() */ QDataStream &QDataStream::writeBytes(const char *s, uint len) { CHECK_STREAM_PRECOND *this << (Q_UINT32)len; // write length specifier if ( len ) writeRawBytes( s, len ); return *this; } /*! Writes \a len bytes from \a s to the stream and returns a reference to the stream. The data is \e not encoded. \sa writeBytes(), QIODevice::writeBlock(), readRawBytes() */ QDataStream &QDataStream::writeRawBytes( const char *s, uint len ) { CHECK_STREAM_PRECOND if ( printable ) { // write printable - register Q_INT8 *p = (Q_INT8*)s; - while ( len-- ) - *this << *p++; + if ( version() < 4 ) { + register char *p = (char *)s; + while ( len-- ) + *this << *p++; + } else { + register Q_INT8 *p = (Q_INT8*)s; + while ( len-- ) + *this << *p++; + } } else { // write data char array dev->writeBlock( s, len ); } return *this; } #endif // QT_NO_DATASTREAM |