diff options
author | Andrew Stubbs <andrew.stubbs@st.com> | 2006-07-21 14:46:56 +0000 |
---|---|---|
committer | Andrew Stubbs <andrew.stubbs@st.com> | 2006-07-21 14:46:56 +0000 |
commit | 16026cd75d6c4515b5c854a7b4726678bb6ec31f (patch) | |
tree | 9f8ddfb74128d1425aef25f5cf5dcf29747a4347 /gdb/cli/cli-script.c | |
parent | 3e4cf9243a5580b9b7766d6da9f0d5257705bf2a (diff) | |
download | gdb-16026cd75d6c4515b5c854a7b4726678bb6ec31f.zip gdb-16026cd75d6c4515b5c854a7b4726678bb6ec31f.tar.gz gdb-16026cd75d6c4515b5c854a7b4726678bb6ec31f.tar.bz2 |
2006-07-21 Andrew Stubbs <andrew.stubbs@st.com>
* cli/cli-cmds.c (source_verbose, trace_commands): New variables.
(source_script): New function.
(source_verbose_cleanup): New function.
(source_command): Move old contents to source_script.
Make function static. Parse -v option and call source_script.
(init_cli_cmds): Update source command help.
Add 'set trace-commands' command.
* cli/cli-script.c (command_next_depth): New static variable.
(suppress_next_print_command_trace): New static variable.
(reset_command_nest_depth): New function.
(print_command_trace): New function.
(execute_control_command): Split the continue_control and break_control
cases, add calls to print_command_trace and count the nest depth.
(while_command): Set suppress_next_print_command_trace.
(if_command): Likewise.
* top.c (execute_command): Call print_command_trace.
* cli/cli-cmds.h (source_verbose, trace_commands): New extern variables.
(source_command): Change to source_script.
* main.c (captued_main): Use source_script instead of source_command.
* top.h (source_command): Change to source_script.
* event-top.c (display_gdb_prompt): Call reset_command_nest_depth.
* cli/cli-script.h (print_command_trace): Export.
(reset_command_nest_depth): Likewise.
docs/
* gdb.texinfo (Optional warnings and messages): Add
'set/show trace-commands'.
(Command files): Add '-v' to source command.
testsuite/
* gdb.base/default.exp: Update source command error message.
* gdb.base/help.exp: Update 'help source' message.
Diffstat (limited to 'gdb/cli/cli-script.c')
-rw-r--r-- | gdb/cli/cli-script.c | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c index 643eb74..1b5d342 100644 --- a/gdb/cli/cli-script.c +++ b/gdb/cli/cli-script.c @@ -46,9 +46,15 @@ static struct cleanup * setup_user_args (char *p); static void validate_comname (char *); -/* Level of control structure. */ +/* Level of control structure when reading. */ static int control_level; +/* Level of control structure when executing. */ +static int command_nest_depth = 1; + +/* This is to prevent certain commands being printed twice. */ +static int suppress_next_print_command_trace = 0; + /* Structure for arguments to user defined functions. */ #define MAXUSERARGS 10 struct user_args @@ -293,6 +299,46 @@ execute_user_command (struct cmd_list_element *c, char *args) do_cleanups (old_chain); } +/* This function is called every time GDB prints a prompt. + It ensures that errors and the like to not confuse the command tracing. */ + +void +reset_command_nest_depth (void) +{ + command_nest_depth = 1; + + /* Just in case. */ + suppress_next_print_command_trace = 0; +} + +/* Print the command, prefixed with '+' to represent the call depth. + This is slightly complicated because this function may be called + from execute_command and execute_control_command. Unfortunately + execute_command also prints the top level control commands. + In these cases execute_command will call execute_control_command + via while_command or if_command. Inner levels of 'if' and 'while' + are dealt with directly. Therefore we can use these functions + to determine whether the command has been printed already or not. */ +void +print_command_trace (const char *cmd) +{ + int i; + + if (suppress_next_print_command_trace) + { + suppress_next_print_command_trace = 0; + return; + } + + if (!source_verbose && !trace_commands) + return; + + for (i=0; i < command_nest_depth; i++) + printf_filtered ("+"); + + printf_filtered ("%s\n", cmd); +} + enum command_control_type execute_control_command (struct command_line *cmd) { @@ -322,7 +368,16 @@ execute_control_command (struct command_line *cmd) break; case continue_control: + print_command_trace ("loop_continue"); + + /* Return for "continue", and "break" so we can either + continue the loop at the top, or break out. */ + ret = cmd->control_type; + break; + case break_control: + print_command_trace ("loop_break"); + /* Return for "continue", and "break" so we can either continue the loop at the top, or break out. */ ret = cmd->control_type; @@ -330,6 +385,10 @@ execute_control_command (struct command_line *cmd) case while_control: { + char *buffer = alloca (strlen (cmd->line) + 7); + sprintf (buffer, "while %s", cmd->line); + print_command_trace (buffer); + /* Parse the loop control expression for the while statement. */ new_line = insert_args (cmd->line); if (!new_line) @@ -362,7 +421,9 @@ execute_control_command (struct command_line *cmd) current = *cmd->body_list; while (current) { + command_nest_depth++; ret = execute_control_command (current); + command_nest_depth--; /* If we got an error, or a "break" command, then stop looping. */ @@ -391,6 +452,10 @@ execute_control_command (struct command_line *cmd) case if_control: { + char *buffer = alloca (strlen (cmd->line) + 4); + sprintf (buffer, "if %s", cmd->line); + print_command_trace (buffer); + new_line = insert_args (cmd->line); if (!new_line) break; @@ -417,7 +482,9 @@ execute_control_command (struct command_line *cmd) /* Execute commands in the given arm. */ while (current) { + command_nest_depth++; ret = execute_control_command (current); + command_nest_depth--; /* If we got an error, get out. */ if (ret != simple_control) @@ -454,6 +521,7 @@ while_command (char *arg, int from_tty) if (command == NULL) return; + suppress_next_print_command_trace = 1; execute_control_command (command); free_command_lines (&command); } @@ -472,6 +540,7 @@ if_command (char *arg, int from_tty) if (command == NULL) return; + suppress_next_print_command_trace = 1; execute_control_command (command); free_command_lines (&command); } |