#include #include #include #include #include #include #include namespace FEXCore::FileLoading { template static bool LoadFileImpl(T &Data, const fextl::string &Filepath, size_t FixedSize) { int FD = open(Filepath.c_str(), O_RDONLY); if (FD == -1) { return false; } size_t FileSize{}; if (FixedSize == 0) { struct stat buf; if (fstat(FD, &buf) != 0) { close(FD); return false; } FileSize = buf.st_size; } else { FileSize = FixedSize; } ssize_t Read = -1; if (FileSize > 0) { Data.resize(FileSize); Read = pread(FD, &Data.at(0), FileSize, 0); } close(FD); return Read == FileSize; } bool LoadFile(fextl::vector &Data, const fextl::string &Filepath, size_t FixedSize) { return LoadFileImpl(Data, Filepath, FixedSize); } bool LoadFile(fextl::string &Data, const fextl::string &Filepath, size_t FixedSize) { return LoadFileImpl(Data, Filepath, FixedSize); } ssize_t LoadFileToBuffer(const fextl::string &Filepath, std::span Buffer) { int FD = open(Filepath.c_str(), O_RDONLY); if (FD == -1) { return -1; } ssize_t Read = pread(FD, Buffer.data(), Buffer.size(), 0); close(FD); return Read; } }