From 95298e7219e23ca184786a3192df7ab3767ce25a Mon Sep 17 00:00:00 2001 From: Phil Muldoon Date: Fri, 22 Jul 2011 09:22:50 +0000 Subject: [PATCH] 2011-07-22 Phil Muldoon * 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. --- gdb/ChangeLog | 27 +++++++++++ gdb/event-top.c | 61 ++++++++++++------------- gdb/event-top.h | 3 -- gdb/python/python.c | 2 +- gdb/top.c | 106 ++++++++++++++++++++++++++++++++++++------- gdb/top.h | 20 +++++++- gdb/tui/tui-interp.c | 10 ++-- 7 files changed, 170 insertions(+), 59 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 14e2a7f8f7a..614fca4ac21 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,30 @@ +2011-07-22 Phil Muldoon + + * 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 * defs.h: Add guard against inclusion in gdbserver. diff --git a/gdb/event-top.c b/gdb/event-top.c index 22f94409acf..378827282fa 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -191,17 +191,17 @@ cli_command_loop (void) { int length; 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 it will need to call after a whole line is read. This also displays the first prompt. */ - length = strlen (PREFIX (0)) - + strlen (gdb_prompt) + strlen (SUFFIX (0)) + 1; + length = strlen (get_prefix (0)) + + strlen (gdb_prompt) + strlen (get_suffix(0)) + 1; a_prompt = (char *) alloca (length); - strcpy (a_prompt, PREFIX (0)); + strcpy (a_prompt, get_prefix (0)); strcat (a_prompt, gdb_prompt); - strcat (a_prompt, SUFFIX (0)); + strcat (a_prompt, get_suffix (0)); rl_callback_handler_install (a_prompt, input_handler); } else @@ -276,10 +276,10 @@ display_gdb_prompt (char *new_prompt) if (! new_prompt) { 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); - post_gdb_prompt = get_prompt (); + post_gdb_prompt = get_prompt (0); /* If the observer changed the prompt, use that prompt. */ if (strcmp (pre_gdb_prompt, post_gdb_prompt) != 0) @@ -317,18 +317,18 @@ display_gdb_prompt (char *new_prompt) if (! new_prompt) { /* Just use the top of the prompt stack. */ - prompt_length = strlen (PREFIX (0)) + - strlen (SUFFIX (0)) + - strlen (get_prompt()) + 1; + prompt_length = strlen (get_prefix (0)) + + strlen (get_suffix (0)) + + strlen (get_prompt (0)) + 1; actual_gdb_prompt = (char *) alloca (prompt_length); /* Prefix needs to have new line at end. */ - strcpy (actual_gdb_prompt, PREFIX (0)); - strcat (actual_gdb_prompt, get_prompt()); + strcpy (actual_gdb_prompt, get_prefix (0)); + strcat (actual_gdb_prompt, get_prompt (0)); /* Suffix needs to have a new line at end and \032 \032 at beginning. */ - strcat (actual_gdb_prompt, SUFFIX (0)); + strcat (actual_gdb_prompt, get_suffix (0)); } else actual_gdb_prompt = new_prompt;; @@ -361,7 +361,7 @@ change_annotation_level (void) { 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 using gdb w/o the --async switch. */ @@ -371,7 +371,7 @@ change_annotation_level (void) 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. */ prefix = (char *) alloca (strlen (async_annotation_suffix) + 10); @@ -389,7 +389,7 @@ change_annotation_level (void) } 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_prompt (); @@ -405,17 +405,17 @@ void push_prompt (char *prefix, char *prompt, char *suffix) { the_prompts.top++; - PREFIX (0) = xstrdup (prefix); + set_prefix (prefix, 0); /* Note that this function is used by the set annotate 2 command. This is why we take care of saving the old prompt in case a new one is not specified. */ if (prompt) - PROMPT (0) = xstrdup (prompt); + set_prompt (prompt, 0); 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 @@ -425,20 +425,17 @@ pop_prompt (void) { /* If we are not during a 'synchronous' execution command, in which 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 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 in effect, until the user does another 'set prompt'. */ - if (strcmp (PROMPT (0), PROMPT (-1))) - { - xfree (PROMPT (-1)); - PROMPT (-1) = xstrdup (PROMPT (0)); - } - - xfree (PREFIX (0)); - xfree (PROMPT (0)); - xfree (SUFFIX (0)); + if (strcmp (get_prompt (0), get_prompt (-1))) + set_prompt (get_prompt (0), -1); + + set_prefix (NULL, 0); + set_prompt (NULL, 0); + set_suffix (NULL, 0); the_prompts.top--; } @@ -983,7 +980,7 @@ handle_stop_sig (int sig) static void async_stop_sig (gdb_client_data arg) { - char *prompt = get_prompt (); + char *prompt = get_prompt (0); #if STOP_SIGNAL == SIGTSTP signal (SIGTSTP, SIG_DFL); @@ -1061,7 +1058,7 @@ set_async_annotation_level (char *args, int from_tty, void 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 diff --git a/gdb/event-top.h b/gdb/event-top.h index 85501644235..952abdb39bd 100644 --- a/gdb/event-top.h +++ b/gdb/event-top.h @@ -69,9 +69,6 @@ struct prompts 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. FIXME: these should really go into top.h. */ diff --git a/gdb/python/python.c b/gdb/python/python.c index e3a8d195e45..16c0a6e27b4 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -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 NULL, do not set the prompt. */ if (prompt != NULL) - set_prompt (prompt); + set_prompt (prompt, 0); do_cleanups (cleanup); return; diff --git a/gdb/top.c b/gdb/top.c index 3ffd0002575..8dba0e086b3 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -65,6 +65,10 @@ #include "ui-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. */ #ifndef DEFAULT_PROMPT @@ -533,7 +537,7 @@ command_loop (void) while (instream && !feof (instream)) { if (window_hook && instream == stdin) - (*window_hook) (instream, get_prompt ()); + (*window_hook) (instream, get_prompt (0)); quit_flag = 0; if (instream == stdin && stdin_is_tty) @@ -542,7 +546,7 @@ command_loop (void) /* Get a command-line. This calls the readline package. */ command = command_line_input (instream == stdin ? - get_prompt () : (char *) NULL, + get_prompt (0) : (char *) NULL, instream == stdin, "prompt"); 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 * -get_prompt (void) +get_prefix (int level) { - return PROMPT (0); + return PREFIX (level); } +/* set_prefix: set method for the GDB prefix string. */ + void -set_prompt (const char *s) +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) { - char *p = xstrdup (s); + return SUFFIX (level); +} - xfree (PROMPT (0)); - PROMPT (0) = p; +/* set_suffix: set method for the GDB suffix string. */ - /* Also, free and set new_async_prompt so prompt changes sync up - with set/show prompt. */ - xfree (new_async_prompt); - new_async_prompt = xstrdup (PROMPT (0)); +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 +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); + + xfree (PROMPT (0)); + PROMPT (0) = p; + + if (level == 0) + { + /* Also, free and set new_async_prompt so prompt changes sync up + with set/show prompt. */ + xfree (new_async_prompt); + new_async_prompt = xstrdup (PROMPT (0)); + } + } } @@ -1534,13 +1610,11 @@ init_main (void) whatever the DEFAULT_PROMPT is. */ the_prompts.top = 0; PREFIX (0) = ""; - PROMPT (0) = xstrdup (DEFAULT_PROMPT); + set_prompt (DEFAULT_PROMPT, 0); SUFFIX (0) = ""; /* Set things up for annotation_level > 1, if the user ever decides to use it. */ 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 user entering the command 'set annotate 2' at the gdb prompt, so diff --git a/gdb/top.h b/gdb/top.h index 24ec2f20c51..3c1ec1493de 100644 --- a/gdb/top.h +++ b/gdb/top.h @@ -51,11 +51,27 @@ extern struct cleanup *prepare_execute_command (void); /* This function returns a pointer to the string that is used 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 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. */ extern int readnow_symbol_files; diff --git a/gdb/tui/tui-interp.c b/gdb/tui/tui-interp.c index d79de2bf990..919d1ac4ba3 100644 --- a/gdb/tui/tui-interp.c +++ b/gdb/tui/tui-interp.c @@ -145,17 +145,17 @@ tui_command_loop (void *data) { int length; 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 it will need to call after a whole line is read. This also displays the first prompt. */ - length = strlen (PREFIX (0)) - + strlen (gdb_prompt) + strlen (SUFFIX (0)) + 1; + length = strlen (get_prefix (0)) + + strlen (gdb_prompt) + strlen (get_suffix (0)) + 1; a_prompt = (char *) alloca (length); - strcpy (a_prompt, PREFIX (0)); + strcpy (a_prompt, get_prefix (0)); strcat (a_prompt, gdb_prompt); - strcat (a_prompt, SUFFIX (0)); + strcat (a_prompt, get_suffix (0)); rl_callback_handler_install (a_prompt, input_handler); } else -- 2.30.2