diff options
author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-02-08 17:53:15 +0100 |
---|---|---|
committer | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-02-08 17:53:15 +0100 |
commit | fb0922e57f1a5e1fb8bfbe153dc381d5778e3137 (patch) | |
tree | 5ae5197acad0c086ba2a3d14926dedf3b5cfa246 /src/core/common/CharReader.cpp | |
parent | c2b9597c49abeef3f333b1bf7221a51019d53668 (diff) |
Added seekPeekCursor function to CharReader, improved how seeking is handled by adding seekCursor method to Buffer
Diffstat (limited to 'src/core/common/CharReader.cpp')
-rw-r--r-- | src/core/common/CharReader.cpp | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/src/core/common/CharReader.cpp b/src/core/common/CharReader.cpp index edcaf76..5b9b1d4 100644 --- a/src/core/common/CharReader.cpp +++ b/src/core/common/CharReader.cpp @@ -329,6 +329,19 @@ ssize_t Buffer::moveCursor(CursorId cursor, ssize_t relativeOffs) } } +size_t Buffer::seekCursor(CursorId cursor, size_t offs) +{ + // Fetch the current offset + const ssize_t currentOffs = offset(cursor); + const ssize_t relativeOffs = offs - currentOffs; + + // Perform the actual seeking, move the peek cursor to the read cursor + const ssize_t reachedOffs = currentOffs + moveCursor(cursor, relativeOffs); + + // Clamp to values larger or equal to zero + return reachedOffs < 0 ? 0 : reachedOffs; +} + bool Buffer::atEnd(Buffer::CursorId cursor) const { const Cursor &c = cursors[cursor]; @@ -504,17 +517,17 @@ size_t CharReader::readRaw(char *buf, size_t size) size_t CharReader::seek(size_t requestedOffset) { - // Fetch the current offset - const ssize_t currentOffs = getOffset(); - const ssize_t relativeOffs = requestedOffset - currentOffs; - - // Perform the actual seeking, move the peek cursor to the read cursor - const ssize_t reachedOffs = currentOffs + buffer->moveCursor(readCursor, relativeOffs); + const size_t res = buffer->seekCursor(readCursor, requestedOffset); buffer->copyCursor(readCursor, peekCursor); coherent = true; + return res; +} - // Clamp to values larger or equal to zero - return reachedOffs < 0 ? 0 : reachedOffs; +size_t CharReader::seekPeekCursor(size_t requestedOffset) +{ + const size_t res = buffer->seekCursor(peekCursor, requestedOffset); + coherent = (res == getOffset()); + return res; } bool CharReader::atEnd() const { return buffer->atEnd(readCursor); } @@ -526,6 +539,9 @@ size_t CharReader::getOffset() const size_t CharReader::getPeekOffset() const { + if (coherent) { + return getOffset(); + } return buffer->offset(peekCursor) + offs; } |