From 4176cfe10707bae89a0ecd483d354b0a027ea236 Mon Sep 17 00:00:00 2001 From: silverweed Date: Mon, 16 Sep 2024 15:55:32 +0200 Subject: [PATCH] some refactoring to hover --- src/hover.cpp | 82 ++++++++++++++++++++++------------- src/mainloop.cpp | 2 +- src/render.cpp | 2 +- src/root/RMicroFileReader.cxx | 2 + 4 files changed, 56 insertions(+), 32 deletions(-) diff --git a/src/hover.cpp b/src/hover.cpp index 32ec571..d1dc25d 100644 --- a/src/hover.cpp +++ b/src/hover.cpp @@ -44,7 +44,7 @@ String8_Node *hover_display_datetime_str(Arena *arena, String8_Node *prev, const // datetime: // year (6b) | month (4b) | day (5b) | hour (5b) | min (6b) | sec (6b) u32 year = (datetime >> 26) + 1995; - u32 month = ((datetime & 0x3ff'ffff) >> 22) - 1; + u32 month = ((datetime & 0x3ff'ffff) >> 22); u32 day = (datetime & 0x3f'ffff) >> 17; u32 hour = (datetime & 0x1'ffff) >> 12; u32 min = (datetime & 0xfff) >> 6; @@ -415,7 +415,7 @@ struct Sec_Hover_Fn { } } - b8 column_desc() const + b8 column_desc(const char *title) const { if (display_grouped) { i64 size; @@ -423,7 +423,7 @@ struct Sec_Hover_Fn { u64 col_desc_len = (u64)std::abs(size); if (roff < cur_field_off + col_desc_len) { info.rng = { start + cur_field_off, col_desc_len }; - return titled_section("Column", [this] { + return titled_section(title, [this] { add_to_desc("Size: %" PRIi64 " B"); add_to_desc("Column type: %s", [](Arena *arena, String8_Node *prev, const char *fmt, u16 val) { const char *readable_col_type = get_column_type_name(val); @@ -472,33 +472,33 @@ struct Sec_Hover_Fn { } } - b8 schema_description() const + template + b8 list_frame(F &&fn) const { - return titled_section("Schema Description", [this] { + if (list_frame_preamble()) + return true; + // we need to read back the number of entries to know how long is the next section. + u64 n_elems_off = cur_field_off - sizeof(u32); + u32 n_elems; + memcpy(&n_elems, data + start + n_elems_off, sizeof(n_elems)); + for (u32 i = 0; i < n_elems; ++i) + if (fn()) + return true; + return false; + } + + b8 schema_description(const char *title) const + { + return titled_section(title, [this] { // Fields - if (list_frame_preamble()) - return true; - // we need to read back the number of fields to know how long is the next section. - u64 n_fields_off = cur_field_off - sizeof(u32); - u32 n_fields; - memcpy(&n_fields, data + start + n_fields_off, sizeof(n_fields)); - for (u32 i = 0; i < n_fields; ++i) - if (field_desc()) - return true; - - // Columns - if (list_frame_preamble()) - return true; - u64 n_columns_off = cur_field_off - sizeof(u32); - u32 n_columns; - memcpy(&n_columns, data + start + n_columns_off, sizeof(n_columns)); - for (u32 i = 0; i < n_columns; ++i) - if (column_desc()) - return true; - if (field("Size: %" PRIi64, hover_display_val_le_abs)) - return true; - - return false; // TODO + return list_frame([this] { return field_desc(); }) + || list_frame([this] { return column_desc("Column"); }) + || list_frame([this] { return column_desc("Alias Column"); }) + || list_frame([this] { + return field_le("Content identifier: %lu") + || field_le("Type version from: %lu") + || field_le("Type version to: %lu"); + }); }); } }; @@ -659,8 +659,7 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co || hover.field_str8("Name: %s") || hover.field_str8("Description: %s") || hover.field_str8("ROOT version: %s") - || hover.schema_description() - || hover.range("Payload", section.range.len - hover.cur_field_off) // TODO + || hover.schema_description("Schema Description") || hover.field_le("Checksum: 0x%" PRIX64) ; } @@ -668,6 +667,29 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co } break; case Sec_RNTuple_Footer: + if (!hover.tkey()) { + b8 zipped; + if (!hover.maybe_rootzip(&zipped)) { + if (zipped) { + hover.range("Payload", section.range.len - section.post_size) + || hover.field_le("Checksum: 0x%" PRIX64) + ; + } else { + hover.envelope_preamble() + // NOTE: flags in principle require a more complex handling, but for now they are unused, + // so they're always occupying only 8 bytes. + || hover.field_le("Flags: 0x%" PRIX64) + || hover.field_le("Header checksum: 0x%" PRIX64) + || hover.schema_description("Schema Extension") + // TODO: + // - list of column group record frames + // - list of cluster group record frames + || hover.range("Payload", section.range.len - hover.cur_field_off) + || hover.field_le("Checksum: 0x%" PRIX64) + ; + } + } + } case Sec_Page_List: { hover.tkey() || hover.maybe_rootzip() diff --git a/src/mainloop.cpp b/src/mainloop.cpp index 57232fd..453eb5f 100644 --- a/src/mainloop.cpp +++ b/src/mainloop.cpp @@ -10,7 +10,7 @@ b8 init_imgui(GLFWwindow* window) { ImGui::StyleColorsDark(); ImGui_ImplGlfw_InitForOpenGL(window, true); - ImGui_ImplOpenGL3_Init("#version 400"); + ImGui_ImplOpenGL3_Init("#version 330"); return true; } diff --git a/src/render.cpp b/src/render.cpp index 204931a..7c42722 100644 --- a/src/render.cpp +++ b/src/render.cpp @@ -284,7 +284,7 @@ void update_and_render(Arena *arena, App_State &app, f32 delta_time_ms) void *content = app.inspected_file.mem + app.base_display_addr; u64 content_size = app.inspected_file.size - app.base_display_addr; app.last_pinfo = &invalid_pinfo; - app.viewer.mem_edit.DrawContents(content, content_size, app.base_display_addr); + app.viewer.mem_edit.DrawContents(content, std::min(5'287'500'000, content_size), app.base_display_addr); ImGui::TableNextColumn(); const ImGuiColorEditFlags edit_flags = ImGuiColorEditFlags_NoInputs|ImGuiColorEditFlags_NoLabel; diff --git a/src/root/RMicroFileReader.cxx b/src/root/RMicroFileReader.cxx index 51acabd..4ebfc5e 100644 --- a/src/root/RMicroFileReader.cxx +++ b/src/root/RMicroFileReader.cxx @@ -1223,9 +1223,11 @@ RMicroFileReader::GetNTupleProper(const char *ntupleName) // @Incomplete: each section has a differently-sized RBlob, we need to account for that! RTFString blobName { kBlobClassName }; RTFKey dummy; + // FIXME: it seems that sometimes even if IsBigFile() == false we get a big header size! if (fileHeader.IsBigFile()) dummy.MakeBigKey(); fileInfo.rblob_key_header_nbytes = dummy.GetHeaderSize() + blobName.GetSize() + 2 * RTFString{}.GetSize(); + printf("nbytes: %lu\n", fileInfo.rblob_key_header_nbytes); } // @---- ReadBuffer(ntuple, objNbytes, offset);