From 6e30189b5a44c0e1113a49f5c7d0a658a066c18f Mon Sep 17 00:00:00 2001 From: silverweed Date: Fri, 2 Aug 2024 15:17:33 +0200 Subject: [PATCH] refactor/fix hover rootzip --- src/rntuple.cpp | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/src/rntuple.cpp b/src/rntuple.cpp index d78c0e6..3f32266 100644 --- a/src/rntuple.cpp +++ b/src/rntuple.cpp @@ -523,17 +523,13 @@ String8_Node *display_val_rootzip(Arena *arena, String8_Node *prev, const char * String8 zip_method; if (src[0] == 'Z' && src[1] == 'L' && src[2] == Z_DEFLATED) { zip_method = str8("ZLIB"); - } - if (src[0] == 'C' && src[1] == 'S' && src[2] == Z_DEFLATED) { + } else if (src[0] == 'C' && src[1] == 'S' && src[2] == Z_DEFLATED) { zip_method = str8("Old"); - } - if (src[0] == 'X' && src[1] == 'Z' && src[2] == 0) { + } else if (src[0] == 'X' && src[1] == 'Z' && src[2] == 0) { zip_method = str8("LZMA"); - } - if (src[0] == 'L' && src[1] == '4') { + } else if (src[0] == 'L' && src[1] == '4') { zip_method = str8("LZ4"); - } - if (src[0] == 'Z' && src[1] == 'S' && src[2] == 1) { + } else if (src[0] == 'Z' && src[1] == 'S' && src[2] == 1) { zip_method = str8("ZSTD"); } else { return nullptr; @@ -567,7 +563,7 @@ struct Try_Sec_Hover_Fn { u64 field_len = sizeof(T); if (roff < cur_field_off + field_len) { info.rng = { start + cur_field_off, field_len }; - TField_Type val; + T val; memcpy(&val, data + info.rng.start, info.rng.len); display_val(arena, info.desc, desc_fmt, val); return true; @@ -608,11 +604,29 @@ struct Try_Sec_Hover_Fn { { if (roff < cur_field_off + range_len) { info.rng = { start + cur_field_off, range_len }; - return display_val(arena, info.desc, desc, data + start + cur_field_off); + display_val(arena, info.desc, desc, data + start + cur_field_off); + return true; } cur_field_off += range_len; return false; } + + b8 maybe_rootzip(const u8 *data, u64 start) const + { + // TODO boundary checks + const u64 range_len = 9; + if (display_val_rootzip(arena, info.desc, "Zipped Block", data + start + cur_field_off)) { + if (roff < cur_field_off + range_len) { + info.rng = { start + cur_field_off, range_len }; + hover_display_val_be(arena, info.desc, "", data + start + cur_field_off); + return true; + } + // discard the description (it's fine since it's allocated in the scratch arena) + info.desc->first_child = nullptr; + cur_field_off += range_len; + } + return false; + } }; internal @@ -660,13 +674,6 @@ b8 hover_try_key(const Try_Sec_Hover_Fn &try_sec_hover, const u8 *data, u64 star } } -internal -b8 hover_try_rootzip(const Try_Sec_Hover_Fn &try_sec_hover, const u8 *, u64) -{ - // TODO boundary checks - return try_sec_hover.range_data("Zipped Block", 9, display_val_rootzip); -} - // `off` is the absolute offset into `data`. internal Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, const u8 *data) @@ -799,7 +806,7 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co case Sec_Page_List: case Sec_Page: { hover_try_key(try_sec_hover, data, start) - || hover_try_rootzip(try_sec_hover, data, start) + || try_sec_hover.maybe_rootzip(data, start) || try_sec_hover.range("Payload", section.range.len - section.post_size) // TODO: improve || try_sec_hover.field("Checksum: 0x%lX", hover_display_val_le) ;