summaryrefslogtreecommitdiff
path: root/qmake/tools/qdatastream.cpp
Side-by-side diff
Diffstat (limited to 'qmake/tools/qdatastream.cpp') (more/less context) (show whitespace changes)
-rw-r--r--qmake/tools/qdatastream.cpp14
1 files changed, 14 insertions, 0 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;
+ 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
+ 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