summaryrefslogtreecommitdiff
path: root/src/io.cc
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2025-09-22 23:38:21 +0200
committerJoel Klinghed <the_jk@spawned.biz>2025-09-22 23:38:21 +0200
commitce271f82f16ee89a18e7bfc9ed8eab7cbd6f37bc (patch)
tree3e568faf83ae750aa244cca87b55951c7401ef03 /src/io.cc
parent50348284f5d82ccfd65b0c803ba0ba895912ceff (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.cc18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/io.cc b/src/io.cc
index 44970fe..99c0518 100644
--- a/src/io.cc
+++ b/src/io.cc
@@ -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)