153 lines
3.1 KiB
C
153 lines
3.1 KiB
C
struct Byte_Range {
|
|
u64 start, len;
|
|
inline u64 end() const { return start + len; }
|
|
};
|
|
|
|
// Used to store location information about stuff like checksums, page lists, etc
|
|
struct Range_Seq {
|
|
Range_Seq *next;
|
|
Byte_Range range;
|
|
};
|
|
|
|
struct Page_Info_Node {
|
|
Page_Info_Node *next;
|
|
Page_Info_Node *prev;
|
|
|
|
Byte_Range range; // len includes checksum
|
|
i32 n_elems; // negative = page has checksum
|
|
u32 cluster_id;
|
|
b8 is_first_in_cluster;
|
|
|
|
u64 page_id;
|
|
|
|
u8 bits_per_elem;
|
|
String8 elem_type_name;
|
|
String8 owner_field_name;
|
|
|
|
inline u64 checksum_size() const {
|
|
return (n_elems < 0) * 8;
|
|
}
|
|
};
|
|
|
|
static const Page_Info_Node invalid_pinfo {};
|
|
|
|
struct Page_Info_Group {
|
|
Byte_Range range;
|
|
Page_Info_Node *first;
|
|
};
|
|
|
|
struct Page_Info_Chunk {
|
|
Page_Info_Chunk *next;
|
|
Byte_Range range;
|
|
u32 first_group;
|
|
};
|
|
|
|
struct Cluster_Info {
|
|
Page_Info_Node *first_page;
|
|
u64 first_page_idx; // index in the pages linked list
|
|
};
|
|
|
|
struct Cluster_Group_Info {
|
|
Byte_Range rng_page_list;
|
|
};
|
|
|
|
// A Section represents an interesting sequence of bytes in the file.
|
|
// It is associated to stuff such as a color, some metadata, etc.
|
|
enum Section_Id {
|
|
Sec_None,
|
|
Sec_TFile_Header,
|
|
Sec_TFile_Object,
|
|
Sec_TFile_Info,
|
|
Sec_TFile_FreeList,
|
|
Sec_TKey_List,
|
|
Sec_RNTuple_Anchor,
|
|
Sec_RNTuple_Header,
|
|
Sec_RNTuple_Footer,
|
|
Sec_Page_List,
|
|
Sec_Page, // keep last, or change logic in find_section()
|
|
|
|
Sec_COUNT
|
|
};
|
|
|
|
struct Section {
|
|
Section_Id id;
|
|
Byte_Range range;
|
|
u64 pre_size; // usually the TKey header, excluded from `range`
|
|
u64 post_size; // usually the checksum, included in `range`
|
|
b8 highlighted;
|
|
|
|
// Optional pointer to the specific information for the section.
|
|
// e.g. if the section is a Page this points to the relative Page_Info_Node
|
|
const void *info;
|
|
};
|
|
|
|
internal const String8 section_names[Sec_COUNT] = {
|
|
str8("None"),
|
|
str8("TFile Header"),
|
|
str8("TFile Object"),
|
|
str8("TFile Streamer Info"),
|
|
str8("TFile FreeList"),
|
|
str8("TKey List"),
|
|
str8("RNTuple Anchor"),
|
|
str8("RNTuple Header"),
|
|
str8("RNTuple Footer"),
|
|
str8("Page List"),
|
|
str8("Page"),
|
|
};
|
|
|
|
struct Byte_Range_Node {
|
|
Byte_Range_Node *next;
|
|
Byte_Range rng;
|
|
};
|
|
|
|
struct RNTuple_Anchor_Info {
|
|
RNTuple_Anchor_Info *next;
|
|
String8 name;
|
|
u64 offset_in_file;
|
|
};
|
|
|
|
struct TKeys_Data {
|
|
Section sections[Sec_COUNT];
|
|
|
|
RNTuple_Anchor_Info *rntuples;
|
|
Byte_Range_Node *rblob_keys;
|
|
};
|
|
|
|
struct TFile_Data {
|
|
u16 root_version_major;
|
|
u16 root_version_minor;
|
|
u16 root_version_patch;
|
|
u32 compression;
|
|
|
|
TKeys_Data tkeys_data;
|
|
ROOT::Experimental::RNTuple rntuple_anchor;
|
|
};
|
|
|
|
struct RNTuple_Data {
|
|
Page_Info_Node *pages;
|
|
u64 n_pages;
|
|
// total number of elements of all pages
|
|
u64 n_elems;
|
|
u64 tot_page_comp_size;
|
|
u64 tot_page_uncomp_size;
|
|
|
|
// TODO
|
|
Range_Seq *checksums;
|
|
u64 n_checksums;
|
|
|
|
Cluster_Group_Info *cluster_groups;
|
|
u64 n_cluster_groups;
|
|
u64 tot_page_list_size;
|
|
|
|
Cluster_Info *clusters;
|
|
u64 n_clusters;
|
|
// total number of entries of all clusters
|
|
u64 n_entries;
|
|
|
|
Page_Info_Group *page_groups;
|
|
u64 n_page_groups;
|
|
|
|
// grouping of consecutive pages
|
|
Page_Info_Chunk *page_chunks;
|
|
u64 n_page_chunks;
|
|
};
|