diff --git a/src/rntuple.cpp b/src/rntuple.cpp index 2f13afb..d78c0e6 100644 --- a/src/rntuple.cpp +++ b/src/rntuple.cpp @@ -535,6 +535,8 @@ String8_Node *display_val_rootzip(Arena *arena, String8_Node *prev, const char * } if (src[0] == 'Z' && src[1] == 'S' && src[2] == 1) { zip_method = str8("ZSTD"); + } else { + return nullptr; } u32 comp_size = src[3] | (src[4] << 8) | (src[5] << 16); u32 uncomp_size = src[6] | (src[7] << 8) | (src[8] << 16); @@ -547,6 +549,9 @@ String8_Node *display_val_rootzip(Arena *arena, String8_Node *prev, const char * return sn; } +template +using Display_Fn = String8_Node *(*)(Arena *, String8_Node *, const char *, T); + // Functor used by get_section_hover_info to describe the structure of a section and print data about it. struct Try_Sec_Hover_Fn { u64 start; @@ -556,12 +561,10 @@ struct Try_Sec_Hover_Fn { Sec_Hover_Info &info; u64 &cur_field_off; - template - b8 field(const char *desc_fmt, - String8_Node *(*display_val)(Arena *, String8_Node *, const char *, TField_Type) = hover_display_val_be - ) const + template + b8 field(const char *desc_fmt, Display_Fn display_val = hover_display_val_be) const { - u64 field_len = sizeof(TField_Type); + u64 field_len = sizeof(T); if (roff < cur_field_off + field_len) { info.rng = { start + cur_field_off, field_len }; TField_Type val; @@ -574,9 +577,7 @@ struct Try_Sec_Hover_Fn { } template <> - b8 field(const char *desc_fmt, - String8_Node *(*display_val)(Arena *, String8_Node *, const char *, String8) - ) const + b8 field(const char *desc_fmt, Display_Fn display_val) const { u8 str_size = data[start + cur_field_off]; if (roff < cur_field_off + 1 + str_size) { @@ -603,14 +604,11 @@ struct Try_Sec_Hover_Fn { return false; } - b8 range_data(const char *desc, u64 range_len, - String8_Node *(*display_val)(Arena *, String8_Node *, const char *, const u8 *) - ) const + b8 range_data(const char *desc, u64 range_len, Display_Fn display_val) const { if (roff < cur_field_off + range_len) { info.rng = { start + cur_field_off, range_len }; - display_val(arena, info.desc, desc, data + start + cur_field_off); - return true; + return display_val(arena, info.desc, desc, data + start + cur_field_off); } cur_field_off += range_len; return false; @@ -663,10 +661,9 @@ 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 *data, u64 start) +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); }