mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-13 07:32:23 -07:00
upgrade textual command -> cmd-regs-filling path, to use expression evaluation when possible, and to use fuzzy filtering over associated query lists when possible
This commit is contained in:
@@ -60,7 +60,7 @@ str8_lit_comp(""),
|
||||
str8_lit_comp(""),
|
||||
};
|
||||
|
||||
RD_VocabInfo rd_vocab_info_table[345] =
|
||||
RD_VocabInfo rd_vocab_info_table[346] =
|
||||
{
|
||||
{str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars},
|
||||
{str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline},
|
||||
@@ -205,6 +205,7 @@ RD_VocabInfo rd_vocab_info_table[345] =
|
||||
{str8_lit_comp("exit"), str8_lit_comp(""), str8_lit_comp("Exit"), str8_lit_comp(""), RD_IconKind_X},
|
||||
{str8_lit_comp("open_palette"), str8_lit_comp(""), str8_lit_comp("Open Palette"), str8_lit_comp(""), RD_IconKind_List},
|
||||
{str8_lit_comp("run_command"), str8_lit_comp(""), str8_lit_comp("Run Command"), str8_lit_comp(""), RD_IconKind_Null},
|
||||
{str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp("Run External Driver Text Command"), str8_lit_comp(""), RD_IconKind_Null},
|
||||
{str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp("OS Event"), str8_lit_comp(""), RD_IconKind_Null},
|
||||
{str8_lit_comp("select_thread"), str8_lit_comp(""), str8_lit_comp("Select Thread"), str8_lit_comp(""), RD_IconKind_Thread},
|
||||
{str8_lit_comp("select_unwind"), str8_lit_comp(""), str8_lit_comp("Select Unwind"), str8_lit_comp(""), RD_IconKind_Null},
|
||||
@@ -437,7 +438,58 @@ RD_NameSchemaInfo rd_name_schema_info_table[24] =
|
||||
{str8_lit_comp("thread"), str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':query}")},
|
||||
};
|
||||
|
||||
Rng1U64 rd_reg_slot_range_table[48] =
|
||||
String8 rd_reg_slot_code_name_table[47] =
|
||||
{
|
||||
{0},
|
||||
str8_lit_comp("machine"),
|
||||
str8_lit_comp("module"),
|
||||
str8_lit_comp("process"),
|
||||
str8_lit_comp("thread"),
|
||||
str8_lit_comp("ctrl_entity"),
|
||||
str8_lit_comp("window"),
|
||||
str8_lit_comp("panel"),
|
||||
str8_lit_comp("tab"),
|
||||
str8_lit_comp("view"),
|
||||
str8_lit_comp("prev_tab"),
|
||||
str8_lit_comp("dst_panel"),
|
||||
str8_lit_comp("cfg"),
|
||||
str8_lit_comp("cfg_list"),
|
||||
str8_lit_comp("eval_space"),
|
||||
str8_lit_comp("unwind_count"),
|
||||
str8_lit_comp("inline_depth"),
|
||||
str8_lit_comp("file_path"),
|
||||
str8_lit_comp("cursor"),
|
||||
str8_lit_comp("mark"),
|
||||
str8_lit_comp("text_key"),
|
||||
str8_lit_comp("lang_kind"),
|
||||
str8_lit_comp("lines"),
|
||||
str8_lit_comp("dbgi_key"),
|
||||
str8_lit_comp("vaddr"),
|
||||
str8_lit_comp("voff"),
|
||||
str8_lit_comp("vaddr_range"),
|
||||
str8_lit_comp("voff_range"),
|
||||
str8_lit_comp("expr"),
|
||||
str8_lit_comp("ui_key"),
|
||||
str8_lit_comp("src_ui_key"),
|
||||
str8_lit_comp("off_px"),
|
||||
str8_lit_comp("reg_slot"),
|
||||
str8_lit_comp("pid"),
|
||||
str8_lit_comp("force_confirm"),
|
||||
str8_lit_comp("force_focus"),
|
||||
str8_lit_comp("prefer_disasm"),
|
||||
str8_lit_comp("no_rich_tooltip"),
|
||||
str8_lit_comp("do_implicit_root"),
|
||||
str8_lit_comp("do_lister"),
|
||||
str8_lit_comp("do_big_rows"),
|
||||
str8_lit_comp("all_windows"),
|
||||
str8_lit_comp("non_graphical"),
|
||||
str8_lit_comp("dir2"),
|
||||
str8_lit_comp("string"),
|
||||
str8_lit_comp("cmd_name"),
|
||||
str8_lit_comp("os_event"),
|
||||
};
|
||||
|
||||
Rng1U64 rd_reg_slot_range_table[47] =
|
||||
{
|
||||
{0},
|
||||
{OffsetOf(RD_Regs, machine), OffsetOf(RD_Regs, machine) + sizeof(CTRL_Handle)},
|
||||
@@ -485,11 +537,10 @@ Rng1U64 rd_reg_slot_range_table[48] =
|
||||
{OffsetOf(RD_Regs, dir2), OffsetOf(RD_Regs, dir2) + sizeof(Dir2)},
|
||||
{OffsetOf(RD_Regs, string), OffsetOf(RD_Regs, string) + sizeof(String8)},
|
||||
{OffsetOf(RD_Regs, cmd_name), OffsetOf(RD_Regs, cmd_name) + sizeof(String8)},
|
||||
{OffsetOf(RD_Regs, params_tree), OffsetOf(RD_Regs, params_tree) + sizeof(MD_Node *)},
|
||||
{OffsetOf(RD_Regs, os_event), OffsetOf(RD_Regs, os_event) + sizeof(OS_Event *)},
|
||||
};
|
||||
|
||||
RD_CmdKindInfo rd_cmd_kind_info_table[238] =
|
||||
RD_CmdKindInfo rd_cmd_kind_info_table[239] =
|
||||
{
|
||||
{0},
|
||||
{ str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), CTRL_EntityKind_Null}},
|
||||
@@ -527,6 +578,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[238] =
|
||||
{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}},
|
||||
{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}},
|
||||
{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), CTRL_EntityKind_Null}},
|
||||
{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}},
|
||||
{ str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}},
|
||||
{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), CTRL_EntityKind_Thread}},
|
||||
{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), CTRL_EntityKind_Null}},
|
||||
|
||||
@@ -54,7 +54,6 @@ RD_RegSlot_NonGraphical,
|
||||
RD_RegSlot_Dir2,
|
||||
RD_RegSlot_String,
|
||||
RD_RegSlot_CmdName,
|
||||
RD_RegSlot_ParamsTree,
|
||||
RD_RegSlot_OSEvent,
|
||||
RD_RegSlot_COUNT,
|
||||
} RD_RegSlot;
|
||||
@@ -97,6 +96,7 @@ RD_CmdKind_Attach,
|
||||
RD_CmdKind_Exit,
|
||||
RD_CmdKind_OpenPalette,
|
||||
RD_CmdKind_RunCommand,
|
||||
RD_CmdKind_RunExternalDriverTextCommand,
|
||||
RD_CmdKind_OSEvent,
|
||||
RD_CmdKind_SelectThread,
|
||||
RD_CmdKind_SelectUnwind,
|
||||
@@ -483,7 +483,6 @@ B32 non_graphical;
|
||||
Dir2 dir2;
|
||||
String8 string;
|
||||
String8 cmd_name;
|
||||
MD_Node * params_tree;
|
||||
OS_Event * os_event;
|
||||
};
|
||||
|
||||
@@ -581,15 +580,15 @@ Z(getting_started)\
|
||||
.dir2 = rd_regs()->dir2,\
|
||||
.string = rd_regs()->string,\
|
||||
.cmd_name = rd_regs()->cmd_name,\
|
||||
.params_tree = rd_regs()->params_tree,\
|
||||
.os_event = rd_regs()->os_event,\
|
||||
|
||||
C_LINKAGE_BEGIN
|
||||
extern String8 rd_tab_fast_path_view_name_table[24];
|
||||
extern String8 rd_tab_fast_path_query_name_table[24];
|
||||
extern RD_VocabInfo rd_vocab_info_table[345];
|
||||
extern RD_VocabInfo rd_vocab_info_table[346];
|
||||
extern RD_NameSchemaInfo rd_name_schema_info_table[24];
|
||||
extern Rng1U64 rd_reg_slot_range_table[48];
|
||||
extern String8 rd_reg_slot_code_name_table[47];
|
||||
extern Rng1U64 rd_reg_slot_range_table[47];
|
||||
extern String8 rd_binding_version_remap_old_name_table[8];
|
||||
extern String8 rd_binding_version_remap_new_name_table[8];
|
||||
extern String8 rd_icon_kind_text_table[75];
|
||||
|
||||
@@ -753,7 +753,6 @@ RD_RegTable:
|
||||
{Dir2 dir2 Dir2 }
|
||||
{String8 string String }
|
||||
{String8 cmd_name CmdName }
|
||||
{`MD_Node *` params_tree ParamsTree }
|
||||
{`OS_Event *` os_event OSEvent }
|
||||
}
|
||||
|
||||
@@ -769,6 +768,12 @@ RD_RegTable:
|
||||
@expand(RD_RegTable a) `$(a.c_type) $(a.name_lower)`
|
||||
}
|
||||
|
||||
@data(String8) rd_reg_slot_code_name_table:
|
||||
{
|
||||
`{0}`,
|
||||
@expand(RD_RegTable a) `str8_lit_comp("$(a.name_lower)")`
|
||||
}
|
||||
|
||||
@data(Rng1U64) rd_reg_slot_range_table:
|
||||
{
|
||||
`{0}`,
|
||||
@@ -796,8 +801,9 @@ RD_CmdTable: // | | | |
|
||||
//- rjf: palette
|
||||
{OpenPalette 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" }
|
||||
|
||||
//- rjf: command runner
|
||||
//- rjf: command runners
|
||||
{RunCommand 1 1 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" }
|
||||
{RunExternalDriverTextCommand 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 1 1 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" }
|
||||
|
||||
//- rjf: os event passthrough
|
||||
{OSEvent 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "os_event" "OS Event" "" "" "" }
|
||||
|
||||
+125
-39
@@ -46,7 +46,6 @@ rd_regs_copy_contents(Arena *arena, RD_Regs *dst, RD_Regs *src)
|
||||
dst->expr = push_str8_copy(arena, src->expr);
|
||||
dst->string = push_str8_copy(arena, src->string);
|
||||
dst->cmd_name = push_str8_copy(arena, src->cmd_name);
|
||||
dst->params_tree = md_tree_copy(arena, src->params_tree);
|
||||
if(dst->cfg_list.count == 0 && dst->cfg != 0)
|
||||
{
|
||||
rd_cfg_id_list_push(arena, &dst->cfg_list, dst->cfg);
|
||||
@@ -5518,7 +5517,7 @@ rd_view_ui(Rng2F32 rect)
|
||||
RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name);
|
||||
RD_RegsScope()
|
||||
{
|
||||
rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, input);
|
||||
rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, str8_zero(), input);
|
||||
rd_cmd(RD_CmdKind_CompleteQuery);
|
||||
}
|
||||
}
|
||||
@@ -10591,12 +10590,15 @@ rd_pop_regs(void)
|
||||
}
|
||||
|
||||
internal void
|
||||
rd_regs_fill_slot_from_string(RD_RegSlot slot, String8 string)
|
||||
rd_regs_fill_slot_from_string(RD_RegSlot slot, String8 query_expr, String8 string)
|
||||
{
|
||||
String8 error = {0};
|
||||
switch(slot)
|
||||
{
|
||||
//- rjf: basic string cases
|
||||
default:
|
||||
{
|
||||
rd_regs()->string = push_str8_copy(rd_frame_arena(), string);
|
||||
}break;
|
||||
case RD_RegSlot_String:
|
||||
case RD_RegSlot_FilePath:
|
||||
{
|
||||
@@ -10611,28 +10613,95 @@ rd_regs_fill_slot_from_string(RD_RegSlot slot, String8 string)
|
||||
rd_regs()->cursor = pair.pt;
|
||||
}
|
||||
}break;
|
||||
case RD_RegSlot_Cfg:
|
||||
if(str8_match(str8_prefix(string, 1), str8_lit("$"), 0))
|
||||
{
|
||||
String8 numeric_part = str8_skip(string, 1);
|
||||
RD_CfgID id = u64_from_str8(numeric_part, 16);
|
||||
rd_regs()->cfg = id;
|
||||
}break;
|
||||
case RD_RegSlot_Expr:
|
||||
{
|
||||
rd_regs()->expr = push_str8_copy(rd_frame_arena(), string);
|
||||
}break;
|
||||
case RD_RegSlot_CmdName:
|
||||
{
|
||||
rd_regs()->cmd_name = push_str8_copy(rd_frame_arena(), string);
|
||||
}break;
|
||||
|
||||
//- rjf: ctrl entities
|
||||
case RD_RegSlot_Machine:
|
||||
case RD_RegSlot_Module:
|
||||
case RD_RegSlot_Process:
|
||||
case RD_RegSlot_Thread:
|
||||
case RD_RegSlot_CtrlEntity:
|
||||
{
|
||||
|
||||
}break;
|
||||
|
||||
//- rjf: cfgs
|
||||
case RD_RegSlot_Cfg:
|
||||
case RD_RegSlot_Window:
|
||||
case RD_RegSlot_Panel:
|
||||
case RD_RegSlot_Tab:
|
||||
case RD_RegSlot_View:
|
||||
case RD_RegSlot_PrevTab:
|
||||
case RD_RegSlot_DstPanel:
|
||||
{
|
||||
B32 good = 0;
|
||||
if(!good && str8_match(str8_prefix(string, 1), str8_lit("$"), 0))
|
||||
{
|
||||
String8 numeric_part = str8_skip(string, 1);
|
||||
RD_CfgID id = u64_from_str8(numeric_part, 16);
|
||||
rd_regs()->cfg = id;
|
||||
good = 1;
|
||||
}
|
||||
if(!good && query_expr.size != 0)
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
RD_Cfg *immediate = rd_immediate_cfg_from_keyf("###regs_fill_slot_view");
|
||||
RD_Cfg *view = rd_cfg_newf(immediate, "watch");
|
||||
rd_cfg_newf(view, "lister");
|
||||
RD_ViewState *vs = rd_view_state_from_cfg(view);
|
||||
EV_View *eval_view = vs->ev_view;
|
||||
{
|
||||
ev_key_set_expansion(eval_view, ev_key_root(), ev_key_make(ev_hash_from_key(ev_key_root()), 1), 1);
|
||||
E_Eval eval = e_eval_from_string(query_expr);
|
||||
EV_BlockTree block_tree = {0};
|
||||
EV_BlockRangeList block_ranges = {0};
|
||||
// TODO(rjf): @cleanup we only need to do this because we implicitly use
|
||||
// view info in the block tree build via raddbg-layer eval hooks, but we
|
||||
// should really keep all parameterization info in eval views themselves,
|
||||
// to not couple block tree building with frontend state...
|
||||
RD_RegsScope(.window = 0, .panel = 0, .view = view->id)
|
||||
{
|
||||
block_tree = ev_block_tree_from_eval(scratch.arena, eval_view, string, eval);
|
||||
block_ranges = ev_block_range_list_from_tree(scratch.arena, &block_tree);
|
||||
if(block_ranges.first != 0)
|
||||
{
|
||||
block_ranges.count -= 1;
|
||||
block_ranges.first = block_ranges.first->next;
|
||||
}
|
||||
}
|
||||
EV_Row *row = ev_row_from_num(scratch.arena, eval_view, &block_ranges, 1);
|
||||
rd_regs()->cfg = rd_cfg_from_eval_space(row->eval.space)->id;
|
||||
good = (rd_regs()->cfg != 0);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}
|
||||
if(!good)
|
||||
{
|
||||
E_Eval eval = e_eval_from_string(string);
|
||||
rd_regs()->cfg = rd_cfg_from_eval_space(eval.space)->id;
|
||||
good = (rd_regs()->cfg != 0);
|
||||
}
|
||||
}break;
|
||||
|
||||
//- rjf: line numbers
|
||||
case RD_RegSlot_Cursor:
|
||||
{
|
||||
U64 v = 0;
|
||||
if(try_u64_from_str8_c_rules(string, &v))
|
||||
E_Eval eval = e_value_eval_from_eval(e_eval_from_string(string));
|
||||
if(eval.msgs.max_kind == E_MsgKind_Null)
|
||||
{
|
||||
rd_regs()->cursor.column = 1;
|
||||
rd_regs()->cursor.line = v;
|
||||
rd_regs()->cursor.line = (S64)eval.value.u64;
|
||||
}
|
||||
else
|
||||
{
|
||||
log_user_error(str8_lit("Couldn't interpret as a line number."));
|
||||
log_user_errorf("Couldn't interpret \"`%S`\" as a line number.", string);
|
||||
}
|
||||
}break;
|
||||
case RD_RegSlot_Vaddr: goto use_numeric_eval;
|
||||
@@ -10653,30 +10722,7 @@ rd_regs_fill_slot_from_string(RD_RegSlot slot, String8 string)
|
||||
eval = e_value_eval_from_eval(eval);
|
||||
}
|
||||
U64 u64 = eval.value.u64;
|
||||
switch(slot)
|
||||
{
|
||||
default:{}break;
|
||||
case RD_RegSlot_Vaddr:
|
||||
{
|
||||
rd_regs()->vaddr = u64;
|
||||
}break;
|
||||
case RD_RegSlot_Voff:
|
||||
{
|
||||
rd_regs()->voff = u64;
|
||||
}break;
|
||||
case RD_RegSlot_UnwindCount:
|
||||
{
|
||||
rd_regs()->unwind_count = u64;
|
||||
}break;
|
||||
case RD_RegSlot_InlineDepth:
|
||||
{
|
||||
rd_regs()->inline_depth = u64;
|
||||
}break;
|
||||
case RD_RegSlot_PID:
|
||||
{
|
||||
rd_regs()->pid = u64;
|
||||
}break;
|
||||
}
|
||||
MemoryCopy((U8 *)(rd_regs()) + rd_reg_slot_range_table[slot].min, &u64, dim_1u64(rd_reg_slot_range_table[slot]));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -12721,6 +12767,46 @@ rd_frame(void)
|
||||
}
|
||||
}break;
|
||||
|
||||
//- rjf: external driver textual commands
|
||||
case RD_CmdKind_RunExternalDriverTextCommand:
|
||||
{
|
||||
String8 msg = rd_regs()->string;
|
||||
String8List msg_parts = str8_split(scratch.arena, msg, (U8 *)" ", 1, 0);
|
||||
CmdLine msg_cmd_line = cmd_line_from_string_list(scratch.arena, msg_parts);
|
||||
String8 cmd_kind_name = str8_list_first(&msg_cmd_line.inputs);
|
||||
RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_kind_name);
|
||||
if(cmd_kind_info != &rd_nil_cmd_kind_info) RD_RegsScope()
|
||||
{
|
||||
for EachNonZeroEnumVal(RD_RegSlot, s)
|
||||
{
|
||||
String8 reg_slot_name = rd_reg_slot_code_name_table[s];
|
||||
String8 value = cmd_line_string(&msg_cmd_line, reg_slot_name);
|
||||
if(value.size != 0)
|
||||
{
|
||||
rd_regs_fill_slot_from_string(s, cmd_kind_info->query.expr, value);
|
||||
}
|
||||
}
|
||||
String8 primary_args_string = {0};
|
||||
if(msg_cmd_line.inputs.first != 0)
|
||||
{
|
||||
String8List primary_args_strings = {0};
|
||||
for(String8Node *n = msg_cmd_line.inputs.first->next; n != 0; n = n->next)
|
||||
{
|
||||
str8_list_push(scratch.arena, &primary_args_strings, n->string);
|
||||
}
|
||||
primary_args_string = str8_list_join(scratch.arena, &primary_args_strings, &(StringJoin){.sep = str8_lit(" ")});
|
||||
}
|
||||
rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, cmd_kind_info->query.expr, primary_args_string);
|
||||
rd_push_cmd(cmd_kind_name, rd_regs());
|
||||
rd_request_frame();
|
||||
}
|
||||
else
|
||||
{
|
||||
log_user_errorf("`%S` is not a command.", cmd_kind_name);
|
||||
rd_request_frame();
|
||||
}
|
||||
}break;
|
||||
|
||||
//- rjf: exiting
|
||||
case RD_CmdKind_Exit:
|
||||
{
|
||||
|
||||
@@ -1028,7 +1028,7 @@ 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 string);
|
||||
internal void rd_regs_fill_slot_from_string(RD_RegSlot slot, String8 query_expr, String8 string);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Commands
|
||||
|
||||
@@ -795,6 +795,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(cfgs_slice)
|
||||
}
|
||||
|
||||
//- rjf: fill
|
||||
// TODO(rjf): @cleanup don't smuggle this through like this...
|
||||
if(rd_cfg_child_from_string(rd_cfg_from_id(rd_regs()->view), str8_lit("lister")) == &rd_nil_cfg)
|
||||
{
|
||||
accel->cmds = ext->cmds;
|
||||
|
||||
@@ -645,11 +645,7 @@ entry_point(CmdLine *cmd_line)
|
||||
if(dst_ws != &rd_nil_window_state)
|
||||
{
|
||||
dst_ws->window_temporarily_focused_ipc = 1;
|
||||
U64 first_space_pos = str8_find_needle(msg, 0, str8_lit(" "), 0);
|
||||
String8 cmd_kind_name_string = str8_prefix(msg, first_space_pos);
|
||||
String8 cmd_args_string = str8_skip_chop_whitespace(str8_skip(msg, first_space_pos));
|
||||
RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_kind_name_string);
|
||||
if(cmd_kind_info != &rd_nil_cmd_kind_info) RD_RegsScope()
|
||||
RD_RegsScope()
|
||||
{
|
||||
if(dst_ws->cfg_id != rd_regs()->window)
|
||||
{
|
||||
@@ -661,14 +657,7 @@ entry_point(CmdLine *cmd_line)
|
||||
rd_regs()->view = panel_tree.focused->selected_tab->id;
|
||||
scratch_end(scratch);
|
||||
}
|
||||
rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, cmd_args_string);
|
||||
rd_push_cmd(cmd_kind_name_string, rd_regs());
|
||||
rd_request_frame();
|
||||
}
|
||||
else
|
||||
{
|
||||
log_user_errorf("\"%S\" is not a command.", cmd_kind_name_string);
|
||||
rd_request_frame();
|
||||
rd_cmd(RD_CmdKind_RunExternalDriverTextCommand, .string = msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -782,8 +771,9 @@ entry_point(CmdLine *cmd_line)
|
||||
IPCInfo *ipc_info = (IPCInfo *)ipc_sender2main_shared_memory_base;
|
||||
U8 *buffer = (U8 *)(ipc_info+1);
|
||||
U64 buffer_max = IPC_SHARED_MEMORY_BUFFER_SIZE - sizeof(IPCInfo);
|
||||
String8List parts = os_string_list_from_argcv(scratch.arena, cmd_line->argc - 1, cmd_line->argv + 1);
|
||||
StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")};
|
||||
String8 msg = str8_list_join(scratch.arena, &cmd_line->inputs, &join);
|
||||
String8 msg = str8_list_join(scratch.arena, &parts, &join);
|
||||
ipc_info->msg_size = Min(buffer_max, msg.size);
|
||||
MemoryCopy(buffer, msg.str, ipc_info->msg_size);
|
||||
os_semaphore_drop(ipc_sender2main_signal_semaphore);
|
||||
|
||||
Reference in New Issue
Block a user