Add seek to file streams

This commit is contained in:
Eidolon 2024-02-19 18:27:24 -06:00
parent 61db3426a3
commit a5e7be56c1
2 changed files with 61 additions and 3 deletions

View file

@ -166,3 +166,63 @@ void FileStream::close()
file_ = nullptr;
}
static int portable_fseek64(FILE* file, int64_t offset, int origin)
{
#ifdef _MSC_VER
return _fseeki64(file, offset, origin);
#elif __APPLE__
return fseeko(file, offset, origin);
#else
return fseeko64(file, offset, origin);
#endif
}
static int64_t portable_ftell64(FILE* file)
{
#ifdef _MSC_VER
return _ftelli64(file);
#elif __APPLE__
return ftello(file);
#else
return ftello64(file);
#endif
}
StreamSize FileStream::seek(SeekFrom seek_from, StreamOffset offset)
{
if (!file_)
{
throw std::domain_error("FileStream is empty");
}
int origin;
switch (seek_from)
{
case SeekFrom::kStart:
origin = SEEK_SET;
break;
case SeekFrom::kCurrent:
origin = SEEK_CUR;
break;
case SeekFrom::kEnd:
origin = SEEK_END;
break;
default:
throw std::invalid_argument("invalid SeekFrom");
}
if (portable_fseek64((FILE*)(file_), offset, origin) != 0)
{
int err = errno;
throw make_exception_from_errno(err);
}
StreamOffset newpos = portable_ftell64((FILE*)(file_));
if (newpos < 0)
{
int err = errno;
throw make_exception_from_errno(err);
}
return newpos;
}

View file

@ -616,9 +616,7 @@ public:
StreamSize read(tcb::span<std::byte> buffer);
StreamSize write(tcb::span<const std::byte> buffer);
// not bothering with seeking for now -- apparently 64-bit file positions is not available in ansi c
// StreamSize seek(SeekFrom seek_from, StreamOffset offset);
StreamSize seek(SeekFrom seek_from, StreamOffset offset);
void close();
};