2011-07-22 Phil Muldoon <pmuldoon@redhat.com>

* event-top.c (cli_command_loop): Use get_prompt, get_suffix,
	get_prefix.
	(display_gdb_prompt): Likewise.
	(change_annotation_level): Likewise.
	(push_prompt): Likewise.
	(pop_prompt): Likewise.
	(handle_stop_sig): Use get_prompt with a level.
	* top.c (command_loop): Use get_prompt with a level.
	(set_async_annotation_level): Use set_prompt with a level.
	(get_prefix): New function.
	(set_prefix): Ditto.
	(set_suffix): Ditto.
	(get_suffix): Ditto.
	(get_prompt): Accept a level argument.
	(set_prompt): Accept a level argument.  Free old prompts.  Set
	new_async_prompt if level is 0.
	(init_main): Use set_prompt with a level.  Do not set
	new_async_prompt.
	* event-top.h (PROMPT, SUFFIX, PREFIX): Move to top.c
	* top.h: Declare set_suffix, get_suffix, set_prefix, get_prefix.
	Modify set_prompt, get_prompt to account for levels.
	* tui/tui-interp.c (tui_command_loop): Use get_prompt with a
	level
	* python/python.c (before_prompt_hook): Use set_prompt.
This commit is contained in:
Phil Muldoon 2011-07-22 09:22:50 +00:00
parent 14d1530353
commit 95298e7219
7 changed files with 169 additions and 58 deletions

View file

@ -1,3 +1,30 @@
2011-07-22 Phil Muldoon <pmuldoon@redhat.com>
* event-top.c (cli_command_loop): Use get_prompt, get_suffix,
get_prefix.
(display_gdb_prompt): Likewise.
(change_annotation_level): Likewise.
(push_prompt): Likewise.
(pop_prompt): Likewise.
(handle_stop_sig): Use get_prompt with a level.
* top.c (command_loop): Use get_prompt with a level.
(set_async_annotation_level): Use set_prompt with a level.
(get_prefix): New function.
(set_prefix): Ditto.
(set_suffix): Ditto.
(get_suffix): Ditto.
(get_prompt): Accept a level argument.
(set_prompt): Accept a level argument. Free old prompts. Set
new_async_prompt if level is 0.
(init_main): Use set_prompt with a level. Do not set
new_async_prompt.
* event-top.h (PROMPT, SUFFIX, PREFIX): Move to top.c
* top.h: Declare set_suffix, get_suffix, set_prefix, get_prefix.
Modify set_prompt, get_prompt to account for levels.
* tui/tui-interp.c (tui_command_loop): Use get_prompt with a
level.
* python/python.c (before_prompt_hook): Use set_prompt.
2011-07-22 Kwok Cheung Yeung <kcy@codesourcery.com> 2011-07-22 Kwok Cheung Yeung <kcy@codesourcery.com>
* defs.h: Add guard against inclusion in gdbserver. * defs.h: Add guard against inclusion in gdbserver.

View file

