even more hover info
This commit is contained in:
parent
4a2c23277d
commit
4fe4909cd9
5 changed files with 58 additions and 19 deletions
|
@ -254,7 +254,7 @@ void gather_ntuple_metadata(Arena *arena, RMicroFileReader &reader, const RNTupl
|
||||||
}
|
}
|
||||||
|
|
||||||
internal
|
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{};
|
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_minor = (u16)version_minor;
|
||||||
tfile_data.root_version_patch = (u16)version_patch;
|
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.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.start = root_file_info.tfile_obj_seek;
|
||||||
tfile_data.rng_root_file_obj.len = root_file_info.tfile_obj_nbytes;
|
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) {
|
if (is_big_file) {
|
||||||
u64 info_seek_be;
|
u64 info_seek_be;
|
||||||
memcpy(&info_seek_be, file.mem + root_file_info.info_seek_seek, sizeof(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 {
|
} else {
|
||||||
u32 info_seek_be;
|
u32 info_seek_be;
|
||||||
memcpy(&info_seek_be, file.mem + root_file_info.info_seek_seek, sizeof(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;
|
u32 info_nbytes_be;
|
||||||
memcpy(&info_nbytes_be, file.mem + root_file_info.info_nbytes_seek, sizeof(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
|
// parse free list
|
||||||
if (is_big_file) {
|
if (is_big_file) {
|
||||||
u64 free_seek_be;
|
u64 free_seek_be;
|
||||||
memcpy(&free_seek_be, file.mem + root_file_info.free_seek_seek, sizeof(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 {
|
} else {
|
||||||
u32 free_seek_be;
|
u32 free_seek_be;
|
||||||
memcpy(&free_seek_be, file.mem + root_file_info.free_seek_seek, sizeof(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;
|
u32 free_nbytes_be;
|
||||||
memcpy(&free_nbytes_be, file.mem + root_file_info.free_nbytes_seek, sizeof(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;
|
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
|
u64 rblob_sz = rdata.rblob_header_size; // @Incomplete
|
||||||
b8 hilite = false;
|
b8 hilite = false;
|
||||||
|
|
||||||
// TFile start
|
// TFile starting sections
|
||||||
u64 root_header_padding = tdata.rng_root_file_obj.start - tdata.root_file_header_size;
|
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 (off < tdata.rng_root_file_obj.start)
|
||||||
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 };
|
return { Sec_TFile_Header, { 0, tdata.root_file_header_size }, 0, root_header_padding, 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 (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
|
/// Handle pages
|
||||||
{
|
{
|
||||||
|
@ -725,6 +740,18 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co
|
||||||
;
|
;
|
||||||
} break;
|
} 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:;
|
default:;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,9 @@ struct TFile_Data {
|
||||||
u16 root_version_minor;
|
u16 root_version_minor;
|
||||||
u16 root_version_patch;
|
u16 root_version_patch;
|
||||||
u32 compression;
|
u32 compression;
|
||||||
|
Byte_Range rng_root_file_info_header;
|
||||||
Byte_Range rng_root_file_info;
|
Byte_Range rng_root_file_info;
|
||||||
|
Byte_Range rng_root_file_free_header;
|
||||||
Byte_Range rng_root_file_free;
|
Byte_Range rng_root_file_free;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -116,7 +116,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
app.ntpl_name = args.ntpl_name;
|
app.ntpl_name = args.ntpl_name;
|
||||||
app.base_display_addr = args.start_addr;
|
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);
|
app.rndata = get_rntuple_data(arena, app.inspected_file, app.ntpl_name);
|
||||||
|
|
||||||
if (args.print_to_terminal) {
|
if (args.print_to_terminal) {
|
||||||
|
|
|
@ -1068,9 +1068,9 @@ static size_t ComputeNumChunks(size_t nbytes, size_t maxChunkSize)
|
||||||
// PUBLIC INTERFACE
|
// 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 {};
|
Root_File_Info fileInfo {};
|
||||||
RTFHeader header;
|
RTFHeader header;
|
||||||
if (is_big_file)
|
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_header_nbytes = header.GetSize();
|
||||||
fileInfo.tfile_obj_seek = 100; // kBEGIN
|
fileInfo.tfile_obj_seek = 100; // kBEGIN
|
||||||
RTFKey fileHeader {
|
RTFKey fileHeader {
|
||||||
100, 0, RTFString{ "TFile" }, fileName, RTFString{},
|
100, 0, RTFString{"TFile"}, fileNameStr, RTFString{},
|
||||||
sizeof(RTFFile) + fileName.GetSize() + RTFString{}.GetSize() + RTFUUID{}.GetSize()
|
sizeof(RTFFile) + fileNameStr.GetSize() + RTFString{}.GetSize() + RTFUUID{}.GetSize()
|
||||||
};
|
};
|
||||||
fileInfo.tfile_obj_nbytes = fileHeader.GetSize();
|
fileInfo.tfile_obj_nbytes = fileHeader.GetSize();
|
||||||
fileInfo.version_seek = offsetof(RTFHeader, fVersion);
|
fileInfo.version_seek = offsetof(RTFHeader, fVersion);
|
||||||
fileInfo.compression_seek = is_big_file ? offsetof(RTFHeader, fInfoLong.fCompress) : offsetof(RTFHeader, fInfoShort.fCompress);
|
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_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);
|
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_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);
|
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;
|
return fileInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,11 +50,13 @@ struct Root_File_Info {
|
||||||
std::uint64_t compression_seek;
|
std::uint64_t compression_seek;
|
||||||
std::uint64_t info_seek_seek;
|
std::uint64_t info_seek_seek;
|
||||||
std::uint64_t info_nbytes_seek;
|
std::uint64_t info_nbytes_seek;
|
||||||
|
std::uint64_t info_header_nbytes;
|
||||||
std::uint64_t free_seek_seek;
|
std::uint64_t free_seek_seek;
|
||||||
std::uint64_t free_nbytes_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 {
|
class RMicroFileReader final {
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in a new issue