diff options
author | pixel <pixel> | 2007-07-10 16:24:40 +0000 |
---|---|---|
committer | pixel <pixel> | 2007-07-10 16:24:40 +0000 |
commit | 2b81447acc91685dbfb6419282a0f53b6ac3eaa0 (patch) | |
tree | a3977ef45afdcc9ac1d3a968af6a33819dcf3af9 /mpq-bios.c | |
parent | 126a396e4af6a3d9e92471cb8e82993853524e46 (diff) |
Adding the true hash table support.
Diffstat (limited to 'mpq-bios.c')
-rw-r--r-- | mpq-bios.c | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -315,24 +315,27 @@ void mpqlib_printtables(struct mpq_archive_t * mpq_a) { } int mpqlib_find_hash_entry_by_name(struct mpq_archive_t * mpq_a, const char * name, uint32_t language, uint32_t platform) { - uint32_t hA, hB; + uint32_t h, hA, hB; + h = mpqlib_hash_filename(name); hA = mpqlib_hashA_filename(name); hB = mpqlib_hashB_filename(name); - return mpqlib_find_hash_entry_by_hash(mpq_a, hA, hB, language, platform); + return mpqlib_find_hash_entry_by_hash(mpq_a, h, hA, hB, language, platform); } -int mpqlib_find_hash_entry_by_hash(struct mpq_archive_t * mpq_a, uint32_t hA, uint32_t hB, uint32_t language, uint32_t platform) { +int mpqlib_find_hash_entry_by_hash(struct mpq_archive_t * mpq_a, uint32_t h, uint32_t hA, uint32_t hB, uint32_t language, uint32_t platform) { int i; - for (i = 0; i < mpq_a->hash_table_entries; i++) { + for (i = h & (mpq_a->hash_table_entries - 1); i < mpq_a->hash_table_entries; i++) { if ((mpq_a->hashs[i].file_path_hasha == hA) && (mpq_a->hashs[i].file_path_hashb == hB) && (mpq_a->hashs[i].language == language) && (mpq_a->hashs[i].platform == platform)) { return mpq_a->hashs[i].file_block_index; } + if (mpq_a->hashs[i].file_block_index == 0xffffffff) + break; } return -1; |