Use upper-case for hashing to be case insensitive

This commit is contained in:
Maschell 2021-01-09 18:51:31 +01:00
parent e5fc7dc71c
commit b0f5c61cb0
1 changed files with 22 additions and 3 deletions

View File

@ -377,16 +377,35 @@ int32_t romfsUnmount(const char *name) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static inline uint8_t normalizePathChar(uint8_t c) {
if (c >= 'a' && c <= 'z') {
return c + 'A' - 'a';
} else {
return c;
}
}
static uint32_t calcHash(uint32_t parent, const uint8_t *name, uint32_t namelen, uint32_t total) { static uint32_t calcHash(uint32_t parent, const uint8_t *name, uint32_t namelen, uint32_t total) {
uint32_t hash = parent ^123456789; uint32_t hash = parent ^123456789;
uint32_t i; uint32_t i;
for (i = 0; i < namelen; i++) { for (i = 0; i < namelen; i++) {
hash = (hash >> 5) | (hash << 27); hash = (hash >> 5) | (hash << 27);
hash ^= name[i]; hash ^= normalizePathChar(name[i]);
} }
return hash % total; return hash % total;
} }
static bool comparePaths(const uint8_t *name1, const uint8_t *name2, uint32_t namelen) {
for (uint32_t i = 0; i < namelen; i++) {
uint8_t c1 = normalizePathChar(name1[i]);
uint8_t c2 = normalizePathChar(name2[i]);
if (c1 != c2) {
return false;
}
}
return true;
}
static int searchForDir(romfs_mount *mount, romfs_dir *parent, const uint8_t *name, uint32_t namelen, romfs_dir **out) { static int searchForDir(romfs_mount *mount, romfs_dir *parent, const uint8_t *name, uint32_t namelen, romfs_dir **out) {
uint64_t parentOff = (uintptr_t) parent - (uintptr_t) mount->dirTable; uint64_t parentOff = (uintptr_t) parent - (uintptr_t) mount->dirTable;
uint32_t hash = calcHash(parentOff, name, namelen, mount->header.dirHashTableSize / 4); uint32_t hash = calcHash(parentOff, name, namelen, mount->header.dirHashTableSize / 4);
@ -402,7 +421,7 @@ static int searchForDir(romfs_mount *mount, romfs_dir *parent, const uint8_t *na
if (curDir->nameLen != namelen) { if (curDir->nameLen != namelen) {
continue; continue;
} }
if (memcmp(curDir->name, name, namelen) != 0) { if (!comparePaths(curDir->name, name, namelen)) {
continue; continue;
} }
*out = curDir; *out = curDir;
@ -429,7 +448,7 @@ static int searchForFile(romfs_mount *mount, romfs_dir *parent, const uint8_t *n
if (curFile->nameLen != namelen) { if (curFile->nameLen != namelen) {
continue; continue;
} }
if (memcmp(curFile->name, name, namelen) != 0) { if (!comparePaths(curFile->name, name, namelen)) {
continue; continue;
} }
*out = curFile; *out = curFile;