84 lines
2.3 KiB
C++
84 lines
2.3 KiB
C++
//This file is part of the reprodyne project and is licensed under the terms of the LGPL-3.0-only
|
|
|
|
|
|
#pragma once
|
|
|
|
#include <string>
|
|
|
|
namespace reprodyne
|
|
{
|
|
namespace FileFormat
|
|
{
|
|
|
|
//For 8 * 8 == 64 bit or enough for a 138,547,332 terrabyte file or versions... Should be enough for everybody.
|
|
//Integers are stored little endian because I felt like it
|
|
const int intSize = 8;
|
|
|
|
//"x3th", encoded as ascii. Manually, because I don't trust locales.
|
|
const int signatureOffset = 0;
|
|
const int signatureSize = 4;
|
|
const char fileSignature[signatureSize] = {0x78, 0x33, 0x74, 0x68};
|
|
|
|
const int versionOffset = signatureOffset + signatureSize;
|
|
const int versionSize = intSize;
|
|
|
|
const int currentFileFormatVersion = 0x01; //Good thing we used a 64 bit integer for this
|
|
|
|
const int uncompressedSizeOffset = versionOffset + versionSize;
|
|
const int uncompressedSizeSize = intSize;
|
|
|
|
const int compressedDataRegionOffset = uncompressedSizeOffset + uncompressedSizeSize;
|
|
|
|
const int reservedRangeSize = compressedDataRegionOffset;
|
|
|
|
inline uint64_t readInteger(unsigned char* pos)
|
|
{
|
|
uint64_t ret = 0;
|
|
for(int i = 0; i != intSize; ++i) ret = uint64_t(pos[i]) << i * 8 | ret;
|
|
return ret;
|
|
}
|
|
|
|
inline void writeInteger(unsigned char* pos, const uint64_t val)
|
|
{
|
|
for(int i = 0; i != intSize; ++i)
|
|
pos[i] = val >> i * 8;
|
|
}
|
|
|
|
inline void writeVersion(unsigned char* fileStart)
|
|
{
|
|
writeInteger(&fileStart[versionOffset], currentFileFormatVersion);
|
|
}
|
|
|
|
inline bool checkVersion(unsigned char* fileStart)
|
|
{
|
|
return readInteger(&fileStart[versionOffset]) == currentFileFormatVersion;
|
|
}
|
|
|
|
inline void writeSignature(unsigned char* fileStart)
|
|
{
|
|
for(int i = 0; i != signatureSize; ++i)
|
|
fileStart[i] = fileSignature[i];
|
|
}
|
|
|
|
inline bool checkSignature(unsigned char* fileStart)
|
|
{
|
|
return std::string(reinterpret_cast<char*>(fileStart), signatureSize)
|
|
== std::string(&fileSignature[0], signatureSize);
|
|
}
|
|
|
|
inline uint64_t readUncompressedSize(unsigned char* fileStart)
|
|
{
|
|
return readInteger(&fileStart[uncompressedSizeOffset]);
|
|
}
|
|
|
|
inline void writeBoringStuffToReservedRegion(unsigned char* filesStart, const uint64_t uncompressedSize)
|
|
{
|
|
writeSignature(filesStart);
|
|
writeVersion(filesStart);
|
|
writeInteger(&filesStart[uncompressedSizeOffset], uncompressedSize);
|
|
}
|
|
|
|
}//FileFormat
|
|
}//reprodyne
|
|
|