@ -191,17 +191,17 @@ cli_command_loop (void)
{ {
int length; int length;
char *a_prompt; char *a_prompt;
char *gdb_prompt = get_prompt (); char *gdb_prompt = get_prompt (0);
/* Tell readline what the prompt to display is and what function /* Tell readline what the prompt to display is and what function
it will need to call after a whole line is read. This also it will need to call after a whole line is read. This also
displays the first prompt. */ displays the first prompt. */
length = strlen (PREFIX (0)) length = strlen (get_prefix (0))
+ strlen (gdb_prompt) + strlen (SUFFIX (0)) + 1; + strlen (gdb_prompt) + strlen (get_suffix(0)) + 1;
a_prompt = (char *) alloca (length); a_prompt = (char *) alloca (length);
strcpy (a_prompt, PREFIX (0)); strcpy (a_prompt, get_prefix (0));
strcat (a_prompt, gdb_prompt); strcat (a_prompt, gdb_prompt);
strcat (a_prompt, SUFFIX (0)); strcat (a_prompt, get_suffix (0));
rl_callback_handler_install (a_prompt, input_handler); rl_callback_handler_install (a_prompt, input_handler);
} }
else else
@ -276,10 +276,10 @@ display_gdb_prompt (char *new_prompt)
if (! new_prompt) if (! new_prompt)
{ {
char *post_gdb_prompt = NULL; char *post_gdb_prompt = NULL;
char *pre_gdb_prompt = xstrdup (get_prompt ()); char *pre_gdb_prompt = xstrdup (get_prompt (0));
observer_notify_before_prompt (pre_gdb_prompt); observer_notify_before_prompt (pre_gdb_prompt);
post_gdb_prompt = get_prompt (); post_gdb_prompt = get_prompt (0);
/* If the observer changed the prompt, use that prompt. */ /* If the observer changed the prompt, use that prompt. */
if (strcmp (pre_gdb_prompt, post_gdb_prompt) != 0) if (strcmp (pre_gdb_prompt, post_gdb_prompt) != 0)
@ -317,18 +317,18 @@ display_gdb_prompt (char *new_prompt)
if (! new_prompt) if (! new_prompt)
{ {
/* Just use the top of the prompt stack. */ /* Just use the top of the prompt stack. */
prompt_length = strlen (PREFIX (0)) + prompt_length = strlen (get_prefix (0)) +
strlen (SUFFIX (0)) + strlen (get_suffix (0)) +
strlen (get_prompt()) + 1; strlen (get_prompt (0)) + 1;
actual_gdb_prompt = (char *) alloca (prompt_length); actual_gdb_prompt = (char *) alloca (prompt_length);
/* Prefix needs to have new line at end. */ /* Prefix needs to have new line at end. */
strcpy (actual_gdb_prompt, PREFIX (0)); strcpy (actual_gdb_prompt, get_prefix (0));
strcat (actual_gdb_prompt, get_prompt()); strcat (actual_gdb_prompt, get_prompt (0));
/* Suffix needs to have a new line at end and \032 \032 at /* Suffix needs to have a new line at end and \032 \032 at
beginning. */ beginning. */
strcat (actual_gdb_prompt, SUFFIX (0)); strcat (actual_gdb_prompt, get_suffix (0));
} }
else else
actual_gdb_prompt = new_prompt;; actual_gdb_prompt = new_prompt;;
@ -361,7 +361,7 @@ change_annotation_level (void)
{ {
char *prefix, *suffix; char *prefix, *suffix;
if (!PREFIX (0) || !PROMPT (0) || !SUFFIX (0)) if (!get_prefix (0) || !get_prompt (0) || !get_suffix (0))
{ {
/* The prompt stack has not been initialized to "", we are /* The prompt stack has not been initialized to "", we are
using gdb w/o the --async switch. */ using gdb w/o the --async switch. */
@ -371,7 +371,7 @@ change_annotation_level (void)
if (annotation_level > 1) if (annotation_level > 1)
{ {
if (!strcmp (PREFIX (0), "") && !strcmp (SUFFIX (0), "")) if (!strcmp (get_prefix (0), "") && !strcmp (get_suffix (0), ""))
{ {
/* Push a new prompt if the previous annotation_level was not >1. */ /* Push a new prompt if the previous annotation_level was not >1. */
prefix = (char *) alloca (strlen (async_annotation_suffix) + 10); prefix = (char *) alloca (strlen (async_annotation_suffix) + 10);
@ -389,7 +389,7 @@ change_annotation_level (void)
} }
else else
{ {
if (strcmp (PREFIX (0), "") && strcmp (SUFFIX (0), "")) if (strcmp (get_prefix (0), "") && strcmp (get_suffix (0), ""))
{ {
/* Pop the top of the stack, we are going back to annotation < 1. */ /* Pop the top of the stack, we are going back to annotation < 1. */
pop_prompt (); pop_prompt ();
@ -405,17 +405,17 @@ void
push_prompt (char *prefix, char *prompt, char *suffix) push_prompt (char *prefix, char *prompt, char *suffix)
{ {
the_prompts.top++; the_prompts.top++;
PREFIX (0) = xstrdup (prefix); set_prefix (prefix, 0);
/* Note that this function is used by the set annotate 2 /* Note that this function is used by the set annotate 2
command. This is why we take care of saving the old prompt command. This is why we take care of saving the old prompt
in case a new one is not specified. */ in case a new one is not specified. */
if (prompt) if (prompt)
PROMPT (0) = xstrdup (prompt); set_prompt (prompt, 0);
else else
PROMPT (0) = xstrdup (PROMPT (-1)); set_prompt (get_prompt (-1), 0);
SUFFIX (0) = xstrdup (suffix); set_suffix (suffix, 0);
} }
/* Pops the top of the prompt stack, and frees the memory allocated /* Pops the top of the prompt stack, and frees the memory allocated
@ -425,20 +425,17 @@ pop_prompt (void)
{ {
/* If we are not during a 'synchronous' execution command, in which /* If we are not during a 'synchronous' execution command, in which
case, the top prompt would be empty. */ case, the top prompt would be empty. */
if (strcmp (PROMPT (0), "")) if (strcmp (get_prompt (0), ""))
/* This is for the case in which the prompt is set while the /* This is for the case in which the prompt is set while the
annotation level is 2. The top prompt will be changed, but when annotation level is 2. The top prompt will be changed, but when
we return to annotation level < 2, we want that new prompt to be we return to annotation level < 2, we want that new prompt to be
in effect, until the user does another 'set prompt'. */ in effect, until the user does another 'set prompt'. */
if (strcmp (PROMPT (0), PROMPT (-1))) if (strcmp (get_prompt (0), get_prompt (-1)))
{ set_prompt (get_prompt (0), -1);
xfree (PROMPT (-1));
PROMPT (-1) = xstrdup (PROMPT (0));
}
xfree (PREFIX (0)); set_prefix (NULL, 0);
xfree (PROMPT (0)); set_prompt (NULL, 0);
xfree (SUFFIX (0)); set_suffix (NULL, 0);
the_prompts.top--; the_prompts.top--;
} }
@ -983,7 +980,7 @@ handle_stop_sig (int sig)
static void static void
async_stop_sig (gdb_client_data arg) async_stop_sig (gdb_client_data arg)
{ {
char *prompt = get_prompt (); char *prompt = get_prompt (0);
#if STOP_SIGNAL == SIGTSTP #if STOP_SIGNAL == SIGTSTP
signal (SIGTSTP, SIG_DFL); signal (SIGTSTP, SIG_DFL);
@ -1061,7 +1058,7 @@ set_async_annotation_level (char *args, int from_tty,
void void
set_async_prompt (char *args, int from_tty, struct cmd_list_element *c) set_async_prompt (char *args, int from_tty, struct cmd_list_element *c)
{ {
PROMPT (0) = xstrdup (new_async_prompt); set_prompt (new_async_prompt, 0);
} }
/* Set things up for readline to be invoked via the alternate /* Set things up for readline to be invoked via the alternate

View file

@ -69,9 +69,6 @@ struct prompts
int top; int top;
}; };
#define PROMPT(X) the_prompts.prompt_stack[the_prompts.top + X].prompt
#define PREFIX(X) the_prompts.prompt_stack[the_prompts.top + X].prefix
#define SUFFIX(X) the_prompts.prompt_stack[the_prompts.top + X].suffix
/* Exported functions from event-top.c. /* Exported functions from event-top.c.
FIXME: these should really go into top.h. */ FIXME: these should really go into top.h. */

View file

@ -745,7 +745,7 @@ before_prompt_hook (const char *current_gdb_prompt)
/* If a prompt has been set, PROMPT will not be NULL. If it is /* If a prompt has been set, PROMPT will not be NULL. If it is
NULL, do not set the prompt. */ NULL, do not set the prompt. */
if (prompt != NULL) if (prompt != NULL)
set_prompt (prompt); set_prompt (prompt, 0);
do_cleanups (cleanup); do_cleanups (cleanup);
return; return;

View file

@ -65,6 +65,10 @@
#include "ui-out.h" #include "ui-out.h"
#include "cli-out.h" #include "cli-out.h"
#define PROMPT(X) the_prompts.prompt_stack[the_prompts.top + X].prompt
#define PREFIX(X) the_prompts.prompt_stack[the_prompts.top + X].prefix
#define SUFFIX(X) the_prompts.prompt_stack[the_prompts.top + X].suffix
/* Default command line prompt. This is overriden in some configs. */ /* Default command line prompt. This is overriden in some configs. */
#ifndef DEFAULT_PROMPT #ifndef DEFAULT_PROMPT
@ -533,7 +537,7 @@ command_loop (void)
while (instream && !feof (instream)) while (instream && !feof (instream))
{ {
if (window_hook && instream == stdin) if (window_hook && instream == stdin)
(*window_hook) (instream, get_prompt ()); (*window_hook) (instream, get_prompt (0));
quit_flag = 0; quit_flag = 0;
if (instream == stdin && stdin_is_tty) if (instream == stdin && stdin_is_tty)
@ -542,7 +546,7 @@ command_loop (void)
/* Get a command-line. This calls the readline package. */ /* Get a command-line. This calls the readline package. */
command = command_line_input (instream == stdin ? command = command_line_input (instream == stdin ?
get_prompt () : (char *) NULL, get_prompt (0) : (char *) NULL,
instream == stdin, "prompt"); instream == stdin, "prompt");
if (command == 0) if (command == 0)
{ {
@ -1124,26 +1128,98 @@ and \"show warranty\" for details.\n");
} }
} }
/* get_prompt: access method for the GDB prompt string. */
/* get_prefix: access method for the GDB prefix string. */
char * char *
get_prompt (void) get_prefix (int level)
{ {
return PROMPT (0); return PREFIX (level);
}
/* set_prefix: set method for the GDB prefix string. */
void
set_prefix (const char *s, int level)
{
/* If S is NULL, just free the PREFIX at level LEVEL and set to
NULL. */
if (s == NULL)
{
xfree (PREFIX (level));
PREFIX (level) = NULL;
}
else
{
char *p = xstrdup (s);
xfree (PREFIX (level));
PREFIX (level) = p;
}
}
/* get_suffix: access method for the GDB suffix string. */
char *
get_suffix (int level)
{
return SUFFIX (level);
}
/* set_suffix: set method for the GDB suffix string. */
void
set_suffix (const char *s, int level)
{
/* If S is NULL, just free the SUFFIX at level LEVEL and set to
NULL. */
if (s == NULL)
{
xfree (SUFFIX (level));
SUFFIX (level) = NULL;
}
else
{
char *p = xstrdup (s);
xfree (SUFFIX (level));
SUFFIX (level) = p;
}
}
/* get_prompt: access method for the GDB prompt string. */
char *
get_prompt (int level)
{
return PROMPT (level);
} }
void void
set_prompt (const char *s) set_prompt (const char *s, int level)
{ {
/* If S is NULL, just free the PROMPT at level LEVEL and set to
NULL. */
if (s == NULL)
{
xfree (PROMPT (level));
PROMPT (level) = NULL;
}
else
{
char *p = xstrdup (s); char *p = xstrdup (s);
xfree (PROMPT (0)); xfree (PROMPT (0));
PROMPT (0) = p; PROMPT (0) = p;
if (level == 0)
{
/* Also, free and set new_async_prompt so prompt changes sync up /* Also, free and set new_async_prompt so prompt changes sync up
with set/show prompt. */ with set/show prompt. */
xfree (new_async_prompt); xfree (new_async_prompt);
new_async_prompt = xstrdup (PROMPT (0)); new_async_prompt = xstrdup (PROMPT (0));
}
}
} }
@ -1534,13 +1610,11 @@ init_main (void)
whatever the DEFAULT_PROMPT is. */ whatever the DEFAULT_PROMPT is. */
the_prompts.top = 0; the_prompts.top = 0;
PREFIX (0) = ""; PREFIX (0) = "";
PROMPT (0) = xstrdup (DEFAULT_PROMPT); set_prompt (DEFAULT_PROMPT, 0);
SUFFIX (0) = ""; SUFFIX (0) = "";
/* Set things up for annotation_level > 1, if the user ever decides /* Set things up for annotation_level > 1, if the user ever decides
to use it. */ to use it. */
async_annotation_suffix = "prompt"; async_annotation_suffix = "prompt";
/* Set the variable associated with the setshow prompt command. */
new_async_prompt = xstrdup (PROMPT (0));
/* If gdb was started with --annotate=2, this is equivalent to the /* If gdb was started with --annotate=2, this is equivalent to the
user entering the command 'set annotate 2' at the gdb prompt, so user entering the command 'set annotate 2' at the gdb prompt, so

View file

@ -51,11 +51,27 @@ extern struct cleanup *prepare_execute_command (void);
/* This function returns a pointer to the string that is used /* This function returns a pointer to the string that is used
by gdb for its command prompt. */ by gdb for its command prompt. */
extern char *get_prompt (void); extern char *get_prompt (int);
/* This function copies the specified string into the string that /* This function copies the specified string into the string that
is used by gdb for its command prompt. */ is used by gdb for its command prompt. */
extern void set_prompt (const char *); extern void set_prompt (const char *, int level);
/* This function returns a pointer to the string that is used
by gdb for its command prompt prefix. */
extern char *get_prefix (int);
/* This function copies the specified string into the string that
is used by gdb for its command prompt prefix. */
extern void set_prefix (const char *, int);
/* This function returns a pointer to the string that is used
by gdb for its command prompt suffix. */
extern char *get_suffix (int);
/* This function copies the specified string into the string that
is used by gdb for its command prompt suffix. */
extern void set_suffix (const char *, int);
/* From random places. */ /* From random places. */
extern int readnow_symbol_files; extern int readnow_symbol_files;

View file

@ -145,17 +145,17 @@ tui_command_loop (void *data)
{ {
int length; int length;
char *a_prompt; char *a_prompt;
char *gdb_prompt = get_prompt (); char *gdb_prompt = get_prompt (0);
/* Tell readline what the prompt to display is and what function /* Tell readline what the prompt to display is and what function
it will need to call after a whole line is read. This also it will need to call after a whole line is read. This also
displays the first prompt. */ displays the first prompt. */
length = strlen (PREFIX (0)) length = strlen (get_prefix (0))
+ strlen (gdb_prompt) + strlen (SUFFIX (0)) + 1; + strlen (gdb_prompt) + strlen (get_suffix (0)) + 1;
a_prompt = (char *) alloca (length); a_prompt = (char *) alloca (length);
strcpy (a_prompt, PREFIX (0)); strcpy (a_prompt, get_prefix (0));
strcat (a_prompt, gdb_prompt); strcat (a_prompt, gdb_prompt);
strcat (a_prompt, SUFFIX (0)); strcat (a_prompt, get_suffix (0));
rl_callback_handler_install (a_prompt, input_handler); rl_callback_handler_install (a_prompt, input_handler);
} }
else else