in src/afs.cc [342:403]
size_t read(size_t n, void* output)
{
#ifdef AFS_VERBOSE
const char* tag = "read";
#endif
P("%s: %s: %s: before: (%" PRIsize ":%" PRIsize ") %" PRIsize,
Tag,
tag_,
tag,
data_->head,
data_->tail,
n);
size_t readSize = 0;
const auto input = address_;
if (data_->head > data_->tail)
{
const auto firstHalfReadSize = std::min(n, data_->total - data_->head);
P("%s: %s: %s: first half: (%" PRIsize ":%" PRIsize ") %" PRIsize
":%" PRIsize,
Tag,
tag_,
tag,
data_->head,
data_->tail,
n,
firstHalfReadSize);
memcpy(output, input + data_->head, firstHalfReadSize);
data_->head = (data_->head + firstHalfReadSize) % data_->total;
n -= firstHalfReadSize;
readSize += firstHalfReadSize;
}
if (n > 0 && data_->head != data_->tail)
{
const auto lastHalfReadSize = std::min(n, data_->tail - data_->head);
P("%s: %s: %s: last half: (%" PRIsize ":%" PRIsize ") %" PRIsize ":%" PRIsize,
Tag,
tag_,
tag,
data_->head,
data_->tail,
n,
lastHalfReadSize);
memcpy(static_cast<uint8_t*>(output) + readSize,
input + data_->head,
lastHalfReadSize);
data_->head += lastHalfReadSize;
n -= lastHalfReadSize;
readSize += lastHalfReadSize;
}
P("%s: %s: %s: after: (%" PRIsize ":%" PRIsize ") %" PRIsize ":%" PRIsize
" [%s] [%s]",
Tag,
tag_,
tag,
data_->head,
data_->tail,
n,
readSize,
arrow::HexEncode(reinterpret_cast<const uint8_t*>(output), readSize).c_str(),
arrow::HexEncode(reinterpret_cast<const uint8_t*>(input), readSize).c_str());
return readSize;
}