diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2025-09-22 23:38:21 +0200 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2025-09-22 23:38:21 +0200 |
| commit | ce271f82f16ee89a18e7bfc9ed8eab7cbd6f37bc (patch) | |
| tree | 3e568faf83ae750aa244cca87b55951c7401ef03 /src/io.cc | |
| parent | 50348284f5d82ccfd65b0c803ba0ba895912ceff (diff) | |
Change io::Reader and company to return ReadError::Eof instead of 0.
It's debatable if Eof should be considered an error or not.
But it is pretty clear it generally is a special response that
needs special handling, so easier to keep with the unexpected lot.
Also keeps better at higher abstraction levels, such as the line
reader.
Diffstat (limited to 'src/io.cc')
| -rw-r--r-- | src/io.cc | 18 |
1 files changed, 12 insertions, 6 deletions
@@ -39,6 +39,8 @@ class BasicReader : public Reader { default: return std::unexpected(ReadError::Error); } + } else if (ret == 0 && max > 0) { + return std::unexpected(ReadError::Eof); } offset_ += ret; return ret; @@ -60,7 +62,7 @@ class BasicReader : public Reader { return std::unexpected(ReadError::Error); } // Don't want skip to go past (cached) file end. - if (!size_.has_value() || ret > size_.value()) { + if (!size_.has_value() || ret >= size_.value()) { // When going past end, double check that it still is the end. off_t ret2 = lseek(fd_.get(), 0, SEEK_END); if (ret2 < 0) { @@ -71,9 +73,11 @@ class BasicReader : public Reader { return std::unexpected(ReadError::Error); } size_ = ret2; - if (ret > ret2) { + if (ret >= ret2) { auto distance = ret2 - offset_; offset_ = ret2; + if (distance == 0 && max > 0) + return std::unexpected(ReadError::Eof); return distance; } // Seek back to where we should be @@ -99,6 +103,8 @@ class MemoryReader : public Reader { [[nodiscard]] std::expected<size_t, ReadError> read(void* dst, size_t max) override { size_t avail = size_ - offset_; + if (avail == 0 && max > 0) + return std::unexpected(io::ReadError::Eof); size_t ret = std::min(max, avail); memcpy(dst, reinterpret_cast<char*>(ptr_) + offset_, ret); offset_ += ret; @@ -147,14 +153,14 @@ class StringReader : public MemoryReader { std::expected<size_t, ReadError> Reader::repeat_read(void* dst, size_t max) { auto ret = read(dst, max); - if (!ret.has_value() || ret.value() == 0 || ret.value() == max) + if (!ret.has_value() || ret.value() == max) return ret; char* d = reinterpret_cast<char*>(dst); size_t offset = ret.value(); while (true) { ret = read(d + offset, max - offset); - if (!ret.has_value() || ret.value() == 0) + if (!ret.has_value()) break; offset += ret.value(); if (offset == max) @@ -165,13 +171,13 @@ std::expected<size_t, ReadError> Reader::repeat_read(void* dst, size_t max) { std::expected<size_t, ReadError> Reader::repeat_skip(size_t max) { auto ret = skip(max); - if (!ret.has_value() || ret.value() == 0 || ret.value() == max) + if (!ret.has_value() || ret.value() == max) return ret; size_t offset = ret.value(); while (true) { ret = skip(max - offset); - if (!ret.has_value() || ret.value() == 0) + if (!ret.has_value()) break; offset += ret.value(); if (offset == max) |
