diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 78607454..223fb76b 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -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}}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 837729b0..ab93e4d1 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -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]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index d5fd675e..c5bf82d2 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -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" "" "" "" } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 090b5e0e..90259dca 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -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: { diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index d558f57a..1555917f 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -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 diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index a1be1801..10adf0f8 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -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; diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index aac84d3b..0f7385c3 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -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);