mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-02-18 19:41:29 +00:00
Add seek to file streams
This commit is contained in:
parent
61db3426a3
commit
a5e7be56c1
2 changed files with 61 additions and 3 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue