From 48cb2d85819efcb448e7b635e0a5da776f5bfd8c Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Mon, 3 Aug 2009 12:39:01 +0000 Subject: Implement -break-commands * breakpoint.c (get_breakpoint, breakpoint_set_commands): New. (commands_command): Use breakpoint_set_commands. * breakpoint.h (get_breakpoint, breakpoint_set_commands): Declare. * mi/mi-cmds.h (mi_cmd_break_commands): New. * mi/mi-cmds.c: Register -break-commands. * mi/mi-cmd-break.c (mi_cmd_break_commands, mi_read_next_line) (mi_command_line_array, mi_command_line_array_cnt) (mi_command_line_array_ptr): New. --- gdb/mi/mi-cmd-break.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/mi/mi-cmds.c | 1 + gdb/mi/mi-cmds.h | 1 + 3 files changed, 52 insertions(+) (limited to 'gdb/mi') diff --git a/gdb/mi/mi-cmd-break.c b/gdb/mi/mi-cmd-break.c index 445c53e..9ab8f2d 100644 --- a/gdb/mi/mi-cmd-break.c +++ b/gdb/mi/mi-cmd-break.c @@ -252,3 +252,53 @@ mi_cmd_break_watch (char *command, char **argv, int argc) error (_("mi_cmd_break_watch: Unknown watchpoint type.")); } } + +/* The mi_read_next_line consults these variable to return successive + command lines. While it would be clearer to use a closure pointer, + it is not expected that any future code will use read_command_lines_1, + therefore no point of overengineering. */ + +static char **mi_command_line_array; +static int mi_command_line_array_cnt; +static int mi_command_line_array_ptr; + +static char * +mi_read_next_line () +{ + if (mi_command_line_array_ptr == mi_command_line_array_cnt) + return NULL; + else + return mi_command_line_array[mi_command_line_array_ptr++]; +} + +void +mi_cmd_break_commands (char *command, char **argv, int argc) +{ + struct command_line *break_command; + char *endptr; + int bnum; + struct breakpoint *b; + + if (argc < 1) + error ("USAGE: %s [ [...]]", command); + + bnum = strtol (argv[0], &endptr, 0); + if (endptr == argv[0]) + error ("breakpoint number argument \"%s\" is not a number.", + argv[0]); + else if (*endptr != '\0') + error ("junk at the end of breakpoint number argument \"%s\".", + argv[0]); + + b = get_breakpoint (bnum); + if (b == NULL) + error ("breakpoint %d not found.", bnum); + + mi_command_line_array = argv; + mi_command_line_array_ptr = 1; + mi_command_line_array_cnt = argc; + + break_command = read_command_lines_1 (mi_read_next_line, 0); + breakpoint_set_commands (b, break_command); +} + diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index 4911146..dd3d803 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -35,6 +35,7 @@ struct mi_cmd mi_cmds[] = { { "break-after", { "ignore", 1 }, NULL }, { "break-condition", { "cond", 1 }, NULL }, + { "break-commands", { NULL, 0 }, mi_cmd_break_commands }, { "break-delete", { "delete breakpoint", 1 }, NULL }, { "break-disable", { "disable breakpoint", 1 }, NULL }, { "break-enable", { "enable breakpoint", 1 }, NULL }, diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h index afcba1e..85ad0c4 100644 --- a/gdb/mi/mi-cmds.h +++ b/gdb/mi/mi-cmds.h @@ -37,6 +37,7 @@ typedef void (mi_cmd_argv_ftype) (char *command, char **argv, int argc); /* Function implementing each command */ extern mi_cmd_argv_ftype mi_cmd_break_insert; +extern mi_cmd_argv_ftype mi_cmd_break_commands; extern mi_cmd_argv_ftype mi_cmd_break_watch; extern mi_cmd_argv_ftype mi_cmd_disassemble; extern mi_cmd_argv_ftype mi_cmd_data_evaluate_expression; -- cgit v1.1