diff --git a/src/hover.cpp b/src/hover.cpp index 670b685..8093724 100644 --- a/src/hover.cpp +++ b/src/hover.cpp @@ -124,7 +124,10 @@ using Display_Range_Fn = String8_Node *(*)(Arena *, String8_Node *, const char * enum Hover_Section_Flags { HoverSec_None = 0, + // Hide = don't show at all, even the title HoverSec_HideIfNotHovered = 1, + // Collapse = only show the title + HoverSec_CollapseIfNotHovered = 2, }; // Functor used by get_section_hover_info to describe the structure of a section and print data about it. @@ -143,8 +146,11 @@ struct Sec_Hover_Fn { b8 read(T *val, u64 offset, u64 *size = nullptr) const { u64 nb = size ? *size : sizeof(T); - if (offset + nb > section.range.end()) + if (offset + nb > section.range.end()) { + fprintf(stderr, "Trying to read bytes 0x%" PRIX64 "-0x%" PRIX64 " which are past the end of the section 0x%" PRIX64 "!\n", + offset, offset + nb, section.range.end()); return false; + } memcpy(val, data + offset, nb); return true; @@ -161,11 +167,19 @@ struct Sec_Hover_Fn { sec_body_fn(); - assert(cur_field_off >= sec_start); + // assert(cur_field_off >= sec_start); + if (cur_field_off < sec_start) {// TEMP DEBUG + fprintf(stderr, "Something wrong going on in %s!\n", title); + return; + } + b8 hovered = off >= sec_start && off <= cur_field_off; - if (!hovered & (flags & HoverSec_HideIfNotHovered)) { - pop_str8_node_child(prev_desc, info.desc); + if (!hovered) { + if (flags & HoverSec_HideIfNotHovered) + pop_str8_node_child(prev_desc, info.desc); + else if (flags & HoverSec_CollapseIfNotHovered) + info.desc->first_child = info.desc->last_child = nullptr; } else if (display_grouped) { // if we're in display_grouped mode, we want to highlight the entire range of the section; u64 sec_len = cur_field_off - sec_start; @@ -350,7 +364,12 @@ struct Sec_Hover_Fn { enum Frame_Type { Frame_INVALID, Frame_Record, - Frame_List + Frame_List, + Frame_COUNT + }; + + static constexpr const char *frame_type_str[Frame_COUNT] = { + "INVALID", "Record", "List" }; Frame_Type frame_header(u64 &size, u32 *n_items = nullptr, const char *title = nullptr) @@ -431,7 +450,7 @@ struct Sec_Hover_Fn { field_str8("Type Name: %s"); field_str8("Type Alias: %s"); field_str8("Description: %s"); - }, HoverSec_HideIfNotHovered); + }); } void column_desc(const char *title) @@ -456,13 +475,15 @@ struct Sec_Hover_Fn { field_le("Value Min: %f"); field_le("Value Max: %f"); } - }, HoverSec_HideIfNotHovered); + }); } void schema_description(const char *title) { titled_section(title, [this] { - frame("Fields", [this] (u32 idx) { field_desc(push_str8f(arena, "Field %u", idx).c()); }); + frame("Fields", [this] (u32 idx) { + field_desc(push_str8f(arena, "Field %u", idx).c()); + }); frame("Columns", [this] (u32 idx) { column_desc(push_str8f(arena, "Column %u", idx).c()); }); frame("Alias Columns", [this] (u32 idx) { frame(push_str8f(arena, "Alias Column %u", idx).c(), [this] { @@ -536,7 +557,7 @@ struct Sec_Hover_Fn { void cluster_group() { - frame("Cluster Group", [this] (u32) { + frame("Cluster Group", [this] { field_le("Min Entry: %" PRIu64); field_le("Entry Span: %" PRIu64); field_le("N Clusters: %u"); @@ -577,7 +598,7 @@ struct Sec_Hover_Fn { b8 has_checksum = n_elems < 0; push_str8_node_child(arena, info.desc, "Has Checksum: %s", has_checksum ? "yes" : "no"); locator("Element Locator"); - }, HoverSec_HideIfNotHovered); + }); } i64 n_cols; @@ -593,12 +614,12 @@ struct Sec_Hover_Fn { if (n_cols >= 0) field_le("Compression Settings: %d"); }); - }, HoverSec_HideIfNotHovered); + }); }); } template - void frame(const char *title, F &&frame_body_fn, u64 sec_flags = 0) + void frame(const char *title, F &&frame_body_fn, u64 sec_flags = HoverSec_CollapseIfNotHovered) { u64 start_off = cur_field_off; u64 size; @@ -606,8 +627,11 @@ struct Sec_Hover_Fn { titled_section(title, [this, title, start_off, &size, &frame_body_fn] { u32 n_items = 0; Frame_Type ftype = frame_header(size, &n_items); - if (ftype != FType) + if (ftype != FType) { + fprintf(stderr, "Frame %s was supposed to be of type %s but it's of type %s\n", + title, frame_type_str[FType], frame_type_str[ftype]); return; + } if constexpr (FType == Frame_List) { // Sadness here. @@ -829,7 +853,6 @@ struct Sec_Hover_Fn { if (zipped) { // XXX: why -1? range("Compressed payload", section.range.len - section.post_size - sizeof(u64) - 1); - field_le("Checksum: 0x%" PRIX64); } else { envelope_preamble(); // NOTE: flags in principle require a more complex handling, but for now they are unused, @@ -839,8 +862,8 @@ struct Sec_Hover_Fn { field_str8("Description: %s"); field_str8("ROOT version: %s"); schema_description("Schema Description"); - field_le("Checksum: 0x%" PRIX64); } + field_le("Checksum: 0x%" PRIX64); }, HoverSec_HideIfNotHovered); }); } @@ -857,20 +880,23 @@ struct Sec_Hover_Fn { if (zipped) { // XXX: why -1? range("Payload", section.range.len - section.post_size - sizeof(u64) - 1); - field_le("Checksum: 0x%" PRIX64); } else { 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. field_le("Flags: 0x%" PRIX64); field_le("Header checksum: 0x%" PRIX64); - schema_description("Schema Extension"); - // NOTE: Column groups are currently unused, so this should always be empty - frame("Column Groups", [] (u32) {}); - frame("Cluster Groups", [this] (u32) { cluster_group(); }); - range("Payload", section.range.len - cur_field_off); - field_le("Checksum: 0x%" PRIX64); + frame("Schema Extension", [this] { + schema_description("Schema Extension"); + }); + frame("Column Groups", [this] (u32) { + field_le("Column Id: %u"); + }); + frame("Cluster Groups", [this] (u32) { + cluster_group(); + }); } + field_le("Checksum: 0x%" PRIX64); }, HoverSec_HideIfNotHovered); }); } @@ -898,13 +924,13 @@ struct Sec_Hover_Fn { if (zipped) { // XXX: why -1? range("Payload", section.range.len - section.post_size - sizeof(u64) - 1); - field_le("Checksum: 0x%" PRIX64); } else { envelope_preamble(); field_le("Header checksum: 0x%" PRIX64); frame("Cluster Summaries", [this] (u32) { cluster_summary(); }); frame("Clusters", [this] (u32) { cluster(); }); } + field_le("Checksum: 0x%" PRIX64); }, HoverSec_HideIfNotHovered); }); }