mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-16 14:31:24 -07:00
506 lines
14 KiB
C
506 lines
14 KiB
C
// Copyright (c) 2024 Epic Games Tools
|
|
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
|
|
|
#ifndef DEBUG_FRONTEND_VIEWS_H
|
|
#define DEBUG_FRONTEND_VIEWS_H
|
|
|
|
////////////////////////////////
|
|
//~ rjf: FileSystem @view_types
|
|
|
|
typedef enum DF_FileSortKind
|
|
{
|
|
DF_FileSortKind_Null,
|
|
DF_FileSortKind_Filename,
|
|
DF_FileSortKind_LastModified,
|
|
DF_FileSortKind_Size,
|
|
DF_FileSortKind_COUNT
|
|
}
|
|
DF_FileSortKind;
|
|
|
|
typedef struct DF_FileInfo DF_FileInfo;
|
|
struct DF_FileInfo
|
|
{
|
|
String8 filename;
|
|
FileProperties props;
|
|
FuzzyMatchRangeList match_ranges;
|
|
};
|
|
|
|
typedef struct DF_FileInfoNode DF_FileInfoNode;
|
|
struct DF_FileInfoNode
|
|
{
|
|
DF_FileInfoNode *next;
|
|
DF_FileInfo file_info;
|
|
};
|
|
|
|
typedef struct DF_FileSystemViewPathState DF_FileSystemViewPathState;
|
|
struct DF_FileSystemViewPathState
|
|
{
|
|
DF_FileSystemViewPathState *hash_next;
|
|
String8 normalized_path;
|
|
Vec2S64 cursor;
|
|
};
|
|
|
|
typedef struct DF_FileSystemViewState DF_FileSystemViewState;
|
|
struct DF_FileSystemViewState
|
|
{
|
|
B32 initialized;
|
|
U64 path_state_table_size;
|
|
DF_FileSystemViewPathState **path_state_table;
|
|
DF_FileSortKind sort_kind;
|
|
Side sort_side;
|
|
Arena *cached_files_arena;
|
|
String8 cached_files_path;
|
|
DF_FileSortKind cached_files_sort_kind;
|
|
Side cached_files_sort_side;
|
|
U64 cached_file_count;
|
|
DF_FileInfo *cached_files;
|
|
F32 col_pcts[3];
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Commands @view_types
|
|
|
|
typedef struct DF_CmdListerItem DF_CmdListerItem;
|
|
struct DF_CmdListerItem
|
|
{
|
|
DF_CmdSpec *cmd_spec;
|
|
U64 registrar_idx;
|
|
U64 ordering_idx;
|
|
FuzzyMatchRangeList name_match_ranges;
|
|
FuzzyMatchRangeList desc_match_ranges;
|
|
FuzzyMatchRangeList tags_match_ranges;
|
|
};
|
|
|
|
typedef struct DF_CmdListerItemNode DF_CmdListerItemNode;
|
|
struct DF_CmdListerItemNode
|
|
{
|
|
DF_CmdListerItemNode *next;
|
|
DF_CmdListerItem item;
|
|
};
|
|
|
|
typedef struct DF_CmdListerItemList DF_CmdListerItemList;
|
|
struct DF_CmdListerItemList
|
|
{
|
|
DF_CmdListerItemNode *first;
|
|
DF_CmdListerItemNode *last;
|
|
U64 count;
|
|
};
|
|
|
|
typedef struct DF_CmdListerItemArray DF_CmdListerItemArray;
|
|
struct DF_CmdListerItemArray
|
|
{
|
|
DF_CmdListerItem *v;
|
|
U64 count;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: PendingEntity @view_types
|
|
|
|
typedef struct DF_PendingEntityViewState DF_PendingEntityViewState;
|
|
struct DF_PendingEntityViewState
|
|
{
|
|
Arena *deferred_cmd_arena;
|
|
DF_CmdList deferred_cmds;
|
|
Arena *complete_cfg_arena;
|
|
DF_CfgNode *complete_cfg_root;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: EntityLister @view_types
|
|
|
|
typedef struct DF_EntityListerItem DF_EntityListerItem;
|
|
struct DF_EntityListerItem
|
|
{
|
|
DF_Entity *entity;
|
|
FuzzyMatchRangeList name_match_ranges;
|
|
};
|
|
|
|
typedef struct DF_EntityListerItemNode DF_EntityListerItemNode;
|
|
struct DF_EntityListerItemNode
|
|
{
|
|
DF_EntityListerItemNode *next;
|
|
DF_EntityListerItem item;
|
|
};
|
|
|
|
typedef struct DF_EntityListerItemList DF_EntityListerItemList;
|
|
struct DF_EntityListerItemList
|
|
{
|
|
DF_EntityListerItemNode *first;
|
|
DF_EntityListerItemNode *last;
|
|
U64 count;
|
|
};
|
|
|
|
typedef struct DF_EntityListerItemArray DF_EntityListerItemArray;
|
|
struct DF_EntityListerItemArray
|
|
{
|
|
DF_EntityListerItem *v;
|
|
U64 count;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: SystemProcesses @view_types
|
|
|
|
typedef struct DF_ProcessInfo DF_ProcessInfo;
|
|
struct DF_ProcessInfo
|
|
{
|
|
DMN_ProcessInfo info;
|
|
B32 is_attached;
|
|
FuzzyMatchRangeList attached_match_ranges;
|
|
FuzzyMatchRangeList name_match_ranges;
|
|
FuzzyMatchRangeList pid_match_ranges;
|
|
};
|
|
|
|
typedef struct DF_ProcessInfoNode DF_ProcessInfoNode;
|
|
struct DF_ProcessInfoNode
|
|
{
|
|
DF_ProcessInfoNode *next;
|
|
DF_ProcessInfo info;
|
|
};
|
|
|
|
typedef struct DF_ProcessInfoList DF_ProcessInfoList;
|
|
struct DF_ProcessInfoList
|
|
{
|
|
DF_ProcessInfoNode *first;
|
|
DF_ProcessInfoNode *last;
|
|
U64 count;
|
|
};
|
|
|
|
typedef struct DF_ProcessInfoArray DF_ProcessInfoArray;
|
|
struct DF_ProcessInfoArray
|
|
{
|
|
DF_ProcessInfo *v;
|
|
U64 count;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Breakpoint @view_types
|
|
|
|
typedef struct DF_BreakpointViewState DF_BreakpointViewState;
|
|
struct DF_BreakpointViewState
|
|
{
|
|
B32 initialized;
|
|
Vec2S32 selected_p;
|
|
F32 key_pct;
|
|
F32 val_pct;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Target @view_types
|
|
|
|
typedef struct DF_TargetViewState DF_TargetViewState;
|
|
struct DF_TargetViewState
|
|
{
|
|
B32 initialized;
|
|
|
|
// rjf: pick file kind
|
|
DF_EntityKind pick_dst_kind;
|
|
|
|
// rjf: selection cursor
|
|
Vec2S64 cursor;
|
|
|
|
// rjf: text input state
|
|
TxtPt input_cursor;
|
|
TxtPt input_mark;
|
|
U8 input_buffer[1024];
|
|
U64 input_size;
|
|
B32 input_editing;
|
|
|
|
// rjf: table column pcts
|
|
F32 key_pct;
|
|
F32 value_pct;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: FilePathMap @view_types
|
|
|
|
typedef struct DF_FilePathMapViewState DF_FilePathMapViewState;
|
|
struct DF_FilePathMapViewState
|
|
{
|
|
B32 initialized;
|
|
Vec2S64 cursor;
|
|
TxtPt input_cursor;
|
|
TxtPt input_mark;
|
|
U8 input_buffer[1024];
|
|
U64 input_size;
|
|
B32 input_editing;
|
|
DF_Handle pick_file_dst_map;
|
|
Side pick_file_dst_side;
|
|
F32 src_column_pct;
|
|
F32 dst_column_pct;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: AutoViewRules @view_types
|
|
|
|
typedef struct DF_AutoViewRulesViewState DF_AutoViewRulesViewState;
|
|
struct DF_AutoViewRulesViewState
|
|
{
|
|
B32 initialized;
|
|
Vec2S64 cursor;
|
|
TxtPt input_cursor;
|
|
TxtPt input_mark;
|
|
U8 input_buffer[1024];
|
|
U64 input_size;
|
|
B32 input_editing;
|
|
F32 src_column_pct;
|
|
F32 dst_column_pct;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Modules @view_types
|
|
|
|
typedef struct DF_ModulesViewState DF_ModulesViewState;
|
|
struct DF_ModulesViewState
|
|
{
|
|
B32 initialized;
|
|
DF_Handle selected_entity;
|
|
S64 selected_column;
|
|
B32 txt_editing;
|
|
TxtPt txt_cursor;
|
|
TxtPt txt_mark;
|
|
U8 txt_buffer[1024];
|
|
U64 txt_size;
|
|
DF_Handle pick_file_dst_entity;
|
|
F32 idx_col_pct;
|
|
F32 desc_col_pct;
|
|
F32 range_col_pct;
|
|
F32 dbg_col_pct;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Watch, Locals, Registers @view_types
|
|
|
|
typedef struct DF_EvalRoot DF_EvalRoot;
|
|
struct DF_EvalRoot
|
|
{
|
|
DF_EvalRoot *next;
|
|
DF_EvalRoot *prev;
|
|
U64 expr_buffer_string_size;
|
|
U64 expr_buffer_cap;
|
|
U8 *expr_buffer;
|
|
};
|
|
|
|
typedef enum DF_WatchViewColumnKind
|
|
{
|
|
DF_WatchViewColumnKind_Expr,
|
|
DF_WatchViewColumnKind_Value,
|
|
DF_WatchViewColumnKind_Type,
|
|
DF_WatchViewColumnKind_ViewRule,
|
|
DF_WatchViewColumnKind_COUNT
|
|
}
|
|
DF_WatchViewColumnKind;
|
|
|
|
typedef enum DF_WatchViewFillKind
|
|
{
|
|
DF_WatchViewFillKind_Mutable,
|
|
DF_WatchViewFillKind_Registers,
|
|
DF_WatchViewFillKind_Locals,
|
|
DF_WatchViewFillKind_Globals,
|
|
DF_WatchViewFillKind_ThreadLocals,
|
|
DF_WatchViewFillKind_Types,
|
|
DF_WatchViewFillKind_Procedures,
|
|
DF_WatchViewFillKind_COUNT
|
|
}
|
|
DF_WatchViewFillKind;
|
|
|
|
typedef struct DF_WatchViewPoint DF_WatchViewPoint;
|
|
struct DF_WatchViewPoint
|
|
{
|
|
DF_WatchViewColumnKind column_kind;
|
|
DF_ExpandKey parent_key;
|
|
DF_ExpandKey key;
|
|
};
|
|
|
|
typedef struct DF_WatchViewTextEditState DF_WatchViewTextEditState;
|
|
struct DF_WatchViewTextEditState
|
|
{
|
|
DF_WatchViewTextEditState *pt_hash_next;
|
|
DF_WatchViewPoint pt;
|
|
TxtPt cursor;
|
|
TxtPt mark;
|
|
U8 input_buffer[1024];
|
|
U64 input_size;
|
|
U8 initial_buffer[1024];
|
|
U64 initial_size;
|
|
};
|
|
|
|
typedef struct DF_WatchViewState DF_WatchViewState;
|
|
struct DF_WatchViewState
|
|
{
|
|
B32 initialized;
|
|
|
|
// rjf: fill kind (way that the contents of the watch view are computed)
|
|
DF_WatchViewFillKind fill_kind;
|
|
|
|
// rjf; table cursor state
|
|
DF_WatchViewPoint cursor;
|
|
DF_WatchViewPoint mark;
|
|
DF_WatchViewPoint next_cursor;
|
|
DF_WatchViewPoint next_mark;
|
|
|
|
// rjf: text input state
|
|
Arena *text_edit_arena;
|
|
U64 text_edit_state_slots_count;
|
|
DF_WatchViewTextEditState dummy_text_edit_state;
|
|
DF_WatchViewTextEditState **text_edit_state_slots;
|
|
B32 text_editing;
|
|
|
|
// rjf: table column width state
|
|
F32 expr_column_pct;
|
|
F32 value_column_pct;
|
|
F32 type_column_pct;
|
|
F32 view_rule_column_pct;
|
|
|
|
// rjf: mutable fill-kind root expression state
|
|
DF_EvalRoot *first_root;
|
|
DF_EvalRoot *last_root;
|
|
DF_EvalRoot *first_free_root;
|
|
U64 root_count;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Code @view_types
|
|
|
|
typedef struct DF_CodeViewState DF_CodeViewState;
|
|
struct DF_CodeViewState
|
|
{
|
|
// rjf: stable state
|
|
B32 initialized;
|
|
TxtPt cursor;
|
|
TxtPt mark;
|
|
S64 preferred_column;
|
|
B32 drifted_for_search;
|
|
DF_Handle pick_file_override_target;
|
|
|
|
// rjf: per-frame command info
|
|
S64 goto_line_num;
|
|
B32 center_cursor;
|
|
B32 contain_cursor;
|
|
Arena *find_text_arena;
|
|
String8 find_text_fwd;
|
|
String8 find_text_bwd;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Disassembly @view_types
|
|
|
|
typedef struct DF_DisasmViewState DF_DisasmViewState;
|
|
struct DF_DisasmViewState
|
|
{
|
|
// rjf: stable state
|
|
B32 initialized;
|
|
DF_Handle process;
|
|
U64 base_vaddr;
|
|
TxtPt cursor;
|
|
TxtPt mark;
|
|
S64 preferred_column;
|
|
B32 drifted_for_search;
|
|
DASM_StyleFlags style_flags;
|
|
|
|
// rjf: per-frame command info
|
|
S64 goto_line_num;
|
|
U64 goto_vaddr;
|
|
B32 center_cursor;
|
|
B32 contain_cursor;
|
|
Arena *find_text_arena;
|
|
String8 find_text_fwd;
|
|
String8 find_text_bwd;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Memory @view_types
|
|
|
|
typedef struct DF_MemoryViewState DF_MemoryViewState;
|
|
struct DF_MemoryViewState
|
|
{
|
|
B32 initialized;
|
|
|
|
// rjf: last-viewed-memory cache
|
|
Arena *last_viewed_memory_cache_arena;
|
|
U8 *last_viewed_memory_cache_buffer;
|
|
Rng1U64 last_viewed_memory_cache_range;
|
|
U64 last_viewed_memory_cache_memgen_idx;
|
|
|
|
// rjf: control state
|
|
U64 cursor;
|
|
U64 mark;
|
|
|
|
// rjf: organization state
|
|
U64 num_columns;
|
|
U64 bytes_per_cell;
|
|
|
|
// rjf: command pass-through data
|
|
B32 center_cursor;
|
|
B32 contain_cursor;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Quick Sort Comparisons
|
|
|
|
internal int df_qsort_compare_file_info__default(DF_FileInfo *a, DF_FileInfo *b);
|
|
internal int df_qsort_compare_file_info__default_filtered(DF_FileInfo *a, DF_FileInfo *b);
|
|
internal int df_qsort_compare_file_info__filename(DF_FileInfo *a, DF_FileInfo *b);
|
|
internal int df_qsort_compare_file_info__last_modified(DF_FileInfo *a, DF_FileInfo *b);
|
|
internal int df_qsort_compare_file_info__size(DF_FileInfo *a, DF_FileInfo *b);
|
|
internal int df_qsort_compare_process_info(DF_ProcessInfo *a, DF_ProcessInfo *b);
|
|
internal int df_qsort_compare_cmd_lister__strength(DF_CmdListerItem *a, DF_CmdListerItem *b);
|
|
internal int df_qsort_compare_entity_lister__strength(DF_EntityListerItem *a, DF_EntityListerItem *b);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Command Lister
|
|
|
|
internal DF_CmdListerItemList df_cmd_lister_item_list_from_needle(Arena *arena, String8 needle);
|
|
internal DF_CmdListerItemArray df_cmd_lister_item_array_from_list(Arena *arena, DF_CmdListerItemList list);
|
|
internal void df_cmd_lister_item_array_sort_by_strength__in_place(DF_CmdListerItemArray array);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: System Process Lister
|
|
|
|
internal DF_ProcessInfoList df_process_info_list_from_query(Arena *arena, String8 query);
|
|
internal DF_ProcessInfoArray df_process_info_array_from_list(Arena *arena, DF_ProcessInfoList list);
|
|
internal void df_process_info_array_sort_by_strength__in_place(DF_ProcessInfoArray array);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Entity Lister
|
|
|
|
internal DF_EntityListerItemList df_entity_lister_item_list_from_needle(Arena *arena, DF_EntityKind kind, DF_EntityFlags omit_flags, String8 needle);
|
|
internal DF_EntityListerItemArray df_entity_lister_item_array_from_list(Arena *arena, DF_EntityListerItemList list);
|
|
internal void df_entity_lister_item_array_sort_by_strength__in_place(DF_EntityListerItemArray array);
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Watch Views
|
|
|
|
//- rjf: eval watch view instance -> eval view key
|
|
internal DF_EvalViewKey df_eval_view_key_from_eval_watch_view(DF_WatchViewState *ewv);
|
|
|
|
//- rjf: root allocation/deallocation/mutation
|
|
internal DF_EvalRoot * df_eval_root_alloc(DF_View *view, DF_WatchViewState *ews);
|
|
internal void df_eval_root_release(DF_WatchViewState *ews, DF_EvalRoot *root);
|
|
internal void df_eval_root_equip_string(DF_EvalRoot *root, String8 string);
|
|
internal DF_EvalRoot * df_eval_root_from_string(DF_WatchViewState *ews, String8 string);
|
|
internal DF_EvalRoot * df_eval_root_from_expand_key(DF_WatchViewState *ews, DF_EvalView *eval_view, DF_ExpandKey expand_key);
|
|
internal String8 df_string_from_eval_root(DF_EvalRoot *root);
|
|
internal DF_ExpandKey df_parent_expand_key_from_eval_root(DF_EvalRoot *root);
|
|
internal DF_ExpandKey df_expand_key_from_eval_root(DF_EvalRoot *root);
|
|
|
|
//- rjf: watch view points <-> table coordinates
|
|
internal B32 df_watch_view_point_match(DF_WatchViewPoint a, DF_WatchViewPoint b);
|
|
internal DF_WatchViewPoint df_watch_view_point_from_tbl(DF_EvalVizBlockList *blocks, Vec2S64 tbl);
|
|
internal Vec2S64 df_tbl_from_watch_view_point(DF_EvalVizBlockList *blocks, DF_WatchViewPoint pt);
|
|
|
|
//- rjf: table coordinates -> strings
|
|
internal String8 df_string_from_eval_viz_row_column_kind(Arena *arena, DF_EvalView *ev, TG_Graph *graph, RDI_Parsed *rdi, DF_EvalVizRow *row, DF_WatchViewColumnKind col_kind, B32 editable);
|
|
|
|
//- rjf: table coordinates -> text edit state
|
|
internal DF_WatchViewTextEditState *df_watch_view_text_edit_state_from_pt(DF_WatchViewState *wv, DF_WatchViewPoint pt);
|
|
|
|
//- rjf: windowed watch tree visualization
|
|
internal DF_EvalVizBlockList df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, FZY_Scope *fzy_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_View *view, DF_WatchViewState *ews);
|
|
|
|
//- rjf: eval/watch views main hooks
|
|
internal void df_watch_view_init(DF_WatchViewState *ewv, DF_View *view, DF_WatchViewFillKind fill_kind);
|
|
internal void df_watch_view_cmds(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewState *ewv, DF_CmdList *cmds);
|
|
internal void df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 default_radix, Rng2F32 rect);
|
|
|
|
#endif // DEBUG_FRONTEND_VIEWS_H
|