From: Christian P. <cp...@us...> - 2005-01-07 13:33:28
|
Update of /cvsroot/pclasses/pclasses2/src/IO In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3043/src/IO Modified Files: IODevice.cpp Log Message: Added IODevice::readLine() Index: IODevice.cpp =================================================================== RCS file: /cvsroot/pclasses/pclasses2/src/IO/IODevice.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- IODevice.cpp 6 Jan 2005 17:24:20 -0000 1.6 +++ IODevice.cpp 7 Jan 2005 13:33:15 -0000 1.7 @@ -20,19 +20,21 @@ #include "pclasses/IO/IODevice.h" #include "pclasses/IO/IOFilter.h" +#include <sstream> namespace P { namespace IO { IODevice::IODevice() throw() -: _filter(0), _filterOwner(false), _valid(false), _access(None), _eof(true) +: _filter(0), _filterOwner(false), _valid(false), _access(None), _eof(true), + _readBuffer(0), _readBuffCount(0) { } IODevice::IODevice(const IODevice& dev) throw() : _filter(0), _filterOwner(false), _valid(dev._valid), _access(dev._access), - _eof(dev._eof) + _eof(dev._eof), _readBuffer(0), _readBuffCount(0) { if(dev._filter) { @@ -46,12 +48,17 @@ { if(_filterOwner) delete _filter; + + if(_readBuffer) + delete[] _readBuffer; } void IODevice::close() throw(IOError) { if(valid()) { + _readBuffCount = 0; + if(_filter) _filter->sync(true); @@ -61,7 +68,68 @@ size_t IODevice::read(char* buffer, size_t count) throw(IOError) { - return _filter ? _filter->read(buffer, count) : _read(buffer, count); + size_t offset = 0; + + // deliver buffered bytes first ... + if(_readBuffer && _readBuffCount) + { + size_t n = _readBuffCount > count ? count : _readBuffCount; + memcpy(buffer, _readBuffNext, n); + _readBuffCount -= n; + _readBuffNext += n; + offset = n; + count -= n; + if(!count) + return n; + } + + return _filter ? + (_filter->read(buffer + offset, count) + offset) + : (_read(buffer + offset, count) + offset); +} + +std::string IODevice::readLine() throw(IOError) +{ + // alloce read buffer if we have'nt done it yet ... + if(!_readBuffer) + { + _readBuffer = new char[1024]; + _readBuffSize = 1024; + _readBuffCount = 0; + _readBuffNext = 0; + } + + std::ostringstream ret; + + // read data until newline ... + bool finished = false; + while(!finished) + { + // buffer is empty, read some more ... + if(!_readBuffCount) + { + size_t bytesRead = read(_readBuffer, _readBuffSize); + if(!bytesRead) + break; + + _readBuffCount = bytesRead; + _readBuffNext = _readBuffer; + } + + // search for newline ... + for(size_t i = 0; i < _readBuffCount; i++) + { + ret << *_readBuffNext; + --_readBuffCount; + if(*_readBuffNext++ == '\n') + { + finished = true; + break; + } + } + } + + return ret.str(); } size_t IODevice::write(const char* buffer, size_t count) throw(IOError) @@ -215,6 +283,7 @@ _valid = dev._valid; _access = dev._access; _eof = dev._eof; + _readBuffCount = 0; return *this; } |