small refactor

This commit is contained in:
silverweed 2024-08-08 16:43:39 +02:00
parent 6accff3cbd
commit 0c21fd35db

View file

@ -699,60 +699,50 @@ struct Try_Sec_Hover_Fn {
} }
return false; return false;
} }
};
internal b8 tkey() const
b8 hover_try_key(const Try_Sec_Hover_Fn &try_sec_hover, const u8 *data, u64 start) {
{
u16 version_be; u16 version_be;
memcpy(&version_be, data + start + 4, sizeof(u16)); memcpy(&version_be, data + start + 4, sizeof(u16));
u32 version = bswap(version_be); u32 version = bswap(version_be);
b8 is_big = version > 1000; b8 is_big = version > 1000;
if (is_big) { if (is_big) {
return try_sec_hover.field<u32>("NBytes: %u") return field<u32>("NBytes: %u")
|| try_sec_hover.field<u16>("Version: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u16 x) { || field<u16>("Version: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u16 x) {
x = bswap(x); x = bswap(x);
x -= (x > 1000) * 1000; x -= 1000;
return push_str8_node_child(arena, prev, fmt, x); return push_str8_node_child(arena, prev, fmt, x);
}) })
|| try_sec_hover.field<u32>("Obj Len: %u") || field<u32>("Obj Len: %u")
|| try_sec_hover.field<u32>("Datetime: ", hover_display_datetime_str) || field<u32>("Datetime: ", hover_display_datetime_str)
|| try_sec_hover.field<u16>("Key Len: %u") || field<u16>("Key Len: %u")
|| try_sec_hover.field<u16>("Cycle: %u") || field<u16>("Cycle: %u")
|| try_sec_hover.field<u64>("Seek Key: 0x%lX") || field<u64>("Seek Key: 0x%lX")
|| try_sec_hover.field<u64>("Seek Pdir: 0x%lX") || field<u64>("Seek Pdir: 0x%lX")
|| try_sec_hover.field<String8>("Class Name: %s") || field<String8>("Class Name: %s")
|| try_sec_hover.field<String8>("Obj Name: %s") || field<String8>("Obj Name: %s")
|| try_sec_hover.field<String8>("Obj Title: %s") || field<String8>("Obj Title: %s")
; ;
} else { } else {
return try_sec_hover.field<u32>("NBytes: %u") return field<u32>("NBytes: %u")
|| try_sec_hover.field<u16>("Version: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u16 x) { || field<u16>("Version: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u16 x) {
x = bswap(x); x = bswap(x);
x -= (x > 1000) * 1000;
return push_str8_node_child(arena, prev, fmt, x); return push_str8_node_child(arena, prev, fmt, x);
}) })
|| try_sec_hover.field<u32>("Obj Len: %u") || field<u32>("Obj Len: %u")
|| try_sec_hover.field<u32>("Datetime: ", hover_display_datetime_str) || field<u32>("Datetime: ", hover_display_datetime_str)
|| try_sec_hover.field<u16>("Key Len: %u") || field<u16>("Key Len: %u")
|| try_sec_hover.field<u16>("Cycle: %u") || field<u16>("Cycle: %u")
|| try_sec_hover.field<u32>("Seek Key: 0x%lX") || field<u32>("Seek Key: 0x%lX")
|| try_sec_hover.field<u32>("Seek Pdir: 0x%lX") || field<u32>("Seek Pdir: 0x%lX")
|| try_sec_hover.field<String8>("Class Name: %s") || field<String8>("Class Name: %s")
|| try_sec_hover.field<String8>("Obj Name: %s") || field<String8>("Obj Name: %s")
|| try_sec_hover.field<String8>("Obj Title: %s") || field<String8>("Obj Title: %s")
; ;
} }
} }
};
internal
b8 hover_try_object(const Try_Sec_Hover_Fn &try_sec_hover)
{
return try_sec_hover.field<u16>("Version: %u")
|| try_sec_hover.field<u32>("Unique ID: %u")
|| try_sec_hover.field<u32>("Bits: %u");
}
// `off` is the absolute offset into `data`. // `off` is the absolute offset into `data`.
internal internal
@ -772,7 +762,7 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co
switch (section.id) { switch (section.id) {
case Sec_RNTuple_Anchor: { case Sec_RNTuple_Anchor: {
hover_try_key(try_sec_hover, data, start) try_sec_hover.tkey()
|| try_sec_hover.field<u32>("Object len: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u32 x) { || try_sec_hover.field<u32>("Object len: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u32 x) {
x = bswap(x); x = bswap(x);
x -= 0x4000'0000; x -= 0x4000'0000;
@ -838,7 +828,7 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co
} break; } break;
case Sec_TFile_Object: { case Sec_TFile_Object: {
if (!hover_try_key(try_sec_hover, data, start)) { if (!try_sec_hover.tkey()) {
b8 ok = try_sec_hover.field<String8>("File Name: %s") b8 ok = try_sec_hover.field<String8>("File Name: %s")
|| try_sec_hover.field<String8>("File Title: %s") || try_sec_hover.field<String8>("File Title: %s")
; ;
@ -885,7 +875,7 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co
case Sec_RNTuple_Header: case Sec_RNTuple_Header:
case Sec_RNTuple_Footer: case Sec_RNTuple_Footer:
case Sec_Page_List: { case Sec_Page_List: {
hover_try_key(try_sec_hover, data, start) try_sec_hover.tkey()
|| try_sec_hover.maybe_rootzip(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.range("Payload", section.range.len - section.post_size) // TODO: improve
|| try_sec_hover.field<u64>("Checksum: 0x%lX", hover_display_val_le) || try_sec_hover.field<u64>("Checksum: 0x%lX", hover_display_val_le)
@ -893,7 +883,8 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co
} break; } break;
case Sec_Page: { case Sec_Page: {
b8 ok = section.pre_size && hover_try_key(try_sec_hover, data, start); // only try hovering a key if this is the first page of the cluster (<=> pre_size != 0)
b8 ok = section.pre_size && try_sec_hover.tkey();
ok = ok || try_sec_hover.maybe_rootzip(data, start) ok = ok || try_sec_hover.maybe_rootzip(data, start)
|| try_sec_hover.range("Payload", section.range.len - section.post_size) // TODO: improve || try_sec_hover.range("Payload", section.range.len - section.post_size) // TODO: improve
|| try_sec_hover.field<u64>("Checksum: 0x%lX", hover_display_val_le) || try_sec_hover.field<u64>("Checksum: 0x%lX", hover_display_val_le)
@ -901,7 +892,7 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co
} break; } break;
case Sec_TFile_Info: { case Sec_TFile_Info: {
hover_try_key(try_sec_hover, data, start) try_sec_hover.tkey()
|| try_sec_hover.maybe_rootzip(data, start) || try_sec_hover.maybe_rootzip(data, start)
// || try_sec_hover.field<u32>("Byte Count: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u32 x) { // || try_sec_hover.field<u32>("Byte Count: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u32 x) {
// x = bswap(x); // x = bswap(x);
@ -917,9 +908,31 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co
} break; } break;
case Sec_TFile_FreeList: { case Sec_TFile_FreeList: {
hover_try_key(try_sec_hover, data, start) if (!try_sec_hover.tkey()) {
|| try_sec_hover.range("Payload", section.range.len) // TODO: improve u16 version_be;
memcpy(&version_be, data + start + try_sec_hover.cur_field_off, sizeof(u16));
u32 version = bswap(version_be);
b8 is_big = version > 1000;
if (is_big) {
try_sec_hover.field<u16>("Version: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u16 x) {
x = bswap(x);
x -= 1000;
return push_str8_node_child(arena, prev, fmt, x);
})
|| try_sec_hover.field<u64>("First: 0x%lX")
|| try_sec_hover.field<u64>("Last: 0x%lX")
; ;
} else {
try_sec_hover.field<u16>("Version: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u16 x) {
x = bswap(x);
return push_str8_node_child(arena, prev, fmt, x);
})
|| try_sec_hover.field<u32>("First: 0x%X")
|| try_sec_hover.field<u32>("Last: 0x%X")
;
}
}
} break; } break;
default:; default:;