mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-02-17 13:10:12 +08:00
gdb/
2008-08-16 Vladimir Prus <vladimir@codesourcery.com> Thiago Jung Bauermann <bauerman@br.ibm.com> * cli-script.c (read_next_line): Add parse_commands argument. (recurse_read_control_structure): Adapt to new read_next_line signature. (read_command_lines): Add parse_commands argument. (define_command): Adapt to new read_command_lines signature. (document_command): Likewise. * breakpoint.c (commands_command): Likewise. * defs.h (read_command_lines): Adjust function prototype. testsuite/ 2008-08-16 Thiago Jung Bauermann <bauerman@br.ibm.com> * gdb.base/define.exp: Test indented command documentation. * gdb.python/python.exp: Test indented multi-line command.
This commit is contained in:
parent
24209737f0
commit
311a4e6b7b
@ -1,3 +1,15 @@
|
||||
2008-08-16 Vladimir Prus <vladimir@codesourcery.com>
|
||||
Thiago Jung Bauermann <bauerman@br.ibm.com>
|
||||
|
||||
* cli-script.c (read_next_line): Add parse_commands argument.
|
||||
(recurse_read_control_structure): Adapt to new read_next_line
|
||||
signature.
|
||||
(read_command_lines): Add parse_commands argument.
|
||||
(define_command): Adapt to new read_command_lines signature.
|
||||
(document_command): Likewise.
|
||||
* breakpoint.c (commands_command): Likewise.
|
||||
* defs.h (read_command_lines): Adjust function prototype.
|
||||
|
||||
2008-08-16 Paul N. Hilfinger <hilfinger@adacore.com>
|
||||
|
||||
* ada-lang.c (pos_atr): Account for the possibility that the
|
||||
|
@ -675,7 +675,7 @@ commands_command (char *arg, int from_tty)
|
||||
char *tmpbuf = xstrprintf ("Type commands for when breakpoint %d is hit, one per line.",
|
||||
bnum);
|
||||
struct cleanup *cleanups = make_cleanup (xfree, tmpbuf);
|
||||
l = read_command_lines (tmpbuf, from_tty);
|
||||
l = read_command_lines (tmpbuf, from_tty, 1);
|
||||
do_cleanups (cleanups);
|
||||
free_command_lines (&b->commands);
|
||||
b->commands = l;
|
||||
|
@ -839,14 +839,19 @@ realloc_body_list (struct command_line *command, int new_length)
|
||||
command->body_count = new_length;
|
||||
}
|
||||
|
||||
/* Read one line from the input stream. If the command is an "else" or
|
||||
"end", return such an indication to the caller. */
|
||||
/* Read one line from the input stream. If the command is an "end",
|
||||
return such an indication to the caller. If PARSE_COMMANDS is true,
|
||||
strip leading whitespace (trailing whitespace is always stripped)
|
||||
in the line, attempt to recognize GDB control commands, and also
|
||||
return an indication if the command is an "else" or a nop.
|
||||
Otherwise, only "end" is recognized. */
|
||||
|
||||
static enum misc_command_type
|
||||
read_next_line (struct command_line **command)
|
||||
read_next_line (struct command_line **command, int parse_commands)
|
||||
{
|
||||
char *p, *p1, *prompt_ptr, control_prompt[256];
|
||||
int i = 0;
|
||||
int not_handled = 0;
|
||||
|
||||
if (control_level >= 254)
|
||||
error (_("Control nesting too deep!"));
|
||||
@ -869,81 +874,91 @@ read_next_line (struct command_line **command)
|
||||
if (p == NULL)
|
||||
return end_command;
|
||||
|
||||
/* Strip leading and trailing whitespace. */
|
||||
while (*p == ' ' || *p == '\t')
|
||||
p++;
|
||||
if (parse_commands)
|
||||
{
|
||||
/* Strip leading whitespace. */
|
||||
while (*p == ' ' || *p == '\t')
|
||||
p++;
|
||||
}
|
||||
|
||||
/* Strip trailing whitespace. */
|
||||
p1 = p + strlen (p);
|
||||
while (p1 != p && (p1[-1] == ' ' || p1[-1] == '\t'))
|
||||
p1--;
|
||||
|
||||
/* Blanks and comments don't really do anything, but we need to
|
||||
distinguish them from else, end and other commands which can be
|
||||
executed. */
|
||||
if (p1 == p || p[0] == '#')
|
||||
return nop_command;
|
||||
|
||||
/* Is this the end of a simple, while, or if control structure? */
|
||||
if (p1 - p == 3 && !strncmp (p, "end", 3))
|
||||
return end_command;
|
||||
|
||||
/* Is the else clause of an if control structure? */
|
||||
if (p1 - p == 4 && !strncmp (p, "else", 4))
|
||||
return else_command;
|
||||
if (parse_commands)
|
||||
{
|
||||
/* Blanks and comments don't really do anything, but we need to
|
||||
distinguish them from else, end and other commands which can be
|
||||
executed. */
|
||||
if (p1 == p || p[0] == '#')
|
||||
return nop_command;
|
||||
|
||||
/* Check for while, if, break, continue, etc and build a new command
|
||||
line structure for them. */
|
||||
if (p1 - p > 5 && !strncmp (p, "while", 5))
|
||||
{
|
||||
char *first_arg;
|
||||
first_arg = p + 5;
|
||||
while (first_arg < p1 && isspace (*first_arg))
|
||||
first_arg++;
|
||||
*command = build_command_line (while_control, first_arg);
|
||||
/* Is the else clause of an if control structure? */
|
||||
if (p1 - p == 4 && !strncmp (p, "else", 4))
|
||||
return else_command;
|
||||
|
||||
/* Check for while, if, break, continue, etc and build a new command
|
||||
line structure for them. */
|
||||
if (p1 - p > 5 && !strncmp (p, "while", 5))
|
||||
{
|
||||
char *first_arg;
|
||||
first_arg = p + 5;
|
||||
while (first_arg < p1 && isspace (*first_arg))
|
||||
first_arg++;
|
||||
*command = build_command_line (while_control, first_arg);
|
||||
}
|
||||
else if (p1 - p > 2 && !strncmp (p, "if", 2))
|
||||
{
|
||||
char *first_arg;
|
||||
first_arg = p + 2;
|
||||
while (first_arg < p1 && isspace (*first_arg))
|
||||
first_arg++;
|
||||
*command = build_command_line (if_control, first_arg);
|
||||
}
|
||||
else if (p1 - p >= 8 && !strncmp (p, "commands", 8))
|
||||
{
|
||||
char *first_arg;
|
||||
first_arg = p + 8;
|
||||
while (first_arg < p1 && isspace (*first_arg))
|
||||
first_arg++;
|
||||
*command = build_command_line (commands_control, first_arg);
|
||||
}
|
||||
else if (p1 - p == 6 && !strncmp (p, "python", 6))
|
||||
{
|
||||
/* Note that we ignore the inline "python command" form
|
||||
here. */
|
||||
*command = build_command_line (python_control, "");
|
||||
}
|
||||
else if (p1 - p == 10 && !strncmp (p, "loop_break", 10))
|
||||
{
|
||||
*command = (struct command_line *)
|
||||
xmalloc (sizeof (struct command_line));
|
||||
(*command)->next = NULL;
|
||||
(*command)->line = NULL;
|
||||
(*command)->control_type = break_control;
|
||||
(*command)->body_count = 0;
|
||||
(*command)->body_list = NULL;
|
||||
}
|
||||
else if (p1 - p == 13 && !strncmp (p, "loop_continue", 13))
|
||||
{
|
||||
*command = (struct command_line *)
|
||||
xmalloc (sizeof (struct command_line));
|
||||
(*command)->next = NULL;
|
||||
(*command)->line = NULL;
|
||||
(*command)->control_type = continue_control;
|
||||
(*command)->body_count = 0;
|
||||
(*command)->body_list = NULL;
|
||||
}
|
||||
else
|
||||
not_handled = 1;
|
||||
}
|
||||
else if (p1 - p > 2 && !strncmp (p, "if", 2))
|
||||
{
|
||||
char *first_arg;
|
||||
first_arg = p + 2;
|
||||
while (first_arg < p1 && isspace (*first_arg))
|
||||
first_arg++;
|
||||
*command = build_command_line (if_control, first_arg);
|
||||
}
|
||||
else if (p1 - p >= 8 && !strncmp (p, "commands", 8))
|
||||
{
|
||||
char *first_arg;
|
||||
first_arg = p + 8;
|
||||
while (first_arg < p1 && isspace (*first_arg))
|
||||
first_arg++;
|
||||
*command = build_command_line (commands_control, first_arg);
|
||||
}
|
||||
else if (p1 - p == 6 && !strncmp (p, "python", 6))
|
||||
{
|
||||
/* Note that we ignore the inline "python command" form
|
||||
here. */
|
||||
*command = build_command_line (python_control, "");
|
||||
}
|
||||
else if (p1 - p == 10 && !strncmp (p, "loop_break", 10))
|
||||
{
|
||||
*command = (struct command_line *)
|
||||
xmalloc (sizeof (struct command_line));
|
||||
(*command)->next = NULL;
|
||||
(*command)->line = NULL;
|
||||
(*command)->control_type = break_control;
|
||||
(*command)->body_count = 0;
|
||||
(*command)->body_list = NULL;
|
||||
}
|
||||
else if (p1 - p == 13 && !strncmp (p, "loop_continue", 13))
|
||||
{
|
||||
*command = (struct command_line *)
|
||||
xmalloc (sizeof (struct command_line));
|
||||
(*command)->next = NULL;
|
||||
(*command)->line = NULL;
|
||||
(*command)->control_type = continue_control;
|
||||
(*command)->body_count = 0;
|
||||
(*command)->body_list = NULL;
|
||||
}
|
||||
else
|
||||
|
||||
if (!parse_commands || not_handled)
|
||||
{
|
||||
/* A normal command. */
|
||||
*command = (struct command_line *)
|
||||
@ -989,7 +1004,7 @@ recurse_read_control_structure (struct command_line *current_cmd)
|
||||
dont_repeat ();
|
||||
|
||||
next = NULL;
|
||||
val = read_next_line (&next);
|
||||
val = read_next_line (&next, current_cmd->control_type != python_control);
|
||||
|
||||
/* Just skip blanks and comments. */
|
||||
if (val == nop_command)
|
||||
@ -1071,12 +1086,16 @@ recurse_read_control_structure (struct command_line *current_cmd)
|
||||
/* Read lines from the input stream and accumulate them in a chain of
|
||||
struct command_line's, which is then returned. For input from a
|
||||
terminal, the special command "end" is used to mark the end of the
|
||||
input, and is not included in the returned chain of commands. */
|
||||
input, and is not included in the returned chain of commands.
|
||||
|
||||
If PARSE_COMMANDS is true, strip leading whitespace (trailing whitespace
|
||||
is always stripped) in the line and attempt to recognize GDB control
|
||||
commands. Otherwise, only "end" is recognized. */
|
||||
|
||||
#define END_MESSAGE "End with a line saying just \"end\"."
|
||||
|
||||
struct command_line *
|
||||
read_command_lines (char *prompt_arg, int from_tty)
|
||||
read_command_lines (char *prompt_arg, int from_tty, int parse_commands)
|
||||
{
|
||||
struct command_line *head, *tail, *next;
|
||||
struct cleanup *old_chain;
|
||||
@ -1105,7 +1124,7 @@ read_command_lines (char *prompt_arg, int from_tty)
|
||||
while (1)
|
||||
{
|
||||
dont_repeat ();
|
||||
val = read_next_line (&next);
|
||||
val = read_next_line (&next, parse_commands);
|
||||
|
||||
/* Ignore blank lines or comments. */
|
||||
if (val == nop_command)
|
||||
@ -1339,7 +1358,7 @@ define_command (char *comname, int from_tty)
|
||||
*tem = tolower (*tem);
|
||||
|
||||
sprintf (tmpbuf, "Type commands for definition of \"%s\".", comname);
|
||||
cmds = read_command_lines (tmpbuf, from_tty);
|
||||
cmds = read_command_lines (tmpbuf, from_tty, 1);
|
||||
|
||||
if (c && c->class == class_user)
|
||||
free_command_lines (&c->user_commands);
|
||||
@ -1386,7 +1405,7 @@ document_command (char *comname, int from_tty)
|
||||
error (_("Command \"%s\" is built-in."), comname);
|
||||
|
||||
sprintf (tmpbuf, "Type documentation for \"%s\".", comname);
|
||||
doclines = read_command_lines (tmpbuf, from_tty);
|
||||
doclines = read_command_lines (tmpbuf, from_tty, 0);
|
||||
|
||||
if (c->doc)
|
||||
xfree (c->doc);
|
||||
|
@ -668,7 +668,7 @@ struct command_line
|
||||
struct command_line **body_list;
|
||||
};
|
||||
|
||||
extern struct command_line *read_command_lines (char *, int);
|
||||
extern struct command_line *read_command_lines (char *, int, int);
|
||||
|
||||
extern void free_command_lines (struct command_line **);
|
||||
|
||||
|
@ -1,3 +1,8 @@
|
||||
2008-08-16 Thiago Jung Bauermann <bauerman@br.ibm.com>
|
||||
|
||||
* gdb.base/define.exp: Test indented command documentation.
|
||||
* gdb.python/python.exp: Test indented multi-line command.
|
||||
|
||||
2008-08-15 Luis Machado <luisgpm@br.ibm.com>
|
||||
|
||||
* testsuite/gdb.arch/vsx-regs.c: New source file.
|
||||
|
@ -200,6 +200,31 @@ gdb_expect {
|
||||
timeout {fail "(timeout) help user command: nextwhere"}
|
||||
}
|
||||
|
||||
# Verify that the document command preserves whitespace in the beginning of the line.
|
||||
#
|
||||
send_gdb "document nextwhere\n"
|
||||
gdb_expect {
|
||||
-re "Type documentation for \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$"\
|
||||
{send_gdb " A next command that first shows you where you're stepping from.\nend\n"
|
||||
gdb_expect {
|
||||
-re "$gdb_prompt $" {}
|
||||
timeout {fail "(timeout) preserve whitespace in help string"}
|
||||
}
|
||||
}
|
||||
-re "$gdb_prompt $"\
|
||||
{fail "preserve whitespace in help string"}
|
||||
timeout {fail "(timeout) preserve whitespace in help string"}
|
||||
}
|
||||
|
||||
send_gdb "help nextwhere\n"
|
||||
gdb_expect {
|
||||
-re " A next command that first shows you where you're stepping from.\r\n$gdb_prompt $"\
|
||||
{pass "preserve whitespace in help string"}
|
||||
-re "$gdb_prompt $"\
|
||||
{fail "preserve whitespace in help string"}
|
||||
timeout {fail "(timeout) preserve whitespace in help string"}
|
||||
}
|
||||
|
||||
# Verify that the command parser doesn't require a space after an 'if'
|
||||
# command in a user defined function.
|
||||
#
|
||||
|
@ -64,3 +64,10 @@ gdb_py_test_multiple "show python command" \
|
||||
"end" "" \
|
||||
"end" "" \
|
||||
"show user zzq" "User command zzq:.* python.*print 23.* end"
|
||||
|
||||
gdb_py_test_multiple "indented multi-line python command" \
|
||||
"python" "" \
|
||||
"def foo ():" "" \
|
||||
" print 'hello, world!'" "" \
|
||||
"foo ()" "" \
|
||||
"end" "hello, world!"
|
||||
|
Loading…
Reference in New Issue
Block a user