diff options
author | Benjamin Paassen <bpaassen@techfak.uni-bielefeld.de> | 2015-02-08 19:49:17 +0100 |
---|---|---|
committer | Benjamin Paassen <bpaassen@techfak.uni-bielefeld.de> | 2015-02-08 19:49:17 +0100 |
commit | 9ef316ed4ea8542973d272fa9c7b4c6804b28144 (patch) | |
tree | 1e884c61b5915f913c8db404cc9137bbe8eae01c /src/core/common/CharReader.cpp | |
parent | 05e5a4ab340d0f9f3490e7db9c8e42f70cc471da (diff) | |
parent | f6e7859a835375c25226719a46df99ec11037599 (diff) |
Merge branch 'master' of somweyr.de:ousia
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; } |