// Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) #ifndef RADDBG_CORE_H #define RADDBG_CORE_H //////////////////////////////// //~ rjf: Evaluation Spaces typedef U64 RD_EvalSpaceKind; enum { RD_EvalSpaceKind_MetaQuery = D_EvalSpaceKind_FirstUserDefined, RD_EvalSpaceKind_MetaCfg, RD_EvalSpaceKind_MetaCmd, RD_EvalSpaceKind_MetaTheme, RD_EvalSpaceKind_MetaView, RD_EvalSpaceKind_MetaCtrlEntity, RD_EvalSpaceKind_MetaCallStack, RD_EvalSpaceKind_MetaUnattachedProcess, RD_EvalSpaceKind_MetaCallStackTree, }; //////////////////////////////// //~ rjf: View UI Hook Types #define RD_VIEW_UI_FUNCTION_SIG(name) void name(E_Eval eval, Rng2F32 rect) #define RD_VIEW_UI_FUNCTION_NAME(name) rd_view_ui__##name #define RD_VIEW_UI_FUNCTION_DEF(name) internal RD_VIEW_UI_FUNCTION_SIG(RD_VIEW_UI_FUNCTION_NAME(name)) typedef RD_VIEW_UI_FUNCTION_SIG(RD_ViewUIFunctionType); typedef struct RD_ViewUIRule RD_ViewUIRule; struct RD_ViewUIRule { String8 name; RD_ViewUIFunctionType *ui; }; typedef struct RD_ViewUIRuleNode RD_ViewUIRuleNode; struct RD_ViewUIRuleNode { RD_ViewUIRuleNode *next; RD_ViewUIRule v; }; typedef struct RD_ViewUIRuleSlot RD_ViewUIRuleSlot; struct RD_ViewUIRuleSlot { RD_ViewUIRuleNode *first; RD_ViewUIRuleNode *last; }; typedef struct RD_ViewUIRuleMap RD_ViewUIRuleMap; struct RD_ViewUIRuleMap { RD_ViewUIRuleSlot *slots; U64 slots_count; }; //////////////////////////////// //~ rjf: Drag/Drop Types typedef enum RD_DragDropState { RD_DragDropState_Null, RD_DragDropState_Dragging, RD_DragDropState_Dropping, RD_DragDropState_COUNT } RD_DragDropState; //////////////////////////////// //~ rjf: Command Kind Types typedef U32 RD_QueryFlags; enum { RD_QueryFlag_AllowFiles = (1<<0), RD_QueryFlag_AllowFolders = (1<<1), RD_QueryFlag_CodeInput = (1<<2), RD_QueryFlag_KeepOldInput = (1<<3), RD_QueryFlag_SelectOldInput = (1<<4), RD_QueryFlag_Floating = (1<<5), RD_QueryFlag_Required = (1<<6), }; typedef U32 RD_CmdKindFlags; enum { RD_CmdKindFlag_ListInUI = (1<<0), RD_CmdKindFlag_ListInIPCDocs = (1<<1), }; //////////////////////////////// //~ rjf: Autocompletion Cursor Info Type typedef struct RD_AutocompCursorInfo RD_AutocompCursorInfo; struct RD_AutocompCursorInfo { String8 list_expr; String8 filter; Rng1U64 replaced_range; String8 callee_expr; MD_Node *arg_schema; }; //////////////////////////////// //~ rjf: Generated Code #include "generated/raddbg.meta.h" //////////////////////////////// //~ rjf: View State Types typedef struct RD_ArenaExt RD_ArenaExt; struct RD_ArenaExt { RD_ArenaExt *next; Arena *arena; }; typedef struct RD_ViewState RD_ViewState; struct RD_ViewState { // rjf: hash links & key RD_ViewState *hash_next; RD_ViewState *hash_prev; CFG_ID cfg_id; // rjf: touch info U64 last_frame_index_touched; U64 last_frame_index_built; // rjf: loading indicator info F32 loading_t; F32 loading_t_target; U64 loading_progress_v; U64 loading_progress_v_target; // rjf: scroll position UI_ScrollPt2 scroll_pos; // rjf: eval visualization view state EV_View *ev_view; // rjf: view-lifetime allocation & user data extensions Arena *arena; U64 arena_reset_pos; RD_ArenaExt *first_arena_ext; RD_ArenaExt *last_arena_ext; void *user_data; // rjf: query state B32 query_is_open; TxtPt query_cursor; TxtPt query_mark; U8 query_buffer[KB(1)]; U64 query_string_size; // rjf: contents are focused (disables query focus) B32 contents_are_focused; }; typedef struct RD_ViewStateSlot RD_ViewStateSlot; struct RD_ViewStateSlot { RD_ViewState *first; RD_ViewState *last; }; //////////////////////////////// //~ rjf: Vocabulary Map typedef struct RD_VocabInfoMapNode RD_VocabInfoMapNode; struct RD_VocabInfoMapNode { RD_VocabInfoMapNode *single_next; RD_VocabInfoMapNode *plural_next; RD_VocabInfo v; }; typedef struct RD_VocabInfoMapSlot RD_VocabInfoMapSlot; struct RD_VocabInfoMapSlot { RD_VocabInfoMapNode *first; RD_VocabInfoMapNode *last; }; typedef struct RD_VocabInfoMap RD_VocabInfoMap; struct RD_VocabInfoMap { U64 single_slots_count; RD_VocabInfoMapSlot *single_slots; U64 plural_slots_count; RD_VocabInfoMapSlot *plural_slots; }; //////////////////////////////// //~ rjf: Structured Locations, Parsed From Config Trees typedef struct RD_Location RD_Location; struct RD_Location { String8 file_path; TxtPt pt; String8 expr; }; //////////////////////////////// //~ rjf: Command Types typedef struct RD_Cmd RD_Cmd; struct RD_Cmd { String8 name; RD_Regs *regs; }; typedef struct RD_CmdNode RD_CmdNode; struct RD_CmdNode { RD_CmdNode *next; RD_CmdNode *prev; RD_Cmd cmd; }; typedef struct RD_CmdList RD_CmdList; struct RD_CmdList { RD_CmdNode *first; RD_CmdNode *last; U64 count; }; //////////////////////////////// //~ rjf: Context Register Types typedef struct RD_RegsNode RD_RegsNode; struct RD_RegsNode { RD_RegsNode *next; RD_Regs v; }; //////////////////////////////// //~ rjf: Structured Theme Types, Parsed From Config typedef enum RD_FontSlot { RD_FontSlot_Main, RD_FontSlot_Code, RD_FontSlot_Icons, RD_FontSlot_COUNT } RD_FontSlot; //////////////////////////////// //~ rjf: Per-Window State typedef struct RD_DropCompletionTask RD_DropCompletionTask; struct RD_DropCompletionTask { RD_DropCompletionTask *next; B32 exe; B32 dbg; B32 cfg; String8List paths; }; typedef struct RD_WindowState RD_WindowState; struct RD_WindowState { // rjf: links & metadata RD_WindowState *order_next; RD_WindowState *order_prev; RD_WindowState *hash_next; RD_WindowState *hash_prev; CFG_ID cfg_id; U64 frames_alive; U64 last_frame_index_touched; // rjf: top-level info & handles Arena *arena; WM_Window os; R_Handle r; UI_State *ui; F32 last_dpi; B32 window_temporarily_focused_ipc; B32 window_layout_reset; Rng2F32 last_window_rect; // rjf: theme (recomputed each frame) UI_Theme *theme; Vec4F32 theme_code_colors[RD_CodeColorSlot_COUNT]; // rjf: font raster flags (recomputed each frame) FNT_RasterFlags font_slot_raster_flags[RD_FontSlot_COUNT]; // rjf: dev interface state B32 dev_menu_is_open; // rjf: menu bar state B32 menu_bar_focused; B32 menu_bar_focused_on_press; B32 menu_bar_key_held; B32 menu_bar_focus_press_started; // rjf: drop-completion state Arena *drop_completion_arena; CFG_ID drop_completion_panel; RD_DropCompletionTask *top_drop_completion_task; // rjf: query state B32 query_is_active; Arena *query_arena; RD_Regs *query_regs; CFG_ID query_view_id; CFG_ID query_last_view_id; // rjf: hover eval state B32 hover_eval_focused; Arena *hover_eval_arena; Vec2F32 hover_eval_spawn_pos; String8 hover_eval_string; U64 hover_eval_firstt_us; U64 hover_eval_lastt_us; // rjf: autocompletion state U64 autocomp_last_frame_index; Arena *autocomp_arena; RD_Regs *autocomp_regs; RD_AutocompCursorInfo autocomp_cursor_info; // rjf: error state U8 error_buffer[512]; U64 error_string_size; F32 error_t; // rjf: per-frame ui events state UI_EventList ui_events; // rjf: per-frame drawing state DR_Bucket *draw_bucket; }; typedef struct RD_WindowStateSlot RD_WindowStateSlot; struct RD_WindowStateSlot { RD_WindowState *first; RD_WindowState *last; }; //////////////////////////////// //~ rjf: Main Per-Process Graphical State typedef struct RD_LoadedDbgInfoNode RD_LoadedDbgInfoNode; struct RD_LoadedDbgInfoNode { RD_LoadedDbgInfoNode *hash_next; RD_LoadedDbgInfoNode *hash_prev; RD_LoadedDbgInfoNode *lru_next; RD_LoadedDbgInfoNode *lru_prev; DI_Key key; U64 last_tick_idx_touched; }; typedef struct RD_LoadedDbgInfoSlot RD_LoadedDbgInfoSlot; struct RD_LoadedDbgInfoSlot { RD_LoadedDbgInfoNode *first; RD_LoadedDbgInfoNode *last; }; typedef struct RD_AmbiguousPathNode RD_AmbiguousPathNode; struct RD_AmbiguousPathNode { RD_AmbiguousPathNode *next; String8 name; String8List paths; }; typedef struct RD_State RD_State; struct RD_State { // rjf: basics Arena *arena; B32 quit; B32 quit_after_success; B32 override_focus_on_stop; S32 frame_depth; U64 frame_eval_memread_endt_us; // rjf: update checker B32 got_update_check; B32 newer_update_available; Arena *update_check_arena; String8List update_check_response_body_pieces; GuardedRing *update_check_http_ring; // rjf: config bucket paths Arena *user_path_arena; String8 user_path; Arena *project_path_arena; String8 project_path; Arena *theme_path_arena; String8 theme_path; // rjf: unpacked settings (cached, because they need to be used // earlier than setting evaluation is legal in a frame) B32 alt_menu_bar_enabled; B32 use_default_stl_type_views; B32 use_default_ue_type_views; B32 auto_download_debug_info; EV_StringFlags eval_viz_base_string_flags; // rjf: animation rates F32 catchall_animation_rate; F32 menu_animation_rate; F32 menu_animation_rate__slow; F32 entity_alive_animation_rate; F32 rich_hover_animation_rate; F32 scrolling_animation_rate; F32 tooltip_animation_rate; // rjf: serialized config debug string keys C_Key user_cfg_string_key; C_Key project_cfg_string_key; C_Key cmdln_cfg_string_key; C_Key transient_cfg_string_key; // rjf: default theme table MD_Node *theme_preset_trees[RD_ThemePreset_COUNT]; // rjf: vocab table RD_VocabInfoMap vocab_info_map; // rjf: log Log *log; String8 log_path; // rjf: frame history info U64 frame_index; Arena *frame_arenas[2]; U64 frame_time_us_history[64]; U64 num_frames_requested; F64 time_in_seconds; U64 time_in_us; // rjf: frame parameters F32 frame_dt; Access *frame_access; String8 last_window_title; // rjf: evaluation caches E_Cache *eval_cache; // rjf: ambiguous path table (constructed from-scratch each frame) U64 ambiguous_path_slots_count; RD_AmbiguousPathNode **ambiguous_path_slots; // rjf: key map (constructed from-scratch each frame) CFG_KeyMap *key_map; // rjf: slot -> font tag map (constructed from-scratch each frame) FNT_Tag font_slot_table[RD_FontSlot_COUNT]; // rjf: meta name -> eval type key map (constructed from-scratch each frame) E_String2TypeKeyMap *meta_name2type_map; // rjf: name -> view ui map (constructed from-scratch each frame) RD_ViewUIRuleMap *view_ui_rule_map; // rjf: registers stack RD_RegsNode base_regs; RD_RegsNode *top_regs; // rjf: autosave state F32 seconds_until_autosave; // rjf: commands Arena *cmds_arenas[2]; RD_CmdList cmds[2]; U64 cmds_gen; Arena *cmd_output_arena; String8List cmd_outputs; // rjf: popup state UI_Key popup_key; B32 popup_active; F32 popup_t; Arena *popup_arena; RD_CmdList popup_cmds; String8 popup_title; String8 popup_desc; // rjf: text editing mode state B32 text_edit_mode; // rjf: contextual hover info RD_Regs *hover_regs; RD_RegSlot hover_regs_slot; RD_Regs *next_hover_regs; RD_RegSlot next_hover_regs_slot; // rjf: autos-determining code range // // NOTE(rjf): this includes only instructions that we've observed the // selected thread passed. autos are *also* computed from disassembling // the line at which any thread sits, but we only want to collect autos // from larger ranges of instructions when we directly observer this // on a particular selected thread within a single function. // D_Handle last_stop_selected_thread; U64 last_stop_selected_thread_ip; U64 last_stop_selected_thread_sp; Rng1U64 autos_determining_vaddr_range; // rjf: icon texture R_Handle icon_texture; // rjf: fixed ui keys UI_Key drop_completion_key; UI_Key ctx_menu_key; // rjf: drag/drop state Arena *drag_drop_arena; RD_Regs *drag_drop_regs; RD_RegSlot drag_drop_regs_slot; RD_DragDropState drag_drop_state; // rjf: cfg state CFG_State *cfg; CFG_SchemaTable *cfg_schema_table; // rjf: loaded debug info cache U64 loaded_dbg_info_slots_count; RD_LoadedDbgInfoSlot *loaded_dbg_info_slots; RD_LoadedDbgInfoNode *loaded_dbg_info_lru_first; RD_LoadedDbgInfoNode *loaded_dbg_info_lru_last; RD_LoadedDbgInfoNode *free_loaded_dbg_info_node; // rjf: window state cache U64 window_state_slots_count; RD_WindowStateSlot *window_state_slots; RD_WindowState *free_window_state; CFG_ID last_focused_window; RD_WindowState *first_window_state; RD_WindowState *last_window_state; CFG_ID window_state_last_accessed_id; RD_WindowState *window_state_last_accessed; // rjf: view state cache U64 view_state_slots_count; RD_ViewStateSlot *view_state_slots; RD_ViewState *free_view_state; CFG_ID view_state_last_accessed_id; RD_ViewState *view_state_last_accessed; // rjf: bind change Arena *bind_change_arena; B32 bind_change_active; CFG_ID bind_change_binding_id; String8 bind_change_cmd_name; // rjf: pre-stop focused window WM_ExtWindow prestop_focused_window; }; //////////////////////////////// //~ rjf: Globals read_only global RD_VocabInfo rd_nil_vocab_info = {0}; read_only global RD_CmdKindInfo rd_nil_cmd_kind_info = {0}; RD_VIEW_UI_FUNCTION_DEF(null); read_only global RD_ViewUIRule rd_nil_view_ui_rule = { {0}, RD_VIEW_UI_FUNCTION_NAME(null), }; read_only global RD_ViewState rd_nil_view_state = { &rd_nil_view_state, &rd_nil_view_state, }; read_only global RD_WindowState rd_nil_window_state = { &rd_nil_window_state, &rd_nil_window_state, &rd_nil_window_state, &rd_nil_window_state, }; global RD_State *rd_state = 0; global CFG_ID rd_last_drag_drop_panel = 0; global CFG_ID rd_last_drag_drop_prev_tab = 0; //////////////////////////////// //~ rjf: Registers Type Functions internal void rd_regs_copy_contents(Arena *arena, RD_Regs *dst, RD_Regs *src); internal RD_Regs *rd_regs_copy(Arena *arena, RD_Regs *src); //////////////////////////////// //~ rjf: Commands Type Functions internal void rd_cmd_list_push_new(Arena *arena, RD_CmdList *cmds, String8 name, RD_Regs *regs); //////////////////////////////// //~ rjf: View UI Rule Functions internal RD_ViewUIRuleMap *rd_view_ui_rule_map_make(Arena *arena, U64 slots_count); internal void rd_view_ui_rule_map_insert(Arena *arena, RD_ViewUIRuleMap *map, String8 string, RD_ViewUIFunctionType *ui); internal RD_ViewUIRule *rd_view_ui_rule_from_string(String8 string); //////////////////////////////// //~ rjf: Global Cross-Window UI Interaction State Functions internal B32 rd_drag_is_active(void); internal void rd_drag_begin(RD_RegSlot slot); internal B32 rd_drag_drop(void); internal void rd_drag_kill(void); internal void rd_set_hover_regs(RD_RegSlot slot); internal RD_Regs *rd_get_hover_regs(void); //////////////////////////////// //~ rjf: Config Functions internal B32 rd_cfg_is_project_filtered(CFG_Node *cfg); internal Vec4F32 rd_hsva_from_cfg(CFG_Node *cfg); internal Vec4F32 rd_color_from_cfg(CFG_Node *cfg); internal B32 rd_disabled_from_cfg(CFG_Node *cfg); internal RD_Location rd_location_from_cfg(CFG_Node *cfg); internal String8 rd_name_from_cfg(CFG_Node *cfg); internal String8 rd_label_from_cfg(CFG_Node *cfg); internal String8 rd_expr_from_cfg(CFG_Node *cfg); internal String8 rd_path_from_cfg(CFG_Node *cfg); internal D_Target rd_target_from_cfg(Arena *arena, CFG_Node *cfg); internal String8 rd_default_setting_from_names(String8 schema_name, String8 setting_name); internal String8 rd_setting_from_name(String8 name); internal B32 rd_setting_b32_from_name(String8 name); internal U64 rd_setting_u64_from_name(String8 name); internal F32 rd_setting_f32_from_name(String8 name); internal CFG_Node *rd_immediate_cfg_from_key(String8 string); internal CFG_Node *rd_immediate_cfg_from_keyf(char *fmt, ...); internal String8 rd_mapped_from_file_path(Arena *arena, String8 file_path); internal String8List rd_possible_overrides_from_file_path(Arena *arena, String8 file_path); //////////////////////////////// //~ rjf: Control Entity Info Extraction internal Vec4F32 rd_color_from_ctrl_entity(D_Entity *entity); internal String8 rd_name_from_ctrl_entity(Arena *arena, D_Entity *entity); //////////////////////////////// //~ rjf: Evaluation Spaces //- rjf: cfg <-> eval space internal CFG_Node *rd_cfg_from_eval_space(E_Space space); internal E_Space rd_eval_space_from_cfg(CFG_Node *cfg); //- rjf: ctrl entity <-> eval space internal D_Entity *rd_ctrl_entity_from_eval_space(E_Space space); internal E_Space rd_eval_space_from_ctrl_entity(D_Entity *entity, E_SpaceKind kind); //- rjf: command name <-> eval space internal String8 rd_cmd_name_from_eval(E_Eval eval); //- rjf: eval space reads/writes internal U64 rd_eval_space_gen(E_Space space); internal B32 rd_eval_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_info, Rng1U64 range); internal B32 rd_eval_space_write(E_Space space, void *in, Rng1U64 range); //- rjf: asynchronous streamed reads -> hashes from spaces internal C_Key rd_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated); //- rjf: space -> entire range internal Rng1U64 rd_whole_range_from_eval_space(E_Space space); //////////////////////////////// //~ rjf: Evaluation Visualization //- rjf: writing values back to child processes internal B32 rd_commit_eval_value_string(E_Eval dst_eval, String8 string); //- rjf: eval <-> file path internal String8 rd_file_path_from_eval(Arena *arena, E_Eval eval); internal String8 rd_file_path_from_eval_string(Arena *arena, String8 string); internal String8 rd_eval_string_from_file_path(Arena *arena, String8 string); //- rjf: eval -> query internal String8 rd_query_from_eval_string(Arena *arena, String8 string); //////////////////////////////// //~ rjf: View Functions internal CFG_Node *rd_view_from_eval(CFG_Node *parent, E_Eval eval); internal RD_ViewState *rd_view_state_from_cfg(CFG_Node *cfg); internal void rd_view_ui(Rng2F32 rect); //////////////////////////////// //~ rjf: View Building API //- rjf: view info extraction internal Arena *rd_view_arena(void); internal UI_ScrollPt2 rd_view_scroll_pos(void); internal EV_View *rd_view_eval_view(void); internal String8 rd_view_query_cmd(void); internal String8 rd_view_query_input(void); internal String8 rd_view_setting_from_name(String8 string); internal E_Value rd_view_setting_value_from_name(String8 string); internal B32 rd_view_setting_b32_from_name(String8 string); internal U64 rd_view_setting_u64_from_name(String8 string); internal F32 rd_view_setting_f32_from_name(String8 string); internal U64 rd_view_setting_addr_from_name(String8 string); //- rjf: evaluation & tag (a view's 'call') parameter extraction internal Rng1U64 rd_space_range_from_eval(E_Eval eval); internal TXT_LangKind rd_lang_kind_from_eval(E_Eval eval); internal Arch rd_arch_from_eval(E_Eval eval); //- rjf: pushing/attaching view resources internal void *rd_view_state_by_size(U64 size); #define rd_view_state(T) (T *)rd_view_state_by_size(sizeof(T)) internal Arena *rd_push_view_arena(void); //- rjf: storing view-attached state internal void rd_store_view_expr_string(String8 string); internal void rd_store_view_loading_info(B32 is_loading, U64 progress_u64, U64 progress_u64_target); internal void rd_store_view_scroll_pos(UI_ScrollPt2 pos); internal void rd_store_view_param(String8 key, String8 value); internal void rd_store_view_paramf(String8 key, char *fmt, ...); #define rd_store_view_param_f32(key, f32) rd_store_view_paramf((key), "%ff", (f32)) #define rd_store_view_param_s64(key, s64) rd_store_view_paramf((key), "%I64d", (s64)) #define rd_store_view_param_u64(key, u64) rd_store_view_paramf((key), "0x%I64x", (u64)) //////////////////////////////// //~ rjf: Window Functions internal String8 rd_push_window_title(Arena *arena); internal CFG_Node *rd_window_from_cfg(CFG_Node *cfg); internal RD_WindowState *rd_window_state_from_cfg(CFG_Node *cfg); internal RD_WindowState *rd_window_state_from_os_handle(WM_Window os); internal void rd_window_frame(void); //////////////////////////////// //~ rjf: Eval Visualization internal String8 rd_value_string_from_eval(Arena *arena, String8 filter, EV_StringParams *params, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval); //////////////////////////////// //~ rjf: Hover Eval internal void rd_set_hover_eval(Vec2F32 pos, String8 string); //////////////////////////////// //~ rjf: Autocompletion Lister internal void rd_set_autocomp_regs_(E_Eval dst_eval, RD_Regs *regs); #define rd_set_autocomp_regs(dst_eval, ...) rd_set_autocomp_regs_((dst_eval), &(RD_Regs){rd_regs_lit_init_top __VA_ARGS__}) //////////////////////////////// //~ rjf: Colors, Fonts, Config //- rjf: colors internal MD_Node *rd_theme_tree_from_name(Arena *arena, Access *access, String8 theme_name); internal Vec4F32 rd_rgba_from_code_color_slot(RD_CodeColorSlot slot); internal RD_CodeColorSlot rd_code_color_slot_from_txt_token_kind(TXT_TokenKind kind); internal RD_CodeColorSlot rd_code_color_slot_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 string, B32 allow_macros, B32 is_called); //- rjf: fonts internal F32 rd_font_size(void); internal FNT_Tag rd_font_from_slot(RD_FontSlot slot); internal FNT_RasterFlags rd_raster_flags_from_slot(RD_FontSlot slot); //////////////////////////////// //~ rjf: Process Control Info Stringification internal String8 rd_string_from_exception_code(U32 code); internal DR_FStrList rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, D_Event *event); //////////////////////////////// //~ rjf: Source File Checksum Calculations internal AC_Artifact rd_md5_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out); internal AC_Artifact rd_sha1_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out); internal AC_Artifact rd_sha256_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out); internal MD5 rd_md5_from_hash(U128 hash); internal SHA1 rd_sha1_from_hash(U128 hash); internal SHA256 rd_sha256_from_hash(U128 hash); internal String8 rd_checksum_value_from_hash_kind(Arena *arena, U128 hash, RDI_ChecksumKind k); //////////////////////////////// //~ rjf: Vocab Info Lookups internal RD_VocabInfo *rd_vocab_info_from_code_name(String8 code_name); internal RD_VocabInfo *rd_vocab_info_from_code_name_plural(String8 code_name_plural); #define rd_plural_from_code_name(code_name) (rd_vocab_info_from_code_name(code_name)->code_name_plural) #define rd_display_from_code_name(code_name) (rd_vocab_info_from_code_name(code_name)->display_name) #define rd_display_plural_from_code_name(code_name) (rd_vocab_info_from_code_name(code_name)->display_name_plural) #define rd_icon_kind_from_code_name(code_name) (rd_vocab_info_from_code_name(code_name)->icon_kind) #define rd_singular_from_code_name_plural(code_name_plural) (rd_vocab_info_from_code_name_plural(code_name_plural)->code_name) //////////////////////////////// //~ rjf: Auto Watch Computation internal String8Array rd_gather_auto_exprs(Arena *arena); //////////////////////////////// //~ rjf: Continuous Frame Requests internal void rd_request_frame(void); //////////////////////////////// //~ rjf: Main State Accessors //- rjf: per-frame arena internal Arena *rd_frame_arena(void); //////////////////////////////// //~ rjf: Registers #define rd_regs() (&rd_state->top_regs->v) #define rd_base_regs() (&rd_state->base_regs.v) internal RD_Regs *rd_push_regs_(RD_Regs *regs); #define rd_push_regs(...) rd_push_regs_(&(RD_Regs){rd_regs_lit_init_top __VA_ARGS__}) internal RD_Regs *rd_pop_regs(void); #define RD_RegsScope(...) DeferLoop(rd_push_regs(__VA_ARGS__), rd_pop_regs()) internal void rd_regs_fill_slot_from_string(RD_RegSlot slot, String8 query_expr, String8 string); internal RD_RegSlot rd_regs_fill_slot_from_ctx_eval(E_Eval eval); //////////////////////////////// //~ rjf: Commands //- rjf: name -> info internal RD_CmdKind rd_cmd_kind_from_string(String8 string); internal RD_CmdKindInfo *rd_cmd_kind_info_from_string(String8 string); //- rjf: pushing internal void rd_push_cmd(String8 name, RD_Regs *regs); #define rd_cmd(kind, ...) rd_push_cmd(rd_cmd_kind_info_table[kind].string, &(RD_Regs){rd_regs_lit_init_top __VA_ARGS__}) //- rjf: iterating internal B32 rd_next_cmd(RD_Cmd **cmd); internal B32 rd_next_view_cmd(RD_Cmd **cmd); //////////////////////////////// //~ rjf: Main Layer Top-Level Calls internal void rd_init(CmdLine *cmdln); internal void rd_frame(void); #endif // RADDBG_CORE_H