mirror of
https://github.com/OpenMW/openmw.git
synced 2025-10-15 08:26:37 +00:00
38 lines
1.1 KiB
C++
38 lines
1.1 KiB
C++
#ifndef COMPONENTS_FILES_UTILS_H
|
|
#define COMPONENTS_FILES_UTILS_H
|
|
|
|
#include <cerrno>
|
|
#include <format>
|
|
#include <istream>
|
|
#include <stdexcept>
|
|
#include <system_error>
|
|
|
|
namespace Files
|
|
{
|
|
inline std::streamsize getStreamSizeLeft(std::istream& stream)
|
|
{
|
|
const auto begin = stream.tellg();
|
|
if (stream.fail())
|
|
throw std::runtime_error(
|
|
std::format("Failed to get current file position: {}", std::generic_category().message(errno)));
|
|
|
|
stream.seekg(0, std::ios_base::end);
|
|
if (stream.fail())
|
|
throw std::runtime_error(
|
|
std::format("Failed to seek end file position: {}", std::generic_category().message(errno)));
|
|
|
|
const auto end = stream.tellg();
|
|
if (stream.fail())
|
|
throw std::runtime_error(
|
|
std::format("Failed to get current file position: {}", std::generic_category().message(errno)));
|
|
|
|
stream.seekg(begin);
|
|
if (stream.fail())
|
|
throw std::runtime_error(
|
|
std::format("Failed to seek original file position: {}", std::generic_category().message(errno)));
|
|
|
|
return end - begin;
|
|
}
|
|
}
|
|
|
|
#endif
|