You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
3.4 KiB
227 lines
3.4 KiB
#include <qpro/common.h>
|
|
|
|
|
|
#include "qpro/stream.h"
|
|
|
|
#ifdef __DECCXX
|
|
#include <fstream.h> // needed for filebuf
|
|
#endif
|
|
#include <string.h>
|
|
|
|
#ifdef USE_QT
|
|
|
|
#include <tqbuffer.h>
|
|
|
|
QpIStream::QpIStream(unsigned char* pBuffer, unsigned int pLen)
|
|
: cBuffer(pBuffer), cLen(pLen)
|
|
{
|
|
cByteArray.setRawData( (char*)cBuffer, (int) cLen );
|
|
|
|
cBuf.setBuffer( cByteArray );
|
|
cBuf.open( IO_ReadOnly );
|
|
|
|
setDevice( &cBuf );
|
|
setByteOrder(TQDataStream::LittleEndian);
|
|
}
|
|
|
|
QpIStream::~QpIStream()
|
|
{
|
|
cByteArray.resetRawData( (char*)cBuffer, (int) cLen );
|
|
}
|
|
|
|
#else
|
|
#include <string>
|
|
#include <fstream>
|
|
#include <strstream>
|
|
|
|
// For IRIX
|
|
namespace std {}
|
|
|
|
using namespace std;
|
|
|
|
QpIStream::QpIStream(const char* pFileName)
|
|
: cIn(0)
|
|
, cOffset(0L)
|
|
, cStreamBuf(0)
|
|
{
|
|
filebuf* lFileBuf = new filebuf;
|
|
|
|
cStreamBuf = lFileBuf;
|
|
|
|
lFileBuf->open(pFileName, ios::in);
|
|
|
|
if( lFileBuf->is_open())
|
|
{
|
|
cIn = new istream(cStreamBuf);
|
|
}
|
|
}
|
|
|
|
QpIStream::QpIStream(unsigned char* pBuffer, unsigned int pLen)
|
|
: cIn(0)
|
|
, cOffset(0L)
|
|
, cStreamBuf(0)
|
|
{
|
|
cStreamBuf = new std::strstreambuf (pBuffer, pLen);
|
|
|
|
cIn = new istream(cStreamBuf);
|
|
}
|
|
|
|
QpIStream::~QpIStream()
|
|
{
|
|
delete cIn;
|
|
cIn = 0;
|
|
|
|
delete cStreamBuf;
|
|
cStreamBuf = 0;
|
|
}
|
|
|
|
int
|
|
QpIStream::get()
|
|
{
|
|
int lResult;
|
|
|
|
if( (cIn==0) || cIn->rdstate())
|
|
{
|
|
lResult = EOF;
|
|
}
|
|
else
|
|
if((lResult=cIn->get()) == EOF)
|
|
{
|
|
// note - clear() sets bits! not clears them
|
|
cIn->clear(ios::eofbit|ios::failbit);
|
|
}
|
|
else
|
|
{
|
|
++cOffset;
|
|
}
|
|
|
|
return lResult;
|
|
}
|
|
|
|
QpIStream&
|
|
QpIStream::read(char* pBuf, TQP_INT16 pLen)
|
|
{
|
|
if( cIn )
|
|
{
|
|
cIn->read(pBuf, pLen);
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
QpIStream::operator void* ()
|
|
{
|
|
if( cIn == 0 )
|
|
return 0;
|
|
else
|
|
return cIn;
|
|
}
|
|
|
|
int
|
|
QpIStream::operator !()
|
|
{
|
|
return ( cIn ? !*cIn : -1 );
|
|
}
|
|
|
|
|
|
QpIStream&
|
|
QpIStream::operator >> (TQP_INT8 &pI8)
|
|
{
|
|
pI8 = get();
|
|
|
|
return *this;
|
|
}
|
|
|
|
QpIStream&
|
|
QpIStream::operator >> (TQP_UINT8 &pI8)
|
|
{
|
|
pI8 = get();
|
|
|
|
return *this;
|
|
}
|
|
|
|
QpIStream&
|
|
QpIStream::operator >> (TQP_INT16 &pI16)
|
|
{
|
|
pI16 = get();
|
|
pI16 = pI16 | (get() << 8);
|
|
|
|
return *this;
|
|
}
|
|
|
|
QpIStream&
|
|
QpIStream::operator >> (TQP_INT32 &pI32)
|
|
{
|
|
pI32 = get();
|
|
pI32 = pI32 | (get() << 8);
|
|
pI32 = pI32 | (get() << 16);
|
|
pI32 = pI32 | (get() << 24);
|
|
|
|
return *this;
|
|
}
|
|
|
|
QpIStream&
|
|
QpIStream::operator >> (TQP_INT64 &pI64)
|
|
{
|
|
// ??? sort out this
|
|
/******
|
|
pI64 = get();
|
|
pI64 = pI64 | (get() << 8);
|
|
pI64 = pI64 | (get() << 16);
|
|
pI64 = pI64 | (get() << 24);
|
|
pI64 = pI64 | (get() << 32);
|
|
pI64 = pI64 | (get() << 40);
|
|
pI64 = pI64 | (get() << 48);
|
|
pI64 = pI64 | (get() << 56);
|
|
***/
|
|
|
|
union
|
|
{
|
|
char lChar[8];
|
|
double lDble;
|
|
};
|
|
|
|
lDble = 0.0; // HACK: prevent gcc internal compiler error
|
|
lChar[0] = get();
|
|
lChar[1] = get();
|
|
lChar[2] = get();
|
|
lChar[3] = get();
|
|
lChar[4] = get();
|
|
lChar[5] = get();
|
|
lChar[6] = get();
|
|
lChar[7] = get();
|
|
|
|
pI64 = lDble;
|
|
|
|
return *this;
|
|
}
|
|
|
|
QpIStream&
|
|
QpIStream::operator >> (char*& pStr)
|
|
{
|
|
int lIdx=0;
|
|
int lMax=10;
|
|
|
|
char* lStr = new char[lMax];
|
|
|
|
while( cIn->get(lStr[lIdx]), lStr[lIdx] != '\0' && cIn->good() )
|
|
{
|
|
if( ++lIdx == lMax )
|
|
{
|
|
lMax += 10;
|
|
char* lNew = new char[lMax];
|
|
|
|
memcpy(lNew, lStr, lIdx);
|
|
delete [] lStr;
|
|
lStr = lNew;
|
|
}
|
|
}
|
|
|
|
pStr = lStr;
|
|
|
|
return *this;
|
|
}
|
|
|
|
#endif // USE_QT
|
|
|