mirror of
https://github.com/OpenMW/openmw.git
synced 2025-10-14 11:26:40 +00:00
Use proper naming for BSA File and Hash members
This commit is contained in:
parent
bed84e209b
commit
91ccb0fe8d
5 changed files with 40 additions and 38 deletions
|
@ -170,8 +170,8 @@ int list(std::unique_ptr<File>& bsa, Arguments& info)
|
||||||
// Long format
|
// Long format
|
||||||
std::ios::fmtflags f(std::cout.flags());
|
std::ios::fmtflags f(std::cout.flags());
|
||||||
std::cout << std::setw(50) << std::left << file.name();
|
std::cout << std::setw(50) << std::left << file.name();
|
||||||
std::cout << std::setw(8) << std::left << std::dec << file.fileSize;
|
std::cout << std::setw(8) << std::left << std::dec << file.mFileSize;
|
||||||
std::cout << "@ 0x" << std::hex << file.offset << std::endl;
|
std::cout << "@ 0x" << std::hex << file.mOffset << std::endl;
|
||||||
std::cout.flags(f);
|
std::cout.flags(f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -61,8 +61,8 @@ namespace Bsa
|
||||||
mFolders[dirHash][{ nameHash, extHash }] = file;
|
mFolders[dirHash][{ nameHash, extHash }] = file;
|
||||||
|
|
||||||
FileStruct fileStruct{};
|
FileStruct fileStruct{};
|
||||||
fileStruct.fileSize = file.size;
|
fileStruct.mFileSize = file.size;
|
||||||
fileStruct.offset = file.offset;
|
fileStruct.mOffset = file.offset;
|
||||||
mFiles.push_back(fileStruct);
|
mFiles.push_back(fileStruct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,7 +54,7 @@ BSAFile::Hash getHash(const std::string& name)
|
||||||
sum ^= (((unsigned)(name[i])) << (off & 0x1F));
|
sum ^= (((unsigned)(name[i])) << (off & 0x1F));
|
||||||
off += 8;
|
off += 8;
|
||||||
}
|
}
|
||||||
hash.low = sum;
|
hash.mLow = sum;
|
||||||
|
|
||||||
for (sum = off = 0; i < name.size(); i++)
|
for (sum = off = 0; i < name.size(); i++)
|
||||||
{
|
{
|
||||||
|
@ -64,7 +64,7 @@ BSAFile::Hash getHash(const std::string& name)
|
||||||
sum = (sum << (32 - n)) | (sum >> n); // binary "rotate right"
|
sum = (sum << (32 - n)) | (sum >> n); // binary "rotate right"
|
||||||
off += 8;
|
off += 8;
|
||||||
}
|
}
|
||||||
hash.high = sum;
|
hash.mHigh = sum;
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,11 +166,11 @@ void BSAFile::readHeader()
|
||||||
for (size_t i = 0; i < filenum; i++)
|
for (size_t i = 0; i < filenum; i++)
|
||||||
{
|
{
|
||||||
FileStruct& fs = mFiles[i];
|
FileStruct& fs = mFiles[i];
|
||||||
fs.fileSize = offsets[i * 2];
|
fs.mFileSize = offsets[i * 2];
|
||||||
fs.offset = static_cast<uint32_t>(offsets[i * 2 + 1] + fileDataOffset);
|
fs.mOffset = static_cast<uint32_t>(offsets[i * 2 + 1] + fileDataOffset);
|
||||||
auto namesOffset = offsets[2 * filenum + i];
|
auto namesOffset = offsets[2 * filenum + i];
|
||||||
fs.setNameInfos(namesOffset, &mStringBuf);
|
fs.setNameInfos(namesOffset, &mStringBuf);
|
||||||
fs.hash = hashes[i];
|
fs.mHash = hashes[i];
|
||||||
|
|
||||||
if (namesOffset >= mStringBuf.size())
|
if (namesOffset >= mStringBuf.size())
|
||||||
{
|
{
|
||||||
|
@ -185,13 +185,13 @@ void BSAFile::readHeader()
|
||||||
endOfNameBuffer = std::max(endOfNameBuffer, namesOffset + std::strlen(fs.name()) + 1);
|
endOfNameBuffer = std::max(endOfNameBuffer, namesOffset + std::strlen(fs.name()) + 1);
|
||||||
assert(endOfNameBuffer <= mStringBuf.size());
|
assert(endOfNameBuffer <= mStringBuf.size());
|
||||||
|
|
||||||
if (fs.offset + fs.fileSize > fsize)
|
if (fs.mOffset + fs.mFileSize > fsize)
|
||||||
fail("Archive contains offsets outside itself");
|
fail("Archive contains offsets outside itself");
|
||||||
}
|
}
|
||||||
mStringBuf.resize(endOfNameBuffer);
|
mStringBuf.resize(endOfNameBuffer);
|
||||||
|
|
||||||
std::sort(mFiles.begin(), mFiles.end(),
|
std::sort(mFiles.begin(), mFiles.end(),
|
||||||
[](const FileStruct& left, const FileStruct& right) { return left.offset < right.offset; });
|
[](const FileStruct& left, const FileStruct& right) { return left.mOffset < right.mOffset; });
|
||||||
|
|
||||||
mIsLoaded = true;
|
mIsLoaded = true;
|
||||||
}
|
}
|
||||||
|
@ -203,7 +203,7 @@ void Bsa::BSAFile::writeHeader()
|
||||||
|
|
||||||
uint32_t head[3];
|
uint32_t head[3];
|
||||||
head[0] = 0x100;
|
head[0] = 0x100;
|
||||||
auto fileDataOffset = mFiles.empty() ? 12 : mFiles.front().offset;
|
auto fileDataOffset = mFiles.empty() ? 12 : mFiles.front().mOffset;
|
||||||
head[1] = static_cast<uint32_t>(fileDataOffset - 12 - 8 * mFiles.size());
|
head[1] = static_cast<uint32_t>(fileDataOffset - 12 - 8 * mFiles.size());
|
||||||
|
|
||||||
output.seekp(0, std::ios_base::end);
|
output.seekp(0, std::ios_base::end);
|
||||||
|
@ -213,7 +213,7 @@ void Bsa::BSAFile::writeHeader()
|
||||||
output.write(reinterpret_cast<char*>(head), 12);
|
output.write(reinterpret_cast<char*>(head), 12);
|
||||||
|
|
||||||
std::sort(mFiles.begin(), mFiles.end(), [](const FileStruct& left, const FileStruct& right) {
|
std::sort(mFiles.begin(), mFiles.end(), [](const FileStruct& left, const FileStruct& right) {
|
||||||
return std::make_pair(left.hash.low, left.hash.high) < std::make_pair(right.hash.low, right.hash.high);
|
return std::make_pair(left.mHash.mLow, left.mHash.mHigh) < std::make_pair(right.mHash.mLow, right.mHash.mHigh);
|
||||||
});
|
});
|
||||||
|
|
||||||
size_t filenum = mFiles.size();
|
size_t filenum = mFiles.size();
|
||||||
|
@ -222,10 +222,10 @@ void Bsa::BSAFile::writeHeader()
|
||||||
for (size_t i = 0; i < filenum; i++)
|
for (size_t i = 0; i < filenum; i++)
|
||||||
{
|
{
|
||||||
auto& f = mFiles[i];
|
auto& f = mFiles[i];
|
||||||
offsets[i * 2] = f.fileSize;
|
offsets[i * 2] = f.mFileSize;
|
||||||
offsets[i * 2 + 1] = f.offset - fileDataOffset;
|
offsets[i * 2 + 1] = f.mOffset - fileDataOffset;
|
||||||
offsets[2 * filenum + i] = f.namesOffset;
|
offsets[2 * filenum + i] = f.mNameOffset;
|
||||||
hashes[i] = f.hash;
|
hashes[i] = f.mHash;
|
||||||
}
|
}
|
||||||
output.write(reinterpret_cast<char*>(offsets.data()), sizeof(uint32_t) * offsets.size());
|
output.write(reinterpret_cast<char*>(offsets.data()), sizeof(uint32_t) * offsets.size());
|
||||||
output.write(reinterpret_cast<char*>(mStringBuf.data()), mStringBuf.size());
|
output.write(reinterpret_cast<char*>(mStringBuf.data()), mStringBuf.size());
|
||||||
|
@ -265,7 +265,7 @@ void Bsa::BSAFile::close()
|
||||||
|
|
||||||
Files::IStreamPtr Bsa::BSAFile::getFile(const FileStruct* file)
|
Files::IStreamPtr Bsa::BSAFile::getFile(const FileStruct* file)
|
||||||
{
|
{
|
||||||
return Files::openConstrainedFileStream(mFilepath, file->offset, file->fileSize);
|
return Files::openConstrainedFileStream(mFilepath, file->mOffset, file->mFileSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bsa::BSAFile::addFile(const std::string& filename, std::istream& file)
|
void Bsa::BSAFile::addFile(const std::string& filename, std::istream& file)
|
||||||
|
@ -281,33 +281,33 @@ void Bsa::BSAFile::addFile(const std::string& filename, std::istream& file)
|
||||||
|
|
||||||
FileStruct newFile;
|
FileStruct newFile;
|
||||||
file.seekg(0, std::ios::end);
|
file.seekg(0, std::ios::end);
|
||||||
newFile.fileSize = static_cast<uint32_t>(file.tellg());
|
newFile.mFileSize = static_cast<uint32_t>(file.tellg());
|
||||||
newFile.setNameInfos(mStringBuf.size(), &mStringBuf);
|
newFile.setNameInfos(mStringBuf.size(), &mStringBuf);
|
||||||
newFile.hash = getHash(filename);
|
newFile.mHash = getHash(filename);
|
||||||
|
|
||||||
if (mFiles.empty())
|
if (mFiles.empty())
|
||||||
newFile.offset = static_cast<uint32_t>(newStartOfDataBuffer);
|
newFile.mOffset = static_cast<uint32_t>(newStartOfDataBuffer);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::vector<char> buffer;
|
std::vector<char> buffer;
|
||||||
while (mFiles.front().offset < newStartOfDataBuffer)
|
while (mFiles.front().mOffset < newStartOfDataBuffer)
|
||||||
{
|
{
|
||||||
FileStruct& firstFile = mFiles.front();
|
FileStruct& firstFile = mFiles.front();
|
||||||
buffer.resize(firstFile.fileSize);
|
buffer.resize(firstFile.mFileSize);
|
||||||
|
|
||||||
stream.seekg(firstFile.offset, std::ios::beg);
|
stream.seekg(firstFile.mOffset, std::ios::beg);
|
||||||
stream.read(buffer.data(), firstFile.fileSize);
|
stream.read(buffer.data(), firstFile.mFileSize);
|
||||||
|
|
||||||
stream.seekp(0, std::ios::end);
|
stream.seekp(0, std::ios::end);
|
||||||
firstFile.offset = static_cast<uint32_t>(stream.tellp());
|
firstFile.mOffset = static_cast<uint32_t>(stream.tellp());
|
||||||
|
|
||||||
stream.write(buffer.data(), firstFile.fileSize);
|
stream.write(buffer.data(), firstFile.mFileSize);
|
||||||
|
|
||||||
// ensure sort order is preserved
|
// ensure sort order is preserved
|
||||||
std::rotate(mFiles.begin(), mFiles.begin() + 1, mFiles.end());
|
std::rotate(mFiles.begin(), mFiles.begin() + 1, mFiles.end());
|
||||||
}
|
}
|
||||||
stream.seekp(0, std::ios::end);
|
stream.seekp(0, std::ios::end);
|
||||||
newFile.offset = static_cast<uint32_t>(stream.tellp());
|
newFile.mOffset = static_cast<uint32_t>(stream.tellp());
|
||||||
}
|
}
|
||||||
|
|
||||||
mStringBuf.insert(mStringBuf.end(), filename.begin(), filename.end());
|
mStringBuf.insert(mStringBuf.end(), filename.begin(), filename.end());
|
||||||
|
|
|
@ -54,7 +54,8 @@ namespace Bsa
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
struct Hash
|
struct Hash
|
||||||
{
|
{
|
||||||
uint32_t low, high;
|
uint32_t mLow;
|
||||||
|
uint32_t mHigh;
|
||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
@ -63,21 +64,22 @@ namespace Bsa
|
||||||
{
|
{
|
||||||
void setNameInfos(size_t index, std::vector<char>* stringBuf)
|
void setNameInfos(size_t index, std::vector<char>* stringBuf)
|
||||||
{
|
{
|
||||||
namesOffset = static_cast<uint32_t>(index);
|
mNameOffset = static_cast<uint32_t>(index);
|
||||||
namesBuffer = stringBuf;
|
mNamesBuffer = stringBuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
// File size and offset in file. We store the offset from the
|
// File size and offset in file. We store the offset from the
|
||||||
// beginning of the file, not the offset into the data buffer
|
// beginning of the file, not the offset into the data buffer
|
||||||
// (which is what is stored in the archive.)
|
// (which is what is stored in the archive.)
|
||||||
uint32_t fileSize, offset;
|
uint32_t mFileSize = 0;
|
||||||
Hash hash;
|
uint32_t mOffset = 0;
|
||||||
|
Hash mHash{};
|
||||||
|
|
||||||
// Zero-terminated file name
|
// Zero-terminated file name
|
||||||
const char* name() const { return &(*namesBuffer)[namesOffset]; }
|
const char* name() const { return &(*mNamesBuffer)[mNameOffset]; }
|
||||||
|
|
||||||
uint32_t namesOffset = 0;
|
uint32_t mNameOffset = 0;
|
||||||
std::vector<char>* namesBuffer = nullptr;
|
std::vector<char>* mNamesBuffer = nullptr;
|
||||||
};
|
};
|
||||||
typedef std::vector<FileStruct> FileList;
|
typedef std::vector<FileStruct> FileList;
|
||||||
|
|
||||||
|
|
|
@ -181,8 +181,8 @@ namespace Bsa
|
||||||
for (auto& [hash, fileRec] : folderMap.mFiles)
|
for (auto& [hash, fileRec] : folderMap.mFiles)
|
||||||
{
|
{
|
||||||
FileStruct fileStruct{};
|
FileStruct fileStruct{};
|
||||||
fileStruct.fileSize = fileRec.mSize & (~FileSizeFlag_Compression);
|
fileStruct.mFileSize = fileRec.mSize & (~FileSizeFlag_Compression);
|
||||||
fileStruct.offset = fileRec.mOffset;
|
fileStruct.mOffset = fileRec.mOffset;
|
||||||
fileStruct.setNameInfos(0, &fileRec.mName);
|
fileStruct.setNameInfos(0, &fileRec.mName);
|
||||||
mFiles.emplace_back(fileStruct);
|
mFiles.emplace_back(fileStruct);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue