diff options
author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-01-24 03:07:00 +0100 |
---|---|---|
committer | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-01-24 03:07:00 +0100 |
commit | 4c5ecbe39bf17ebd1c663c863cef5094f53caf86 (patch) | |
tree | f02551371b0cdd0563136ba22d831781d01afc91 | |
parent | fcdc9e28805138383c6ef662ea5e3822720b772c (diff) |
Added seek function to CharReader, improved getOffset
-rw-r--r-- | src/core/common/CharReader.cpp | 21 | ||||
-rw-r--r-- | src/core/common/CharReader.hpp | 22 |
2 files changed, 34 insertions, 9 deletions
diff --git a/src/core/common/CharReader.cpp b/src/core/common/CharReader.cpp index 6fd3d45..07482ff 100644 --- a/src/core/common/CharReader.cpp +++ b/src/core/common/CharReader.cpp @@ -502,16 +502,31 @@ size_t CharReader::readRaw(char *buf, size_t size) return res; } +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); + buffer->copyCursor(readCursor, peekCursor); + coherent = true; + + // Clamp to values larger or equal to zero + return reachedOffs < 0 ? 0 : reachedOffs; +} + bool CharReader::atEnd() const { return buffer->atEnd(readCursor); } -SourceOffset CharReader::getOffset() const +size_t CharReader::getOffset() const { return buffer->offset(readCursor) + offs; } -SourcePosition CharReader::getPosition() const +size_t CharReader::getPeekOffset() const { - return getOffset(); + return buffer->offset(readCursor) + offs; } SourceLocation CharReader::getLocation() const diff --git a/src/core/common/CharReader.hpp b/src/core/common/CharReader.hpp index 5a4d906..cbd7b74 100644 --- a/src/core/common/CharReader.hpp +++ b/src/core/common/CharReader.hpp @@ -297,8 +297,7 @@ public: * @param relativeOffs is a positive or negative integer number specifying * the number of bytes the cursor should be moved forward (positive numbers) * or backwards (negative numbers). - * @return the actual number of bytes the cursor was moved. This number is - * smaller than the relativeOffs given in the constructor if the + * @return the actual number of bytes the cursor was moved. */ ssize_t moveCursor(CursorId cursor, ssize_t relativeOffs); @@ -523,6 +522,17 @@ public: size_t readRaw(char *buf, size_t size); /** + * Moves read and peek cursor to the requested offset. Returns the offset + * that was actually reached. + * + * @param requestedOffset is the requested offset. This offset may no longer + * be reachable by the CharReader. + * @return the actually reached offset. The operation was successful, if + * the requested and reached offset are equal. + */ + size_t seek(size_t requestedOffset); + + /** * Returns true if there are no more characters as the stream was closed. * * @return true if there is no more data. @@ -534,14 +544,14 @@ public: * * @return the offset of the read cursor in bytes. */ - SourceOffset getOffset() const; + size_t getOffset() const; /** - * Returns the offset of the read cursor in bytes. + * Returns the offset of the peek cursor in bytes. * - * @return the offset of the read cursor in bytes. + * @return the offset of the peek cursor in bytes. */ - SourcePosition getPosition() const; + size_t getPeekOffset() const; /** * Returns a SourceLocation object describing the exact position (including |