diff options
author | Ava Chow <github@achow101.com> | 2024-01-02 16:34:50 -0500 |
---|---|---|
committer | Ava Chow <github@achow101.com> | 2024-04-01 14:37:24 -0400 |
commit | ca18aea5c4975ace4e307be96c74641d203fa389 (patch) | |
tree | af1fb649f9f10893d7a17f84369f973d40b7fa48 /src/streams.cpp | |
parent | 23ba39470c3d155a65f0616f8848ada730658301 (diff) | |
download | bitcoin-ca18aea5c4975ace4e307be96c74641d203fa389.tar.xz |
Add AutoFile::seek and tell
It's useful to be able to seek to a specific position in a file. Allow
AutoFile to seek by using fseek.
It's also useful to be able to get the current position in a file.
Allow AutoFile to tell by using ftell.
Diffstat (limited to 'src/streams.cpp')
-rw-r--r-- | src/streams.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/streams.cpp b/src/streams.cpp index 6921dad677..cdd36a86fe 100644 --- a/src/streams.cpp +++ b/src/streams.cpp @@ -21,6 +21,28 @@ std::size_t AutoFile::detail_fread(Span<std::byte> dst) } } +void AutoFile::seek(int64_t offset, int origin) +{ + if (IsNull()) { + throw std::ios_base::failure("AutoFile::seek: file handle is nullptr"); + } + if (std::fseek(m_file, offset, origin) != 0) { + throw std::ios_base::failure(feof() ? "AutoFile::seek: end of file" : "AutoFile::seek: fseek failed"); + } +} + +int64_t AutoFile::tell() +{ + if (IsNull()) { + throw std::ios_base::failure("AutoFile::tell: file handle is nullptr"); + } + int64_t r{std::ftell(m_file)}; + if (r < 0) { + throw std::ios_base::failure("AutoFile::tell: ftell failed"); + } + return r; +} + void AutoFile::read(Span<std::byte> dst) { if (detail_fread(dst) != dst.size()) { |