From 9e47b823f6950ce1ecaddc1440cf08df91b83294 Mon Sep 17 00:00:00 2001 From: silverweed Date: Fri, 20 Sep 2024 11:26:31 +0200 Subject: [PATCH] fix schema description deser --- src/hover.cpp | 88 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 64 insertions(+), 24 deletions(-) diff --git a/src/hover.cpp b/src/hover.cpp index f5a2cbd..36ff211 100644 --- a/src/hover.cpp +++ b/src/hover.cpp @@ -323,23 +323,39 @@ struct Sec_Hover_Fn { b8 envelope_preamble() const { static const char *const envelope_names[] = { "INVALID", "Header", "Footer", "Page List" }; - return field("Envelope type: %s", [] (Arena *arena, String8_Node *prev, const char *fmt, u16 val) { - const char *name = (val >= countof(envelope_names)) ? "Unknown" : envelope_names[val]; - return push_str8_node_child(arena, prev, fmt, name); - }) - || range_data("Envelope size: %s", 6, [] (Arena *arena, String8_Node *prev, const char *fmt, const u8 *payload) { - u64 size; - memcpy(&size, payload, 6); - return push_str8_node_child(arena, prev, fmt, to_pretty_size(arena, size)); - }); + return titled_section("Envelope Preamble", [this] { + return field("Envelope type: %s", [] (Arena *arena, String8_Node *prev, const char *fmt, u16 val) { + const char *name = (val >= countof(envelope_names)) ? "Unknown" : envelope_names[val]; + return push_str8_node_child(arena, prev, fmt, name); + }) + || range_data("Envelope size: %s", 6, [] (Arena *arena, String8_Node *prev, const char *fmt, const u8 *payload) { + u64 size; + memcpy(&size, payload, 6); + return push_str8_node_child(arena, prev, fmt, to_pretty_size(arena, size)); + }); + }); } - b8 list_frame_preamble() const + b8 frame_header(const char *title = nullptr) const { - return titled_section("Frame Preamble", [this] { - return field("Size: %" PRIi64, hover_display_val_le_abs) - || field_le("N Items: %u") - ; + String8 titlestr = title ? push_str8f(arena, "Frame Header: %s", title) : str8("Frame Header"); + return titled_section(titlestr.c(), [this] { + i64 size; + memcpy(&size, data + start + cur_field_off, sizeof(size)); + if (size >= 0) + return field("Record frame size: %" PRIi64 " B", hover_display_val_le_abs); + else if (roff < cur_field_off + 12) { + info.rng = { start + cur_field_off, 12 }; + b8 ok = titled_section("List Frame", [this] { + add_to_desc("Size: %" PRIi64 " B", hover_display_val_le_abs); + add_to_desc("N Items: %u"); + return true; + }); + if (ok) + return ok; + } + cur_field_off += 12; + return false; }); } @@ -356,7 +372,7 @@ struct Sec_Hover_Fn { if (roff < cur_field_off + field_desc_len) { info.rng = { start + cur_field_off, (u64)field_desc_len }; return titled_section("Field", [this] { - add_to_desc("Size: %" PRIi64); + add_to_desc("Size: %" PRIi64 " B"); add_to_desc("Field version: %u"); add_to_desc("Type version: %u"); add_to_desc("On-disk parent id: %u"); @@ -388,7 +404,7 @@ struct Sec_Hover_Fn { u64 flags_off = start + cur_field_off + 22; u16 flags; memcpy(&flags, data + flags_off, sizeof(flags)); - b8 ok = field_le("Size: %" PRIi64) + b8 ok = field_le("Size: %" PRIi64 " B") || field_le("Field version: %u") || field_le("Type version: %u") || field_le("On-disk parent id: %u") @@ -451,7 +467,7 @@ struct Sec_Hover_Fn { u64 flags_off = start + cur_field_off + 16; u16 flags; memcpy(&flags, data + flags_off, sizeof(flags)); - b8 ok = field_le("Size: %" PRIi64) + b8 ok = field_le("Size: %" PRIi64 " B") || field("Column Type: %s", [](Arena *arena, String8_Node *prev, const char *fmt, u16 val) { const char *readable_col_type = get_column_type_name(val); return push_str8_node_child(arena, prev, fmt, readable_col_type); @@ -475,9 +491,9 @@ struct Sec_Hover_Fn { } template - b8 list_frame(F &&fn) const + b8 list_frame(const char *title, F &&fn) const { - if (list_frame_preamble()) + if (frame_header(title)) 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); @@ -492,17 +508,38 @@ struct Sec_Hover_Fn { b8 schema_description(const char *title) const { return titled_section(title, [this] { - // Fields - 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] { + // TODO: Columns and alias columns are not the same + return list_frame("Fields", [this] { return field_desc(); }) + || list_frame("Columns", [this] { return column_desc("Column"); }) + || list_frame("Alias Columns", [this] { return column_desc("Alias Column"); }) + || list_frame("Extra Type Infos", [this] { return field_le("Content identifier: %lu") || field_le("Type version from: %lu") || field_le("Type version to: %lu"); }); }); } + + b8 locator(const char *title) const + { + // TODO + return titled_section(title, [this] { + return true; + }); + } + + b8 cluster_group() const + { + return titled_section("Cluster Group", [this] { + return frame_header() + || field_le("Min Entry: %" PRIu64) + || field_le("Entry Span: %" PRIu64) + || field_le("N Clusters: %u") + || field_le("Env.Link Len: %" PRIu64) + || locator("Env.Link Locator") + ; + }); + } }; // `off` is the absolute offset into `data`. @@ -685,7 +722,10 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co || hover.schema_description("Schema Extension") // TODO: // - list of column group record frames + || hover.frame_header() // - list of cluster group record frames + || hover.frame_header() + || hover.cluster_group() || hover.range("Payload", section.range.len - hover.cur_field_off) || hover.field_le("Checksum: 0x%" PRIX64) ;