summaryrefslogtreecommitdiff
path: root/src/core/common/CharReader.cpp
diff options
context:
space:
mode:
authorBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2015-02-08 19:49:17 +0100
committerBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2015-02-08 19:49:17 +0100
commit9ef316ed4ea8542973d272fa9c7b4c6804b28144 (patch)
tree1e884c61b5915f913c8db404cc9137bbe8eae01c /src/core/common/CharReader.cpp
parent05e5a4ab340d0f9f3490e7db9c8e42f70cc471da (diff)
parentf6e7859a835375c25226719a46df99ec11037599 (diff)
Merge branch 'master' of somweyr.de:ousia
Diffstat (limited to 'src/core/common/CharReader.cpp')
-rw-r--r--src/core/common/CharReader.cpp32
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;
}