nstool/lib/fnd/io.cpp

74 lines
1.4 KiB
C++
Raw Normal View History

#include "io.h"
2017-07-02 15:18:59 +00:00
using namespace fnd;
static const std::string kModuleName = "IO";
2017-07-02 15:18:59 +00:00
static const size_t kBlockSize = 0x100000;
void io::readFile(const std::string& path, MemoryBlob & blob)
2017-07-02 15:18:59 +00:00
{
FILE* fp;
size_t filesz, filepos;
if ((fp = fopen(path.c_str(), "rb")) == NULL)
{
throw Exception(kModuleName, "Failed to open \"" + path + "\"");
}
fseek(fp, 0, SEEK_END);
filesz = ftell(fp);
rewind(fp);
try {
blob.alloc(filesz);
}
catch (const fnd::Exception& e)
2017-07-02 15:18:59 +00:00
{
fclose(fp);
throw fnd::Exception(kModuleName, "Failed to allocate memory for file: " + std::string(e.what()));
2017-07-02 15:18:59 +00:00
}
for (filepos = 0; filesz > kBlockSize; filesz -= kBlockSize, filepos += kBlockSize)
{
fread(blob.getBytes() + filepos, 1, kBlockSize, fp);
2017-07-02 15:18:59 +00:00
}
if (filesz)
{
fread(blob.getBytes() + filepos, 1, filesz, fp);
2017-07-02 15:18:59 +00:00
}
fclose(fp);
}
void io::writeFile(const std::string& path, const MemoryBlob & blob)
2017-07-02 15:18:59 +00:00
{
writeFile(path, blob.getBytes(), blob.getSize());
2017-07-05 09:17:04 +00:00
}
void io::writeFile(const std::string & path, const u8 * data, size_t len)
2017-07-05 09:17:04 +00:00
{
FILE* fp;
size_t filesz, filepos;
if ((fp = fopen(path.c_str(), "wb")) == NULL)
{
throw Exception(kModuleName, "Failed to open \"" + path + "\"");
}
filesz = len;
2017-07-02 15:18:59 +00:00
2017-07-05 09:17:04 +00:00
for (filepos = 0; filesz > kBlockSize; filesz -= kBlockSize, filepos += kBlockSize)
{
fwrite(data + filepos, 1, kBlockSize, fp);
}
if (filesz)
{
2017-07-05 15:36:59 +00:00
fwrite(data + filepos, 1, filesz, fp);
2017-07-05 09:17:04 +00:00
}
fclose(fp);
2017-07-02 15:18:59 +00:00
}