From fe5458874e325e111b907d506e37d572f54c9036 Mon Sep 17 00:00:00 2001
From: silverweed <silverweed14@proton.me>
Date: Tue, 29 Oct 2024 15:16:06 +0100
Subject: [PATCH] basic tkey walking

---
 src/render.cpp  |  1 +
 src/rntuple.cpp | 27 +++++++++++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/src/render.cpp b/src/render.cpp
index a4a71a4..42b94f7 100644
--- a/src/render.cpp
+++ b/src/render.cpp
@@ -395,6 +395,7 @@ void update_and_render(Arena *arena, App_State &app, f32 delta_time_ms)
 
       if (hovered_off)
       {
+        ImGui::TextColored(ImColor(0.f, 0.65f, 0.f), "Offset: 0x%" PRIX64, hovered_off - 1);
         Section hovered_section = find_section(app, hovered_off - 1);
         b8 hover_display_grouped = !(app.user_input.key_state[KEY_ALT] & KEY_STATE_IS_DOWN);
         Sec_Hover_Info hover_info = get_section_hover_info(scratch.arena, hovered_section, hovered_off - 1, 
diff --git a/src/rntuple.cpp b/src/rntuple.cpp
index c63a9d5..c9168d2 100644
--- a/src/rntuple.cpp
+++ b/src/rntuple.cpp
@@ -131,6 +131,31 @@ const char *get_column_type_name_from_ondisk_type(u16 type)
   }
 }  
 
+internal
+void walk_tkeys(const u8 *data, u64 data_len)
+{
+  u64 cur = 8; // offset of fBEGIN
+  if (data_len < cur)
+    return;
+  
+  u32 begin_be;
+  memcpy(&begin_be, data + cur, sizeof(begin_be));
+  cur = bswap(begin_be);
+
+  while (cur < data_len) {
+    u32 n_bytes_be;
+    memcpy(&n_bytes_be, data + cur, sizeof(n_bytes_be));
+    u32 n_bytes = bswap(n_bytes_be);
+    
+    if (!n_bytes) {
+      fprintf(stderr, "Error: found key or obj with len 0. Bailing out...\n");
+      return;
+    }
+
+    cur += n_bytes;
+  }
+}
+
 internal
 void gather_ntuple_metadata(Arena *arena, RMicroFileReader &reader, const RNTuple_File_Info &info, RNTuple_Data &rndata)
 {
@@ -499,6 +524,8 @@ RNTuple_Data get_rntuple_data(Arena *arena, const Inspected_File &file, String8
     gather_ntuple_metadata(arena, file_reader, file_info, rndata);
     if (extended_info)
       rndata.tot_page_uncomp_size = calc_page_uncomp_size(file.mem, rndata.pages);
+
+    walk_tkeys(file.mem, file.size);
   }
 
   return rndata;