allow not passing an ntuple name

This commit is contained in:
silverweed 2024-08-16 10:01:17 +02:00
parent 2c2cdae805
commit 14e1392229
5 changed files with 26 additions and 12 deletions

View file

@ -4,13 +4,15 @@ void print_help(const char *argv0)
fprintf(stderr,
"rntviewer v" V_MAJOR "." V_MINOR " by silverweed"
"\n"
"\nUsage: %s [-t] [-s START] [-l LEN] [-w WIDTH] [-e] <ntuple_name> <ntuple_file.root>"
"\nUsage: %s [-t] [-s START] [-l LEN] [-w WIDTH] [-e] <ntuple_file.root> [ntuple_name]"
"\n\t-t: no graphics, output to terminal"
"\n\t-s: set first displayed byte to START"
"\n\t-l: display LEN bytes (only in terminal mode)"
"\n\t-w: display WIDTH bytes per column"
"\n\t-e: display some extended info (may slow down the startup)"
"\n"
"\nNOTE: if `ntuple_name' is not passed, rntviewer will look for the first RNTuple in the TFile."
"\n"
, argv0);
}
@ -89,7 +91,7 @@ internal
Cmdline_Args parse_args(i32 argc, char **argv)
{
Cmdline_Args args {};
if (argc < 3) {
if (argc < 2) {
args.show_help_and_exit = true;
return args;
}
@ -117,13 +119,13 @@ Cmdline_Args parse_args(i32 argc, char **argv)
} else {
args.show_help_and_exit = true;
}
} else if (args.ntpl_name.size) {
if (args.file_name.size)
} else if (args.file_name.size) {
if (args.ntpl_name.size)
args.show_help_and_exit = true;
else
args.file_name = arg;
args.ntpl_name = arg;
} else {
args.ntpl_name = arg;
args.file_name = arg;
}
}
return args;

View file

@ -385,8 +385,9 @@ u64 calc_page_uncomp_size(const u8 *fmem, const Page_Info_Node *page_head)
return tot_size;
}
// NOTE: ntpl_name may be empty
internal
RNTuple_Data get_rntuple_data(Arena *arena, const Inspected_File &file, String8 ntpl_name, b8 extended_info)
RNTuple_Data get_rntuple_data(Arena *arena, const Inspected_File &file, String8 &ntpl_name, b8 extended_info)
{
RNTuple_Data rndata {};
@ -409,6 +410,9 @@ RNTuple_Data get_rntuple_data(Arena *arena, const Inspected_File &file, String8
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;
if (!ntpl_name.size) {
ntpl_name = push_str8f(arena, "%s", file_info.ntuple_name.c_str());
}
gather_ntuple_metadata(arena, file_reader, file_info, rndata);
if (extended_info)

View file

@ -104,7 +104,7 @@ int main(int argc, char **argv)
// Parse cmdline
Cmdline_Args args = parse_args(argc, argv);
if (args.show_help_and_exit || !args.ntpl_name.size || !args.file_name.size) {
if (args.show_help_and_exit || !args.file_name.size) {
print_help(argv[0]);
return 1;
}
@ -131,10 +131,10 @@ int main(int argc, char **argv)
os_start_file_watch(args.file_name, app);
}
app.ntpl_name = args.ntpl_name;
app.ntpl_name = args.ntpl_name; // may be null
app.base_display_addr = args.start_addr;
app.tfile_data = get_tfile_data(app.inspected_file, app.ntpl_name);
app.rndata = get_rntuple_data(arena, app.inspected_file, app.ntpl_name, args.extended_info);
app.tfile_data = get_tfile_data(app.inspected_file, app.ntpl_name);
if (args.print_to_terminal) {
u64 nbytes_displayed = args.nbytes_displayed;

View file

@ -1187,14 +1187,19 @@ RMicroFileReader::GetNTupleProper(const char *ntupleName)
offset += name.GetSize();
ReadBuffer(&name, 1, offset);
ReadBuffer(&name, name.GetSize(), offset);
if (std::string_view(name.fData, name.fLName) == std::string_view(ntupleName)) {
if (!ntupleName || ntupleName[0] == 0 || std::string_view(name.fData, name.fLName) == std::string_view(ntupleName)) {
fileInfo.ntuple_name = { name.fData, name.fLName };
found = true;
break;
}
offset = offsetNextKey;
}
if (!found) {
FAIL("no RNTuple named '" + std::string(ntupleName) + "' in file '" + impl->fRawFile->GetUrl() + "'");
if (!ntupleName || ntupleName[0] == 0) {
FAIL("no RNTuple found in file '" + impl->fRawFile->GetUrl() + "'");
} else {
FAIL("no RNTuple named '" + std::string(ntupleName) + "' in file '" + impl->fRawFile->GetUrl() + "'");
}
}
offset = key.GetSeekKey() + key.fKeyLen;

View file

@ -1,6 +1,7 @@
#pragma once
#include <cstdint>
#include <string>
// We are forced to use our own RNTuple anchor struct because we cannot
// write into the private members of the real RNTuple class from RMicroFileReader.
@ -42,6 +43,7 @@ struct RNTuple_File_Info {
std::uint64_t rblob_key_header_nbytes;
std::uint64_t tkeys_list_seek;
std::uint64_t tkeys_list_nbytes;
std::string ntuple_name; // useful when not passing an explicit name to GetNTupleProper
};
struct Root_File_Info {
@ -64,6 +66,7 @@ public:
explicit RMicroFileReader(const char *fname);
~RMicroFileReader();
// if ntupleName == "", look for the first RNTuple in the file.
RNTuple_File_Info GetNTupleProper(const char *ntupleName);
void ReadBuffer(void *buffer, std::size_t nbytes, std::uint64_t offset);