diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 5a3fd5bc..a777f4a7 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -300,6 +300,14 @@ ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs) str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size); } + // rjf: write stdout/stderr/stdin paths + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stdout_path.size); + str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stdout_path); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stderr_path.size); + str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stderr_path); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stdin_path.size); + str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stdin_path); + // rjf: write trap list str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->traps.count); for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next) @@ -405,6 +413,17 @@ ctrl_msg_list_from_serialized_string(Arena *arena, String8 string) str8_list_push(arena, &msg->env_string_list, env_str); } + // rjf: read stdout/stderr/stdin paths + read_off += str8_deserial_read_struct(string, read_off, &msg->stdout_path.size); + msg->stdout_path.str = push_array(arena, U8, msg->stdout_path.size); + read_off += str8_deserial_read(string, read_off, msg->stdout_path.str, msg->stdout_path.size, 1); + read_off += str8_deserial_read_struct(string, read_off, &msg->stderr_path.size); + msg->stderr_path.str = push_array(arena, U8, msg->stderr_path.size); + read_off += str8_deserial_read(string, read_off, msg->stderr_path.str, msg->stderr_path.size, 1); + read_off += str8_deserial_read_struct(string, read_off, &msg->stdin_path.size); + msg->stdin_path.str = push_array(arena, U8, msg->stdin_path.size); + read_off += str8_deserial_read(string, read_off, msg->stdin_path.str, msg->stdin_path.size, 1); + // rjf: read trap list U64 trap_count = 0; read_off += str8_deserial_read_struct(string, read_off, &trap_count); @@ -4249,13 +4268,37 @@ ctrl_thread__end_and_flush_info_log(void) internal void ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { + //- rjf: obtain stdout/stderr/stdin handles + OS_Handle stdout_handle = {0}; + OS_Handle stderr_handle = {0}; + OS_Handle stdin_handle = {0}; + if(msg->stdout_path.size != 0) + { + OS_Handle f = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, msg->stdout_path); + os_file_close(f); + stdout_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, msg->stdout_path); + } + if(msg->stderr_path.size != 0) + { + OS_Handle f = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, msg->stderr_path); + os_file_close(f); + stderr_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, msg->stderr_path); + } + if(msg->stdin_path.size != 0) + { + stdin_handle = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, msg->stdin_path); + } + //- rjf: launch OS_ProcessLaunchParams params = {0}; { - params.cmd_line = msg->cmd_line_string_list; - params.path = msg->path; - params.env = msg->env_string_list; - params.inherit_env = msg->env_inherit; + params.cmd_line = msg->cmd_line_string_list; + params.path = msg->path; + params.env = msg->env_string_list; + params.inherit_env = msg->env_inherit; + params.stdout_file = stdout_handle; + params.stderr_file = stderr_handle; + params.stdin_file = stdin_handle; } U32 id = dmn_ctrl_launch(ctrl_ctx, ¶ms); diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 4d930924..1b42d6e3 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -86,6 +86,9 @@ Y(String8, type(CTRL_PathString8), dbg, "Debug Info Path")\ Y(String8, type(CTRL_PlainString8), args, "Arguments")\ Y(String8, type(CTRL_PathString8), working_directory, "Working Directory")\ Y(String8, type(CTRL_CodeString8), entry_point, "Custom Entry Point")\ +Y(String8, type(CTRL_PathString8), stdout_path, "Standard Output Path")\ +Y(String8, type(CTRL_PathString8), stderr_path, "Standard Error Path")\ +Y(String8, type(CTRL_PathString8), stdin_path, "Standard Input Path")\ Y(String8, type(CTRL_PathString8), source_location, "Source Location")\ Y(String8, type(CTRL_CodeString8), function_location, "Function Location")\ Y(String8, type(CTRL_CodeString8), address_location, "Address Location")\ @@ -132,6 +135,9 @@ struct_members(CTRL_TargetMetaEval) member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),args, .pretty_name = str8_lit_comp("Arguments")), member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), working_directory, .pretty_name = str8_lit_comp("Working Directory")), member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), entry_point, .pretty_name = str8_lit_comp("Custom Entry Point")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), stdout_path, .pretty_name = str8_lit_comp("Standard Output Path")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), stderr_path, .pretty_name = str8_lit_comp("Standard Error Path")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), stdin_path, .pretty_name = str8_lit_comp("Standard Input Path")), }; struct_members(CTRL_PinMetaEval) @@ -544,6 +550,9 @@ struct CTRL_Msg String8List entry_points; String8List cmd_line_string_list; String8List env_string_list; + String8 stdout_path; + String8 stderr_path; + String8 stdin_path; CTRL_TrapList traps; CTRL_UserBreakpointList user_bps; CTRL_MetaEvalArray meta_evals; diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index 786fd372..0e3f948b 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -2031,6 +2031,9 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P String8 args = str8_skip_chop_whitespace(target->args); String8 working_directory = str8_skip_chop_whitespace(target->working_directory); String8 custom_entry_point_name = str8_skip_chop_whitespace(target->custom_entry_point_name); + String8 stdout_path = str8_skip_chop_whitespace(target->stdout_path); + String8 stderr_path = str8_skip_chop_whitespace(target->stderr_path); + String8 stdin_path = str8_skip_chop_whitespace(target->stdin_path); String8List env = target->env; if(working_directory.size == 0) { @@ -2071,6 +2074,9 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P msg->kind = CTRL_MsgKind_Launch; msg->path = working_directory; msg->cmd_line_string_list = cmdln_strings; + msg->stdout_path = stdout_path; + msg->stderr_path = stderr_path; + msg->stdin_path = stdin_path; msg->env_inherit = 1; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); MemoryCopyStruct(&msg->meta_evals, meta_evals); diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index 96849922..615852ea 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -14,6 +14,9 @@ struct D_Target String8 args; String8 working_directory; String8 custom_entry_point_name; + String8 stdout_path; + String8 stderr_path; + String8 stdin_path; String8List env; }; diff --git a/src/demon/win32/demon_core_win32.c b/src/demon/win32/demon_core_win32.c index 56145a1c..857f6226 100644 --- a/src/demon/win32/demon_core_win32.c +++ b/src/demon/win32/demon_core_win32.c @@ -1256,11 +1256,33 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) String16 env16 = str16_from_8(scratch.arena, env); //- rjf: launch - DWORD access_flags = CREATE_UNICODE_ENVIRONMENT|DEBUG_PROCESS; + DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT|DEBUG_PROCESS; + BOOL inherit_handles = 0; STARTUPINFOW startup_info = {sizeof(startup_info)}; + if(!os_handle_match(params->stdout_file, os_handle_zero())) + { + HANDLE stdout_handle = (HANDLE)params->stdout_file.u64[0]; + startup_info.hStdOutput = stdout_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + if(!os_handle_match(params->stderr_file, os_handle_zero())) + { + HANDLE stderr_handle = (HANDLE)params->stderr_file.u64[0]; + startup_info.hStdError = stderr_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + if(!os_handle_match(params->stdin_file, os_handle_zero())) + { + HANDLE stdin_handle = (HANDLE)params->stdin_file.u64[0]; + startup_info.hStdInput = stdin_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } PROCESS_INFORMATION process_info = {0}; AllocConsole(); - if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 1, access_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) + if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 1, creation_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) { // check if we are 32-bit app, and just close it immediately BOOL is_wow = 0; diff --git a/src/os/core/os_core.h b/src/os/core/os_core.h index 4eed8c03..e9bf912e 100644 --- a/src/os/core/os_core.h +++ b/src/os/core/os_core.h @@ -123,6 +123,8 @@ struct OS_ProcessLaunchParams B32 inherit_env; B32 consoleless; OS_Handle stdout_file; + OS_Handle stderr_file; + OS_Handle stdin_file; }; //////////////////////////////// diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index a1f88013..eb49b4e0 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -941,7 +941,21 @@ os_process_launch(OS_ProcessLaunchParams *params) startup_info.hStdOutput = stdout_handle; startup_info.dwFlags |= STARTF_USESTDHANDLES; inherit_handles = 1; - } + } + if(!os_handle_match(params->stderr_file, os_handle_zero())) + { + HANDLE stderr_handle = (HANDLE)params->stderr_file.u64[0]; + startup_info.hStdError = stderr_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + if(!os_handle_match(params->stdin_file, os_handle_zero())) + { + HANDLE stdin_handle = (HANDLE)params->stdin_file.u64[0]; + startup_info.hStdInput = stdin_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } PROCESS_INFORMATION process_info = {0}; if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, inherit_handles, creation_flags, use_null_env_arg ? 0 : (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) { diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 08a2815f..446f50a9 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -36,7 +36,7 @@ RD_CmdKind_Null, RD_CmdKind_Null, }; -String8 d_entity_kind_display_string_table[31] = +String8 d_entity_kind_display_string_table[34] = { str8_lit_comp("Nil"), str8_lit_comp("Root"), @@ -55,6 +55,9 @@ str8_lit_comp("Executable"), str8_lit_comp("Arguments"), str8_lit_comp("Working Directory"), str8_lit_comp("Entry Point"), +str8_lit_comp("Standard Output Path"), +str8_lit_comp("Standard Error Path"), +str8_lit_comp("Standard Input Path"), str8_lit_comp("Window"), str8_lit_comp("Panel"), str8_lit_comp("View"), @@ -71,7 +74,7 @@ str8_lit_comp("Conversion Task"), str8_lit_comp("Conversion Failure"), }; -String8 d_entity_kind_name_lower_table[31] = +String8 d_entity_kind_name_lower_table[34] = { str8_lit_comp("nil"), str8_lit_comp("root"), @@ -90,6 +93,9 @@ str8_lit_comp("executable"), str8_lit_comp("arguments"), str8_lit_comp("working_directory"), str8_lit_comp("entry_point"), +str8_lit_comp("stdout_path"), +str8_lit_comp("stderr_path"), +str8_lit_comp("stdin_path"), str8_lit_comp("window"), str8_lit_comp("panel"), str8_lit_comp("view"), @@ -106,7 +112,7 @@ str8_lit_comp("conversion_task"), str8_lit_comp("conversion_fail"), }; -String8 d_entity_kind_name_lower_plural_table[31] = +String8 d_entity_kind_name_lower_plural_table[34] = { str8_lit_comp("nils"), str8_lit_comp("roots"), @@ -125,6 +131,9 @@ str8_lit_comp("executables"), str8_lit_comp("argumentses"), str8_lit_comp("working_directories"), str8_lit_comp("entry_points"), +str8_lit_comp("stdout_paths"), +str8_lit_comp("stderr_paths"), +str8_lit_comp("stdin_paths"), str8_lit_comp("windows"), str8_lit_comp("panels"), str8_lit_comp("views"), @@ -141,7 +150,7 @@ str8_lit_comp("conversion_tasks"), str8_lit_comp("conversion_fails"), }; -String8 d_entity_kind_name_label_table[31] = +String8 d_entity_kind_name_label_table[34] = { str8_lit_comp("Label"), str8_lit_comp("Label"), @@ -158,8 +167,11 @@ str8_lit_comp("Location"), str8_lit_comp("Label"), str8_lit_comp("Executable"), str8_lit_comp("Arguments"), -str8_lit_comp("Execution Path"), +str8_lit_comp("Path"), str8_lit_comp("Symbol Name"), +str8_lit_comp("Path"), +str8_lit_comp("Path"), +str8_lit_comp("Path"), str8_lit_comp("Label"), str8_lit_comp("Label"), str8_lit_comp("Label"), @@ -176,7 +188,7 @@ str8_lit_comp("Label"), str8_lit_comp("Label"), }; -RD_EntityKindFlags rd_entity_kind_flags_table[31] = +RD_EntityKindFlags rd_entity_kind_flags_table[34] = { (0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), (0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), @@ -195,6 +207,9 @@ RD_EntityKindFlags rd_entity_kind_flags_table[31] = (0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), (0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (1*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), (0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (1*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (1*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (1*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), (1*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (1*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (1*RD_EntityKindFlag_IsSerializedToConfig), (1*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (1*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (1*RD_EntityKindFlag_IsSerializedToConfig), (1*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (1*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (1*RD_EntityKindFlag_IsSerializedToConfig), @@ -870,7 +885,7 @@ RD_ViewRuleInfo rd_view_rule_kind_info_table[35] = {str8_lit_comp("geo3d"), str8_lit_comp("Visualizes memory as 3D geometry."), str8_lit_comp("Geometry (3D)"), str8_lit_comp("x:{'count':expr, 'vtx':expr, 'vtx_size':expr}"), RD_IconKind_Binoculars, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*1|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*1), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(geo3d) , RD_VIEW_RULE_UI_FUNCTION_NAME(geo3d)}, }; -RD_IconKind rd_entity_kind_icon_kind_table[31] = +RD_IconKind rd_entity_kind_icon_kind_table[34] = { RD_IconKind_Null, RD_IconKind_Null, @@ -889,6 +904,9 @@ RD_IconKind_Null, RD_IconKind_Null, RD_IconKind_Null, RD_IconKind_Null, +RD_IconKind_Null, +RD_IconKind_Null, +RD_IconKind_Null, RD_IconKind_Window, RD_IconKind_XSplit, RD_IconKind_Null, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 0bc70df2..2f817ccf 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -34,6 +34,9 @@ RD_EntityKind_Executable, RD_EntityKind_Arguments, RD_EntityKind_WorkingDirectory, RD_EntityKind_EntryPoint, +RD_EntityKind_StdoutPath, +RD_EntityKind_StderrPath, +RD_EntityKind_StdinPath, RD_EntityKind_Window, RD_EntityKind_Panel, RD_EntityKind_View, @@ -763,11 +766,11 @@ extern String8 rd_cfg_src_string_table[4]; extern RD_CmdKind rd_cfg_src_load_cmd_kind_table[4]; extern RD_CmdKind rd_cfg_src_write_cmd_kind_table[4]; extern RD_CmdKind rd_cfg_src_apply_cmd_kind_table[4]; -extern String8 d_entity_kind_display_string_table[31]; -extern String8 d_entity_kind_name_lower_table[31]; -extern String8 d_entity_kind_name_lower_plural_table[31]; -extern String8 d_entity_kind_name_label_table[31]; -extern RD_EntityKindFlags rd_entity_kind_flags_table[31]; +extern String8 d_entity_kind_display_string_table[34]; +extern String8 d_entity_kind_name_lower_table[34]; +extern String8 d_entity_kind_name_lower_plural_table[34]; +extern String8 d_entity_kind_name_label_table[34]; +extern RD_EntityKindFlags rd_entity_kind_flags_table[34]; extern Rng1U64 rd_reg_slot_range_table[34]; extern RD_StringBindingPair rd_default_binding_table[110]; extern String8 rd_binding_version_remap_old_name_table[8]; @@ -781,7 +784,7 @@ extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expan extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[18]; extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[18]; extern RD_ViewRuleInfo rd_view_rule_kind_info_table[35]; -extern RD_IconKind rd_entity_kind_icon_kind_table[31]; +extern RD_IconKind rd_entity_kind_icon_kind_table[34]; extern String8 rd_theme_preset_display_string_table[9]; extern String8 rd_theme_preset_code_string_table[9]; extern String8 rd_theme_color_version_remap_old_name_table[22]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index bdbf4daf..7d9159a1 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -93,8 +93,11 @@ RD_EntityKindTable: {Target target targets 1 0 1 1 1 0 1 0 0 1 1 "Label" Target "Target" } {Executable executable executables 0 0 0 0 0 0 0 0 1 1 0 "Executable" Null "Executable" } {Arguments arguments argumentses 0 0 0 0 0 0 0 0 0 1 0 "Arguments" Null "Arguments" } - {WorkingDirectory working_directory working_directories 0 0 0 0 0 0 0 0 1 1 0 "Execution Path" Null "Working Directory" } + {WorkingDirectory working_directory working_directories 0 0 0 0 0 0 0 0 1 1 0 "Path" Null "Working Directory" } {EntryPoint entry_point entry_points 0 0 0 0 0 0 0 0 0 1 0 "Symbol Name" Null "Entry Point" } + {StdoutPath stdout_path stdout_paths 0 0 0 0 0 0 0 0 1 1 0 "Path" Null "Standard Output Path" } + {StderrPath stderr_path stderr_paths 0 0 0 0 0 0 0 0 1 1 0 "Path" Null "Standard Error Path" } + {StdinPath stdin_path stdin_paths 0 0 0 0 0 0 0 0 1 1 0 "Path" Null "Standard Input Path" } //- rjf: frontend containers (windows, panels, views) {Window window windows 1 0 0 0 0 0 1 0 0 1 1 "Label" Window "Window" } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 460ea3a3..0cbe5053 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1895,12 +1895,18 @@ rd_d_target_from_entity(RD_Entity *entity) RD_Entity *src_target_exe = rd_entity_child_from_kind(entity, RD_EntityKind_Executable); RD_Entity *src_target_args = rd_entity_child_from_kind(entity, RD_EntityKind_Arguments); RD_Entity *src_target_wdir = rd_entity_child_from_kind(entity, RD_EntityKind_WorkingDirectory); + RD_Entity *src_target_stdo = rd_entity_child_from_kind(entity, RD_EntityKind_StdoutPath); + RD_Entity *src_target_stde = rd_entity_child_from_kind(entity, RD_EntityKind_StderrPath); + RD_Entity *src_target_stdi = rd_entity_child_from_kind(entity, RD_EntityKind_StdinPath); RD_Entity *src_target_entry = rd_entity_child_from_kind(entity, RD_EntityKind_EntryPoint); D_Target target = {0}; target.exe = src_target_exe->string; target.args = src_target_args->string; target.working_directory = src_target_wdir->string; target.custom_entry_point_name = src_target_entry->string; + target.stdout_path = src_target_stdo->string; + target.stderr_path = src_target_stde->string; + target.stdin_path = src_target_stdi->string; return target; } @@ -2301,6 +2307,9 @@ rd_ctrl_meta_eval_from_entity(Arena *arena, RD_Entity *entity) RD_Entity *args= rd_entity_child_from_kind(entity, RD_EntityKind_Arguments); RD_Entity *wdir= rd_entity_child_from_kind(entity, RD_EntityKind_WorkingDirectory); RD_Entity *entr= rd_entity_child_from_kind(entity, RD_EntityKind_EntryPoint); + RD_Entity *stdo= rd_entity_child_from_kind(entity, RD_EntityKind_StdoutPath); + RD_Entity *stde= rd_entity_child_from_kind(entity, RD_EntityKind_StderrPath); + RD_Entity *stdi= rd_entity_child_from_kind(entity, RD_EntityKind_StdinPath); RD_Entity *loc = rd_entity_child_from_kind(entity, RD_EntityKind_Location); RD_Entity *cnd = rd_entity_child_from_kind(entity, RD_EntityKind_Condition); RD_Entity *src = rd_entity_child_from_kind(entity, RD_EntityKind_Source); @@ -2330,6 +2339,9 @@ rd_ctrl_meta_eval_from_entity(Arena *arena, RD_Entity *entity) meval->args = args->string; meval->working_directory = wdir->string; meval->entry_point = entr->string; + meval->stdout_path = stdo->string; + meval->stderr_path = stde->string; + meval->stdin_path = stdi->string; meval->source_location = src_loc_string; meval->address_location = vaddr_loc_string; meval->function_location = function_loc_string; @@ -2600,6 +2612,9 @@ rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range) StringMemberCase(args) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Arguments), str8_cstring_capped(in, (U8 *)in + 4096));} StringMemberCase(working_directory) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_WorkingDirectory), str8_cstring_capped(in, (U8 *)in + 4096));} StringMemberCase(entry_point) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_EntryPoint), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(stdout_path) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_StdoutPath), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(stderr_path) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_StderrPath), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(stdin_path) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_StdinPath), str8_cstring_capped(in, (U8 *)in + 4096));} StringMemberCase(source_path) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Source), str8_cstring_capped(in, (U8 *)in + 4096));} StringMemberCase(destination_path) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Dest), str8_cstring_capped(in, (U8 *)in + 4096));} StringMemberCase(type) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Source), str8_cstring_capped(in, (U8 *)in + 4096));} diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 698198dc..77f32960 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,6 +4,8 @@ //////////////////////////////// //~ rjf: post-0.9.12 TODO notes // +// [ ] fix quote input in quoteless watch window value editors +// // [ ] per-target stdout/stderr file output paths // // [ ] double click on breakpoints/watch-pins/etc. to go to location diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 5b909c3c..9f78959f 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -5361,7 +5361,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(targets) rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.75f, .dequote_string = 1, .is_non_code = 0); } rd_watch_view_build(wv, RD_WatchViewFlag_NoHeader|RD_WatchViewFlag_PrettyNameMembers|RD_WatchViewFlag_PrettyEntityRows|RD_WatchViewFlag_DisableCacheLines, - str8_lit("targets"), str8_lit("only: label exe args working_directory entry_point str"), 1, 10, rect); + str8_lit("targets"), str8_lit("only: label exe args working_directory entry_point stdout_path stderr_path stdin_path str"), 1, 10, rect); ProfEnd(); } @@ -5823,6 +5823,10 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(text) rd_regs()->cursor.column = rd_value_from_params_key(params, str8_lit("cursor_column")).s64; rd_regs()->mark.line = rd_value_from_params_key(params, str8_lit("mark_line")).s64; rd_regs()->mark.column = rd_value_from_params_key(params, str8_lit("mark_column")).s64; + if(rd_regs()->cursor.line == 0) { rd_regs()->cursor.line = 1; } + if(rd_regs()->cursor.column == 0) { rd_regs()->cursor.column = 1; } + if(rd_regs()->mark.line == 0) { rd_regs()->mark.line = 1; } + if(rd_regs()->mark.column == 0) { rd_regs()->mark.column = 1; } E_Eval eval = e_eval_from_string(scratch.arena, string); Rng1U64 range = rd_range_from_eval_params(eval, params); rd_regs()->text_key = rd_key_from_eval_space_range(eval.space, range, 1);