diff --git a/Makefile b/Makefile index 3fc8993..d39ed03 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ else MOLD = mold -run endif ROOT_IFACE = build/RMicroFileReader.o -ROOT_IFACE_DBG = $(ROOT_IFACE) +ROOT_IFACE_DBG = $(ROOT_IFACE).dbg .PHONY: all clean all: build/imgui.o $(ROOT_IFACE) ubsan @@ -36,6 +36,9 @@ build/imgui.o: src/imgui_inc.cpp $(ROOT_IFACE): src/root/RMicroFileReader.cxx $(CXX) -O3 -fPIC -c $(ROOTFLAGS) $< -o $@ +$(ROOT_IFACE_DBG): src/root/RMicroFileReader.cxx + $(CXX) -O0 -DDEBUG -g -fPIC -c $(ROOTFLAGS) $< -o $@ + # debug build d: $(ROOT_IFACE_DBG) build/imgui.o $(MOLD) $(CXX) -DDEBUG -g -O0 -DENABLE_ASAN $(CFLAGS) $(INC) $(ROOTFLAGS) -o rntviewer src/rntviewer.cpp build/imgui.o -lasan $(ROOT_IFACE_DBG) $(LIBS) $(ROOTLIBS) diff --git a/src/render.cpp b/src/render.cpp index e063302..64799e8 100644 --- a/src/render.cpp +++ b/src/render.cpp @@ -84,6 +84,8 @@ u32 mem_edit_bg_color_fn(const u8 *, u64 off, void *user_data) if (rdata.rng_footer.start <= off && off < rdata.rng_footer.end() - 8) return COL(app->viewer.col_footer); if (rdata.rng_footer.end() - 8 <= off && off < rdata.rng_footer.end()) return COL(app->viewer.col_checksum); + if (rdata.rng_tkeys_list.start <= off && off < rdata.rng_tkeys_list.end()) return COL(app->viewer.col_tkeys_list); + // @Speed for (u64 cg_idx = 0; cg_idx < rdata.n_cluster_groups; ++cg_idx) { Cluster_Group_Info &cg_info = rdata.cluster_groups[cg_idx]; @@ -155,6 +157,7 @@ void make_viewer(App_State &app) COL(col_page_start, 200, 0, 200); COL(col_checksum, 134, 65, 25); COL(col_page_list, 60, 110, 120); + COL(col_tkeys_list, 100, 140, 100); COL(col_highlight, 190, 190, 190); #undef COL @@ -352,6 +355,11 @@ void update_and_render(Arena *arena, App_State &app, f32 delta_time_ms) ImGui::SameLine(); ImGui::Text("%s", to_pretty_size(scratch.arena, app.rndata.tot_page_list_size).c()); + ImGui::ColorEdit3("_TKey List", app.viewer.col_tkeys_list, flags); + ImGui::SameLine(); + if (ImGui::Button("TKey List")) viewer_jump_to(app.viewer, app.rndata.rng_tkeys_list.start); + + // ------------------------------- ImGui::Separator(); String8 root_version_str = push_str8f(scratch.arena, "%u.%u.%u", app.tfile_data.root_version_major, diff --git a/src/render.h b/src/render.h index 99a9eb7..2cac229 100644 --- a/src/render.h +++ b/src/render.h @@ -13,6 +13,7 @@ struct Viewer { f32 col_page_start[3]; f32 col_checksum[3]; f32 col_page_list[3]; + f32 col_tkeys_list[3]; f32 col_highlight[3]; u64 base_display_addr; diff --git a/src/rntuple.cpp b/src/rntuple.cpp index 143921d..c2220ad 100644 --- a/src/rntuple.cpp +++ b/src/rntuple.cpp @@ -263,7 +263,7 @@ TFile_Data get_tfile_data(const Inspected_File &file) memcpy(&info_nbytes_be, file.mem + root_file_info.info_nbytes_seek, sizeof(info_nbytes_be)); tfile_data.rng_root_file_info.len = bswap_32(info_nbytes_be); - // parse free + // parse free list if (is_big_file) { u64 free_seek_be; memcpy(&free_seek_be, file.mem + root_file_info.free_seek_seek, sizeof(free_seek_be)); @@ -302,6 +302,8 @@ RNTuple_Data get_rntuple_data(Arena *arena, const Inspected_File &file, String8 rndata.rng_anchor_key.start = file_info.anchor_key_seek; rndata.rng_anchor_key.len = file_info.anchor_key_nbytes; rndata.rblob_header_size = file_info.rblob_key_header_nbytes; + rndata.rng_tkeys_list.start = file_info.tkeys_list_seek; + rndata.rng_tkeys_list.len = file_info.tkeys_list_nbytes; gather_ntuple_metadata(arena, file_reader, file_info, rndata); } diff --git a/src/rntuple.h b/src/rntuple.h index 40fa6cd..0f155fb 100644 --- a/src/rntuple.h +++ b/src/rntuple.h @@ -61,6 +61,7 @@ struct RNTuple_Data { Byte_Range rng_anchor_key; Byte_Range rng_header; Byte_Range rng_footer; + Byte_Range rng_tkeys_list; Page_Info_Node *pages; u64 n_pages; diff --git a/src/root/RMicroFileReader.cxx b/src/root/RMicroFileReader.cxx index 4873e44..829877d 100644 --- a/src/root/RMicroFileReader.cxx +++ b/src/root/RMicroFileReader.cxx @@ -1151,6 +1151,10 @@ RMicroFileReader::GetNTupleProper(const char *ntupleName) offset = file.GetSeekKeys(); ReadBuffer(&key, sizeof(key), offset); offset += key.fKeyLen; + // @-------- begin + fileInfo.tkeys_list_seek = file.GetSeekKeys(); + fileInfo.tkeys_list_nbytes = key.fKeyLen + sizeof(nKeys); + // @-------- end ReadBuffer(&nKeys, sizeof(nKeys), offset); offset += sizeof(nKeys); bool found = false; @@ -1161,6 +1165,7 @@ RMicroFileReader::GetNTupleProper(const char *ntupleName) offset += key.GetHeaderSize(); ReadBuffer(&name, 1, offset); ReadBuffer(&name, name.GetSize(), offset); + fileInfo.tkeys_list_nbytes += key.fKeyLen + 1 + name.GetSize(); if (std::string_view(name.fData, name.fLName) != kNTupleClassName) { offset = offsetNextKey; continue; diff --git a/src/root/RMicroFileReader.hxx b/src/root/RMicroFileReader.hxx index 9ab3a9f..9fbf134 100644 --- a/src/root/RMicroFileReader.hxx +++ b/src/root/RMicroFileReader.hxx @@ -38,6 +38,8 @@ struct RNTuple_File_Info { std::uint64_t anchor_key_seek; std::uint64_t anchor_key_nbytes; std::uint64_t rblob_key_header_nbytes; + std::uint64_t tkeys_list_seek; + std::uint64_t tkeys_list_nbytes; }; struct Root_File_Info {