mirror of
https://github.com/sockspls/badfish
synced 2025-05-01 01:03:09 +00:00
Improve TBFile API
Do more work inside TBFile::map() and simplify the init functions.
This commit is contained in:
parent
0fcc2addd1
commit
145c9d943b
1 changed files with 41 additions and 56 deletions
|
@ -420,11 +420,15 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
// Memory map the file. File is closed after mapping
|
||||
char* map(uint64_t* mapping) {
|
||||
|
||||
assert(is_open());
|
||||
// Memory map the file and check it. File should be already open and
|
||||
// will be closed after mapping.
|
||||
uint8_t* map(char** baseAddress, uint64_t* mapping, const uint8_t TB_MAGIC[]) {
|
||||
|
||||
if (!is_open()) {
|
||||
std::cerr << "Could not find " << fname << std::endl;
|
||||
*baseAddress = nullptr;
|
||||
return nullptr;
|
||||
}
|
||||
close();
|
||||
|
||||
#ifndef _WIN32
|
||||
|
@ -432,10 +436,10 @@ public:
|
|||
int fd = ::open(fname.c_str(), O_RDONLY);
|
||||
fstat(fd, &statbuf);
|
||||
*mapping = statbuf.st_size;
|
||||
char* data = (char*)mmap(nullptr, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0);
|
||||
*baseAddress = (char*)mmap(nullptr, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0);
|
||||
::close(fd);
|
||||
|
||||
if (data == (char*)(-1)) {
|
||||
if (*baseAddress == (char*)(-1)) {
|
||||
std::cerr << "Could not mmap() " << fname << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
|
@ -453,23 +457,35 @@ public:
|
|||
}
|
||||
|
||||
*mapping = (uint64_t)mmap;
|
||||
char* data = (char*)MapViewOfFile(mmap, FILE_MAP_READ, 0, 0, 0);
|
||||
*baseAddress = (char*)MapViewOfFile(mmap, FILE_MAP_READ, 0, 0, 0);
|
||||
|
||||
if (!data) {
|
||||
if (!*baseAddress) {
|
||||
std::cerr << "MapViewOfFile() failed, name = " << fname
|
||||
<< ", error = " << GetLastError() << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
#endif
|
||||
uint8_t* data = (uint8_t*)*baseAddress;
|
||||
|
||||
if ( *data++ != TB_MAGIC[0]
|
||||
|| *data++ != TB_MAGIC[1]
|
||||
|| *data++ != TB_MAGIC[2]
|
||||
|| *data++ != TB_MAGIC[3]) {
|
||||
std::cerr << "Corrupted table in file " << fname << std::endl;
|
||||
unmap(*baseAddress, *mapping);
|
||||
*baseAddress = nullptr;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
static void unmap(char* data, uint64_t mapping) {
|
||||
static void unmap(char* baseAddress, uint64_t mapping) {
|
||||
|
||||
#ifndef _WIN32
|
||||
munmap(data, mapping);
|
||||
munmap(baseAddress, mapping);
|
||||
#else
|
||||
UnmapViewOfFile(data);
|
||||
UnmapViewOfFile(baseAddress);
|
||||
CloseHandle((HANDLE)mapping);
|
||||
#endif
|
||||
}
|
||||
|
@ -939,26 +955,9 @@ bool WDLEntry::init(const std::string& fname)
|
|||
uint64_t size[8 * 3];
|
||||
uint8_t flags;
|
||||
|
||||
TBFile file(fname);
|
||||
|
||||
if (!file.is_open()) {
|
||||
std::cerr << "Could not find " << fname << std::endl;
|
||||
uint8_t* data = TBFile(fname).map(&baseAddress, &mapping, TB_MAGIC);
|
||||
if (!data)
|
||||
return false;
|
||||
}
|
||||
|
||||
baseAddress = file.map(&mapping); // Map the table into memory
|
||||
|
||||
uint8_t* data = (uint8_t*)baseAddress;
|
||||
|
||||
if ( *data++ != TB_MAGIC[0]
|
||||
|| *data++ != TB_MAGIC[1]
|
||||
|| *data++ != TB_MAGIC[2]
|
||||
|| *data++ != TB_MAGIC[3]) {
|
||||
std::cerr << "Corrupted table" << std::endl;
|
||||
TBFile::unmap(baseAddress, mapping);
|
||||
baseAddress = nullptr;
|
||||
return false;
|
||||
}
|
||||
|
||||
int split = *data & 1;
|
||||
File maxFile = *data & 2 ? FILE_D : FILE_A;
|
||||
|
@ -1098,40 +1097,26 @@ bool DTZEntry::init(const std::string& fname)
|
|||
uint64_t tb_size[4];
|
||||
uint64_t size[4 * 3];
|
||||
|
||||
TBFile file(fname);
|
||||
|
||||
if (!file.is_open()) {
|
||||
std::cerr << "Could not find " << fname << std::endl;
|
||||
uint8_t* data = TBFile(fname).map(&baseAddress, &mapping, TB_MAGIC);
|
||||
if (!data)
|
||||
return false;
|
||||
}
|
||||
|
||||
baseAddress = file.map(&mapping); // Map the table into memory
|
||||
File maxFile = *data & 2 ? FILE_D : FILE_A;
|
||||
|
||||
uint8_t* data = (uint8_t*)baseAddress;
|
||||
|
||||
if ( data[0] != TB_MAGIC[0]
|
||||
|| data[1] != TB_MAGIC[1]
|
||||
|| data[2] != TB_MAGIC[2]
|
||||
|| data[3] != TB_MAGIC[3]) {
|
||||
std::cerr << "Corrupted table" << std::endl;
|
||||
TBFile::unmap(baseAddress, mapping);
|
||||
baseAddress = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
File maxFile = data[4] & 2 ? FILE_D : FILE_A;
|
||||
|
||||
data += 5;
|
||||
data++;
|
||||
|
||||
if (!has_pawns) {
|
||||
for (int i = 0; i < num; ++i)
|
||||
piece.pieces[i] = uint8_t(data[i + 1] & 0x0f);
|
||||
|
||||
int order = data[0] & 0xF;
|
||||
int order = *data & 0xF;
|
||||
|
||||
data++;
|
||||
|
||||
for (int i = 0; i < num; ++i, ++data)
|
||||
piece.pieces[i] = *data & 0x0F;
|
||||
|
||||
set_norms(piece, num);
|
||||
tb_size[0] = set_factors(piece, num, order);
|
||||
|
||||
data += num + 1;
|
||||
data += (uintptr_t)data & 1;
|
||||
|
||||
piece.precomp = setup_pairs(data, tb_size[0], &size[0], &next, &(piece.flags), 0);
|
||||
|
@ -1156,7 +1141,7 @@ bool DTZEntry::init(const std::string& fname)
|
|||
piece.precomp->sizetable = (uint16_t *)data;
|
||||
data += size[1];
|
||||
|
||||
data = (uint8_t *)(((uintptr_t)data + 0x3f) & ~0x3f);
|
||||
data = (uint8_t*)(((uintptr_t)data + 0x3F) & ~0x3F);
|
||||
piece.precomp->data = data;
|
||||
data += size[2];
|
||||
} else {
|
||||
|
|
Loading…
Add table
Reference in a new issue