From 4fe4909cd907df2981ec1677badacda2679ed05b Mon Sep 17 00:00:00 2001 From: silverweed Date: Tue, 30 Jul 2024 00:03:35 +0200 Subject: [PATCH] even more hover info --- src/rntuple.cpp | 53 ++++++++++++++++++++++++++--------- src/rntuple.h | 2 ++ src/rntviewer.cpp | 2 +- src/root/RMicroFileReader.cxx | 16 ++++++++--- src/root/RMicroFileReader.hxx | 4 ++- 5 files changed, 58 insertions(+), 19 deletions(-) diff --git a/src/rntuple.cpp b/src/rntuple.cpp index 231ce1d..ad323db 100644 --- a/src/rntuple.cpp +++ b/src/rntuple.cpp @@ -254,7 +254,7 @@ void gather_ntuple_metadata(Arena *arena, RMicroFileReader &reader, const RNTupl } internal -TFile_Data get_tfile_data(const Inspected_File &file) +TFile_Data get_tfile_data(const Inspected_File &file, String8 ntpl_name) { TFile_Data tfile_data{}; @@ -272,7 +272,7 @@ TFile_Data get_tfile_data(const Inspected_File &file) tfile_data.root_version_minor = (u16)version_minor; tfile_data.root_version_patch = (u16)version_patch; - Root_File_Info root_file_info = get_root_file_info(file.name.c(), is_big_file); + Root_File_Info root_file_info = get_root_file_info(file.name.c(), ntpl_name.c(), is_big_file); tfile_data.root_file_header_size = root_file_info.tfile_header_nbytes; tfile_data.rng_root_file_obj.start = root_file_info.tfile_obj_seek; tfile_data.rng_root_file_obj.len = root_file_info.tfile_obj_nbytes; @@ -286,29 +286,34 @@ TFile_Data get_tfile_data(const Inspected_File &file) if (is_big_file) { u64 info_seek_be; memcpy(&info_seek_be, file.mem + root_file_info.info_seek_seek, sizeof(info_seek_be)); - tfile_data.rng_root_file_info.start = bswap(info_seek_be); + tfile_data.rng_root_file_info_header.start = bswap(info_seek_be); } else { u32 info_seek_be; memcpy(&info_seek_be, file.mem + root_file_info.info_seek_seek, sizeof(info_seek_be)); - tfile_data.rng_root_file_info.start = bswap(info_seek_be); + tfile_data.rng_root_file_info_header.start = bswap(info_seek_be); } u32 info_nbytes_be; memcpy(&info_nbytes_be, file.mem + root_file_info.info_nbytes_seek, sizeof(info_nbytes_be)); - tfile_data.rng_root_file_info.len = bswap(info_nbytes_be); + tfile_data.rng_root_file_info_header.len = root_file_info.info_header_nbytes; + tfile_data.rng_root_file_info.start = tfile_data.rng_root_file_info_header.end(); + tfile_data.rng_root_file_info.len = bswap(info_nbytes_be) - tfile_data.rng_root_file_info_header.len; // 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)); - tfile_data.rng_root_file_free.start = bswap(free_seek_be); + tfile_data.rng_root_file_free_header.start = bswap(free_seek_be); } else { u32 free_seek_be; memcpy(&free_seek_be, file.mem + root_file_info.free_seek_seek, sizeof(free_seek_be)); - tfile_data.rng_root_file_free.start = bswap(free_seek_be); + tfile_data.rng_root_file_free_header.start = bswap(free_seek_be); } u32 free_nbytes_be; memcpy(&free_nbytes_be, file.mem + root_file_info.free_nbytes_seek, sizeof(free_nbytes_be)); - tfile_data.rng_root_file_free.len = bswap(free_nbytes_be); + // FIXME + // tfile_data.rng_root_file_free_header.len = root_file_info.free_header_nbytes; + tfile_data.rng_root_file_free.start = tfile_data.rng_root_file_free_header.end(); + tfile_data.rng_root_file_free.len = bswap(free_nbytes_be) - tfile_data.rng_root_file_free_header.len; return tfile_data; } @@ -368,12 +373,22 @@ Section find_section(App_State &app, u64 off, i64 hilite_cluster = -1) u64 rblob_sz = rdata.rblob_header_size; // @Incomplete b8 hilite = false; - // TFile start + // TFile starting sections u64 root_header_padding = tdata.rng_root_file_obj.start - tdata.root_file_header_size; - if (off < tdata.rng_root_file_obj.start) return { Sec_TFile_Header, { 0, tdata.root_file_header_size }, 0, root_header_padding, hilite }; - if (tdata.rng_root_file_obj.start <= off && off < tdata.rng_root_file_obj.end()) return { Sec_TFile_Object, tdata.rng_root_file_obj, 0, 0, hilite }; - if (tdata.rng_root_file_info.start <= off && off < tdata.rng_root_file_info.end()) return { Sec_TFile_Info, tdata.rng_root_file_info, 0, 0, hilite }; - if (tdata.rng_root_file_free.start <= off && off < tdata.rng_root_file_free.end()) return { Sec_TFile_FreeList, tdata.rng_root_file_free, 0, 0, hilite }; + if (off < tdata.rng_root_file_obj.start) + return { Sec_TFile_Header, { 0, tdata.root_file_header_size }, 0, root_header_padding, hilite }; + + if (tdata.rng_root_file_obj.start <= off && off < tdata.rng_root_file_obj.end()) + return { Sec_TFile_Object, tdata.rng_root_file_obj, 0, 0, hilite }; + + // TFile ending sections + if (tdata.rng_root_file_info_header.start <= off && off < tdata.rng_root_file_info.end()) + return { Sec_TFile_Info, tdata.rng_root_file_info, tdata.rng_root_file_info_header.len, 0, hilite }; + + if (tdata.rng_root_file_free_header.start <= off && off < tdata.rng_root_file_free.end()) { + printf("%lu\n", tdata.rng_root_file_free_header.len); + return { Sec_TFile_FreeList, tdata.rng_root_file_free, tdata.rng_root_file_free_header.len, 0, hilite }; + } /// Handle pages { @@ -725,6 +740,18 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co ; } break; + case Sec_TFile_Info: { + hover_try_key(try_sec_hover, data, start) + || try_sec_hover.range("Payload", section.range.len) // TODO: improve + ; + } break; + + case Sec_TFile_FreeList: { + hover_try_key(try_sec_hover, data, start) + || try_sec_hover.range("Payload", section.range.len) // TODO: improve + ; + } break; + default:; } diff --git a/src/rntuple.h b/src/rntuple.h index 877e032..f479b04 100644 --- a/src/rntuple.h +++ b/src/rntuple.h @@ -46,7 +46,9 @@ struct TFile_Data { u16 root_version_minor; u16 root_version_patch; u32 compression; + Byte_Range rng_root_file_info_header; Byte_Range rng_root_file_info; + Byte_Range rng_root_file_free_header; Byte_Range rng_root_file_free; }; diff --git a/src/rntviewer.cpp b/src/rntviewer.cpp index a881297..9c51880 100644 --- a/src/rntviewer.cpp +++ b/src/rntviewer.cpp @@ -116,7 +116,7 @@ int main(int argc, char **argv) app.ntpl_name = args.ntpl_name; app.base_display_addr = args.start_addr; - app.tfile_data = get_tfile_data(app.inspected_file); + app.tfile_data = get_tfile_data(app.inspected_file, app.ntpl_name); app.rndata = get_rntuple_data(arena, app.inspected_file, app.ntpl_name); if (args.print_to_terminal) { diff --git a/src/root/RMicroFileReader.cxx b/src/root/RMicroFileReader.cxx index 6482500..8cad463 100644 --- a/src/root/RMicroFileReader.cxx +++ b/src/root/RMicroFileReader.cxx @@ -1068,9 +1068,9 @@ static size_t ComputeNumChunks(size_t nbytes, size_t maxChunkSize) // PUBLIC INTERFACE // ========================================================================================= -Root_File_Info get_root_file_info(const char *fname, bool is_big_file) +Root_File_Info get_root_file_info(const char *fname, const char *ntplName, bool is_big_file) { - RTFString fileName { fname }; + RTFString fileNameStr { fname }; Root_File_Info fileInfo {}; RTFHeader header; if (is_big_file) @@ -1078,16 +1078,24 @@ Root_File_Info get_root_file_info(const char *fname, bool is_big_file) fileInfo.tfile_header_nbytes = header.GetSize(); fileInfo.tfile_obj_seek = 100; // kBEGIN RTFKey fileHeader { - 100, 0, RTFString{ "TFile" }, fileName, RTFString{}, - sizeof(RTFFile) + fileName.GetSize() + RTFString{}.GetSize() + RTFUUID{}.GetSize() + 100, 0, RTFString{"TFile"}, fileNameStr, RTFString{}, + sizeof(RTFFile) + fileNameStr.GetSize() + RTFString{}.GetSize() + RTFUUID{}.GetSize() }; fileInfo.tfile_obj_nbytes = fileHeader.GetSize(); fileInfo.version_seek = offsetof(RTFHeader, fVersion); fileInfo.compression_seek = is_big_file ? offsetof(RTFHeader, fInfoLong.fCompress) : offsetof(RTFHeader, fInfoShort.fCompress); fileInfo.info_seek_seek = is_big_file ? offsetof(RTFHeader, fInfoLong.fSeekInfo) : offsetof(RTFHeader, fInfoShort.fSeekInfo); fileInfo.info_nbytes_seek = is_big_file ? offsetof(RTFHeader, fInfoLong.fNbytesInfo) : offsetof(RTFHeader, fInfoShort.fNbytesInfo); + RTFKey infoHeader { + 0, 100, RTFString{"TList"}, RTFString{"StreamerInfo"}, RTFString{"Doubly linked list"}, 0 + }; + fileInfo.info_header_nbytes = infoHeader.GetSize(); fileInfo.free_seek_seek = is_big_file ? offsetof(RTFHeader, fInfoLong.fSeekFree) : offsetof(RTFHeader, fInfoShort.fSeekFree); fileInfo.free_nbytes_seek = is_big_file ? offsetof(RTFHeader, fInfoLong.fNbytesFree) : offsetof(RTFHeader, fInfoShort.fNbytesFree); + RTFKey freeHeader { + 0, 100, RTFString{kNTupleClassName}, RTFString{ntplName}, RTFString{}, sizeof(RTFNTuple) + sizeof(std::uint64_t) + }; + fileInfo.free_header_nbytes = freeHeader.GetSize(); return fileInfo; } diff --git a/src/root/RMicroFileReader.hxx b/src/root/RMicroFileReader.hxx index 9fbf134..d8f7328 100644 --- a/src/root/RMicroFileReader.hxx +++ b/src/root/RMicroFileReader.hxx @@ -50,11 +50,13 @@ struct Root_File_Info { std::uint64_t compression_seek; std::uint64_t info_seek_seek; std::uint64_t info_nbytes_seek; + std::uint64_t info_header_nbytes; std::uint64_t free_seek_seek; std::uint64_t free_nbytes_seek; + std::uint64_t free_header_nbytes; }; -Root_File_Info get_root_file_info(const char *fname, bool is_big_file); +Root_File_Info get_root_file_info(const char *fname, const char *ntplName, bool is_big_file); class RMicroFileReader final { public: