diff --git a/src/render.cpp b/src/render.cpp index 95d1ba3..2b1b277 100644 --- a/src/render.cpp +++ b/src/render.cpp @@ -242,6 +242,7 @@ void viewer_jump_to_free_slot(App_State &app, u64 free_slot_idx) Byte_Range free_slot = app.tfile_data.free_slots[idx]; + printf("%lu 0x%lX\n", app.tfile_data.n_free_slots, free_slot.start); app.viewer.latest_free_slot_gone_to = idx; viewer_jump_to(app, free_slot.start); } diff --git a/src/tfile.cpp b/src/tfile.cpp index a7cb51a..9d56af6 100644 --- a/src/tfile.cpp +++ b/src/tfile.cpp @@ -336,46 +336,43 @@ b8 walk_tkeys(Arena *arena, const u8 *data, u64 data_len, u32 flags, TFile_Data sec_header.range.len += sec_header.post_size; } -#if 1 - // Collect free slots. - { - cur = tkeys_data.sections[Sec_TFile_FreeList].range.start; + // collect free slots + TFile_Free_Slot fs; + u64 free_slot_size = sizeof(u16) + (is_big_file ? sizeof(fs.rng.rng_long) : sizeof(fs.rng.rng_short)); + u64 free_slots_start = tkeys_data.sections[Sec_TFile_FreeList].range.start + 65; // XXX: the keylen should be subtracted above! + u64 free_slots_end = tkeys_data.sections[Sec_TFile_FreeList].range.end(); + u64 n_free_slots = (free_slots_end - free_slots_start) / free_slot_size; + if (n_free_slots) { + tfile_data.free_slots = arena_push_array_nozero<Byte_Range>(arena, n_free_slots); + u64 cur = free_slots_start; + for (u64 i = 0; i < n_free_slots; ) { + memcpy(&fs, data + cur, free_slot_size); + Byte_Range *free_slot = &tfile_data.free_slots[i]; + u64 start, end; + if (is_big_file) { + start = bswap(fs.rng.rng_long.start); + end = min(data_len, bswap(fs.rng.rng_long.end)); + } else { + start = bswap(fs.rng.rng_short.start); + end = min(data_len, bswap(fs.rng.rng_short.end)); + } - TFile_Free_Slot fs; - u64 free_slot_size = sizeof(u16) + (is_big_file ? sizeof(fs.rng.rng_long) : sizeof(fs.rng.rng_short)); - u64 free_slots_start = tkeys_data.sections[Sec_TFile_FreeList].range.start + 65; // TEMP - u64 free_slots_end = tkeys_data.sections[Sec_TFile_FreeList].range.end(); - printf("start: 0x%lX\n", free_slots_start); - u64 n_free_slots = (free_slots_end - free_slots_start) / free_slot_size; - if (n_free_slots) { - tfile_data.free_slots = arena_push_array_nozero<Byte_Range>(arena, n_free_slots); - tfile_data.n_free_slots = n_free_slots; - for (u64 i = 0; i < n_free_slots; ++i) { - u64 cur = free_slots_start + i * free_slot_size; - memcpy(&fs, data + cur, free_slot_size); - Byte_Range *free_slot = &tfile_data.free_slots[i]; - u64 start, end; - if (is_big_file) { - start = bswap(fs.rng.rng_long.start); - end = min(data_len, bswap(fs.rng.rng_long.end)); - } else { - start = bswap(fs.rng.rng_short.start); - end = min(data_len, bswap(fs.rng.rng_short.end)); - } + cur += free_slot_size; - // The free slot might not be a "real" slot (if its end is lower than its start or if it starts past the end of - // the file): in this case, don't add it to the list. - printf("0x%lX: 0x%lX - 0x%lX / 0x%lX\n", cur, start, end, data_len); - if (end >= start && start < data_len) { - free_slot->start = start; - free_slot->len = end - start + 1; // +1 because `end` is inclusive - } else { - --tfile_data.n_free_slots; - } + printf("0x%lX - 0x%lX\n", start, end); + + // The free slot might not be a "real" slot (if its end is lower than its start or if it starts past the end of + // the file): in this case, don't add it to the list. + if (end >= start && start < data_len) { + free_slot->start = start; + free_slot->len = end - start + 1; // +1 because `end` is inclusive + ++i; + } else { + --n_free_slots; } } + tfile_data.n_free_slots = n_free_slots; } -#endif return true; }