mirror of
https://github.com/sockspls/badfish
synced 2025-05-01 09:13:08 +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
|
// Memory map the file and check it. File should be already open and
|
||||||
char* map(uint64_t* mapping) {
|
// will be closed after mapping.
|
||||||
|
uint8_t* map(char** baseAddress, uint64_t* mapping, const uint8_t TB_MAGIC[]) {
|
||||||
assert(is_open());
|
|
||||||
|
|
||||||
|
if (!is_open()) {
|
||||||
|
std::cerr << "Could not find " << fname << std::endl;
|
||||||
|
*baseAddress = nullptr;
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
close();
|
close();
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
@ -432,10 +436,10 @@ public:
|
||||||
int fd = ::open(fname.c_str(), O_RDONLY);
|
int fd = ::open(fname.c_str(), O_RDONLY);
|
||||||
fstat(fd, &statbuf);
|
fstat(fd, &statbuf);
|
||||||
*mapping = statbuf.st_size;
|
*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);
|
::close(fd);
|
||||||
|
|
||||||
if (data == (char*)(-1)) {
|
if (*baseAddress == (char*)(-1)) {
|
||||||
std::cerr << "Could not mmap() " << fname << std::endl;
|
std::cerr << "Could not mmap() " << fname << std::endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -453,23 +457,35 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
*mapping = (uint64_t)mmap;
|
*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
|
std::cerr << "MapViewOfFile() failed, name = " << fname
|
||||||
<< ", error = " << GetLastError() << std::endl;
|
<< ", error = " << GetLastError() << std::endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
#endif
|
#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;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unmap(char* data, uint64_t mapping) {
|
static void unmap(char* baseAddress, uint64_t mapping) {
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
munmap(data, mapping);
|
munmap(baseAddress, mapping);
|
||||||
#else
|
#else
|
||||||
UnmapViewOfFile(data);
|
UnmapViewOfFile(baseAddress);
|
||||||
CloseHandle((HANDLE)mapping);
|
CloseHandle((HANDLE)mapping);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -939,26 +955,9 @@ bool WDLEntry::init(const std::string& fname)
|
||||||
uint64_t size[8 * 3];
|
uint64_t size[8 * 3];
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
|
|
||||||
TBFile file(fname);
|
uint8_t* data = TBFile(fname).map(&baseAddress, &mapping, TB_MAGIC);
|
||||||
|
if (!data)
|
||||||
if (!file.is_open()) {
|
|
||||||
std::cerr << "Could not find " << fname << std::endl;
|
|
||||||
return false;
|
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;
|
int split = *data & 1;
|
||||||
File maxFile = *data & 2 ? FILE_D : FILE_A;
|
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 tb_size[4];
|
||||||
uint64_t size[4 * 3];
|
uint64_t size[4 * 3];
|
||||||
|
|
||||||
TBFile file(fname);
|
uint8_t* data = TBFile(fname).map(&baseAddress, &mapping, TB_MAGIC);
|
||||||
|
if (!data)
|
||||||
if (!file.is_open()) {
|
|
||||||
std::cerr << "Could not find " << fname << std::endl;
|
|
||||||
return false;
|
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;
|
data++;
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
if (!has_pawns) {
|
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);
|
set_norms(piece, num);
|
||||||
tb_size[0] = set_factors(piece, num, order);
|
tb_size[0] = set_factors(piece, num, order);
|
||||||
|
|
||||||
data += num + 1;
|
|
||||||
data += (uintptr_t)data & 1;
|
data += (uintptr_t)data & 1;
|
||||||
|
|
||||||
piece.precomp = setup_pairs(data, tb_size[0], &size[0], &next, &(piece.flags), 0);
|
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;
|
piece.precomp->sizetable = (uint16_t *)data;
|
||||||
data += size[1];
|
data += size[1];
|
||||||
|
|
||||||
data = (uint8_t *)(((uintptr_t)data + 0x3f) & ~0x3f);
|
data = (uint8_t*)(((uintptr_t)data + 0x3F) & ~0x3F);
|
||||||
piece.precomp->data = data;
|
piece.precomp->data = data;
|
||||||
data += size[2];
|
data += size[2];
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Reference in a new issue