diff --git a/RingStream.cpp b/RingStream.cpp index a03bfbf..4a75c1a 100644 --- a/RingStream.cpp +++ b/RingStream.cpp @@ -95,21 +95,22 @@ _count=prevCount+plength; return plength; } -int RingStream::read() { +int RingStream::read(byte advance) { if (_flashInsert) { // we are reading out of a flash string byte fb=GETFLASH(_flashInsert); - _flashInsert++; + _flashInsert+=advance; if (fb) return fb; // we have a byte from the flash // flash insert complete, clear and drop through to next buffer byte _flashInsert=NULL; } if ((_pos_read==_pos_write) && !_overflow) return -1; // empty - byte b=readRawByte(); + byte b=readRawByte(advance); if (b!=FLASH_INSERT_MARKER) return b; // Detected a flash insert // read address bytes LSB first (size depends on CPU) + if (advance == 0) readRawByte(); // read past it anyway uintptr_t iFlash=0; for (byte f=0; f( iFlash); // and try again... so will read the first byte of the insert. - return read(); + return read(advance); } -byte RingStream::readRawByte() { +byte RingStream::readRawByte(byte advance) { byte b=_buffer[_pos_read]; - _pos_read++; + _pos_read+=advance; if (_pos_read==_len) _pos_read=0; _overflow=false; return b; diff --git a/RingStream.h b/RingStream.h index 61c1737..2178dea 100644 --- a/RingStream.h +++ b/RingStream.h @@ -39,15 +39,17 @@ class RingStream : public Print { virtual int availableForWrite() override; using Print::write; size_t printFlash(const FSH * flashBuffer); - int read(); + inline int read() { return read(1); }; + inline int peek() { return read(0); }; int count(); int freeSpace(); void mark(uint8_t b); bool commit(); uint8_t peekTargetMark(); void flush(); - byte readRawByte(); private: + int read(byte advance); + byte readRawByte(byte advance=1); int _len; int _pos_write; int _pos_read;