aboutsummaryrefslogtreecommitdiff
path: root/gdb/mi
diff options
context:
space:
mode:
authorVladimir Prus <vladimir@codesourcery.com>2009-08-03 12:39:01 +0000
committerVladimir Prus <vladimir@codesourcery.com>2009-08-03 12:39:01 +0000
commit48cb2d85819efcb448e7b635e0a5da776f5bfd8c (patch)
tree48ad67af6be4c92c46688853d2e165cd1e867783 /gdb/mi
parent3c1179ff511933179e64e854ac7b39c8003d9868 (diff)
downloadgdb-48cb2d85819efcb448e7b635e0a5da776f5bfd8c.zip
gdb-48cb2d85819efcb448e7b635e0a5da776f5bfd8c.tar.gz
gdb-48cb2d85819efcb448e7b635e0a5da776f5bfd8c.tar.bz2
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.
Diffstat (limited to 'gdb/mi')
-rw-r--r--gdb/mi/mi-cmd-break.c50
-rw-r--r--gdb/mi/mi-cmds.c1
-rw-r--r--gdb/mi/mi-cmds.h1
3 files changed, 52 insertions, 0 deletions
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 <BKPT> [<COMMAND> [<COMMAND>...]]", 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;