* [patch, rfc] Delete "set prompt-escape-char" command
@ 2003-08-07 23:15 Andrew Cagney
2003-08-08 1:01 ` Bob Rossi
0 siblings, 1 reply; 3+ messages in thread
From: Andrew Cagney @ 2003-08-07 23:15 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 333 bytes --]
Hello,
Following up the thread: set prompt-escape-character
http://sources.redhat.com/ml/gdb/2003-08/msg00051.html
this deletes the never documented "set prompt-escape-char" command and
associated prompt ``feature''. Comments? Objections? Should the NEWS
file even mention this?
Andrew (hopeing this will quietly go away :-)
[-- Attachment #2: diffs --]
[-- Type: text/plain, Size: 8730 bytes --]
2003-08-07 Andrew Cagney <cagney@redhat.com>
* top.c (get_prompt_1): Delete function.
(gdb_prompt_escape):
(init_main): Do not clear "gdb_prompt_escape". Delete "set
prompt-escape-char" command.
(MAX_PROMPT_SIZE): Delete macro.
(get_prompt): Simplify, do not call get_prompt_1.
Index: top.c
===================================================================
RCS file: /cvs/src/src/gdb/top.c,v
retrieving revision 1.74
diff -u -r1.74 top.c
--- top.c 4 Aug 2003 17:08:23 -0000 1.74
+++ top.c 7 Aug 2003 22:50:36 -0000
@@ -1388,267 +1388,13 @@
\f
/* get_prompt: access method for the GDB prompt string. */
-#define MAX_PROMPT_SIZE 256
-
-/*
- * int get_prompt_1 (char * buf);
- *
- * Work-horse for get_prompt (called via catch_errors).
- * Argument is buffer to hold the formatted prompt.
- *
- * Returns: 1 for success (use formatted prompt)
- * 0 for failure (use gdb_prompt_string).
- */
-
-static int gdb_prompt_escape;
-
-static int
-get_prompt_1 (void *data)
-{
- char *formatted_prompt = data;
- char *local_prompt;
-
- if (event_loop_p)
- local_prompt = PROMPT (0);
- else
- local_prompt = gdb_prompt_string;
-
-
- if (gdb_prompt_escape == 0)
- {
- return 0; /* do no formatting */
- }
- else
- /* formatted prompt */
- {
- char fmt[40], *promptp, *outp, *tmp;
- struct value *arg_val;
- DOUBLEST doubleval;
- LONGEST longval;
- CORE_ADDR addrval;
-
- int i, len;
- struct type *arg_type, *elt_type;
-
- promptp = local_prompt;
- outp = formatted_prompt;
-
- while (*promptp != '\0')
- {
- int available = MAX_PROMPT_SIZE - (outp - formatted_prompt) - 1;
-
- if (*promptp != gdb_prompt_escape)
- {
- if (available >= 1) /* overflow protect */
- *outp++ = *promptp++;
- }
- else
- {
- /* GDB prompt string contains escape char. Parse for arg.
- Two consecutive escape chars followed by arg followed by
- a comma means to insert the arg using a default format.
- Otherwise a printf format string may be included between
- the two escape chars. eg:
- %%foo, insert foo using default format
- %2.2f%foo, insert foo using "%2.2f" format
- A mismatch between the format string and the data type
- of "foo" is an error (which we don't know how to protect
- against). */
-
- fmt[0] = '\0'; /* assume null format string */
- if (promptp[1] == gdb_prompt_escape) /* double esc char */
- {
- promptp += 2; /* skip past two escape chars. */
- }
- else
- {
- /* extract format string from between two esc chars */
- i = 0;
- do
- {
- fmt[i++] = *promptp++; /* copy format string */
- }
- while (i < sizeof (fmt) - 1 &&
- *promptp != gdb_prompt_escape &&
- *promptp != '\0');
-
- if (*promptp != gdb_prompt_escape)
- error ("Syntax error at prompt position %d",
- (int) (promptp - local_prompt));
- else
- {
- promptp++; /* skip second escape char */
- fmt[i++] = '\0'; /* terminate the format string */
- }
- }
-
- arg_val = parse_to_comma_and_eval (&promptp);
- if (*promptp == ',')
- promptp++; /* skip past the comma */
- arg_type = check_typedef (VALUE_TYPE (arg_val));
- switch (TYPE_CODE (arg_type))
- {
- case TYPE_CODE_ARRAY:
- elt_type = check_typedef (TYPE_TARGET_TYPE (arg_type));
- if (TYPE_LENGTH (arg_type) > 0 &&
- TYPE_LENGTH (elt_type) == 1 &&
- TYPE_CODE (elt_type) == TYPE_CODE_INT)
- {
- int len = TYPE_LENGTH (arg_type);
-
- if (VALUE_LAZY (arg_val))
- value_fetch_lazy (arg_val);
- tmp = VALUE_CONTENTS (arg_val);
-
- if (len > available)
- len = available; /* overflow protect */
-
- /* FIXME: how to protect GDB from crashing
- from bad user-supplied format string? */
- if (fmt[0] != 0)
- sprintf (outp, fmt, tmp);
- else
- strncpy (outp, tmp, len);
- outp[len] = '\0';
- }
- break;
- case TYPE_CODE_PTR:
- elt_type = check_typedef (TYPE_TARGET_TYPE (arg_type));
- addrval = value_as_address (arg_val);
-
- if (TYPE_LENGTH (elt_type) == 1 &&
- TYPE_CODE (elt_type) == TYPE_CODE_INT &&
- addrval != 0)
- {
- /* display it as a string */
- char *default_fmt = "%s";
- char *tmp;
- int err = 0;
-
- /* Limiting the number of bytes that the following call
- will read protects us from sprintf overflow later. */
- i = target_read_string (addrval, /* src */
- &tmp, /* dest */
- available, /* len */
- &err);
- if (err) /* read failed */
- error ("%s on target_read", safe_strerror (err));
-
- tmp[i] = '\0'; /* force-terminate string */
- /* FIXME: how to protect GDB from crashing
- from bad user-supplied format string? */
- sprintf (outp, fmt[0] == 0 ? default_fmt : fmt,
- tmp);
- xfree (tmp);
- }
- else
- {
- /* display it as a pointer */
- char *default_fmt = "0x%x";
-
- /* FIXME: how to protect GDB from crashing
- from bad user-supplied format string? */
- if (available >= 16 /*? */ ) /* overflow protect */
- sprintf (outp, fmt[0] == 0 ? default_fmt : fmt,
- (long) addrval);
- }
- break;
- case TYPE_CODE_FLT:
- {
- char *default_fmt = "%g";
-
- doubleval = value_as_double (arg_val);
- /* FIXME: how to protect GDB from crashing
- from bad user-supplied format string? */
- if (available >= 16 /*? */ ) /* overflow protect */
- sprintf (outp, fmt[0] == 0 ? default_fmt : fmt,
- (double) doubleval);
- break;
- }
- case TYPE_CODE_INT:
- {
- char *default_fmt = "%d";
-
- longval = value_as_long (arg_val);
- /* FIXME: how to protect GDB from crashing
- from bad user-supplied format string? */
- if (available >= 16 /*? */ ) /* overflow protect */
- sprintf (outp, fmt[0] == 0 ? default_fmt : fmt,
- (long) longval);
- break;
- }
- case TYPE_CODE_BOOL:
- {
- /* no default format for bool */
- longval = value_as_long (arg_val);
- if (available >= 8 /*? */ ) /* overflow protect */
- {
- if (longval)
- strcpy (outp, "<true>");
- else
- strcpy (outp, "<false>");
- }
- break;
- }
- case TYPE_CODE_ENUM:
- {
- /* no default format for enum */
- longval = value_as_long (arg_val);
- len = TYPE_NFIELDS (arg_type);
- /* find enum name if possible */
- for (i = 0; i < len; i++)
- if (TYPE_FIELD_BITPOS (arg_type, i) == longval)
- break; /* match -- end loop */
-
- if (i < len) /* enum name found */
- {
- char *name = TYPE_FIELD_NAME (arg_type, i);
-
- strncpy (outp, name, available);
- /* in casel available < strlen (name), */
- outp[available] = '\0';
- }
- else
- {
- if (available >= 16 /*? */ ) /* overflow protect */
- sprintf (outp, "%ld", (long) longval);
- }
- break;
- }
- case TYPE_CODE_VOID:
- *outp = '\0';
- break; /* void type -- no output */
- default:
- error ("bad data type at prompt position %d",
- (int) (promptp - local_prompt));
- break;
- }
- outp += strlen (outp);
- }
- }
- *outp++ = '\0'; /* terminate prompt string */
- return 1;
- }
-}
-
char *
get_prompt (void)
{
- static char buf[MAX_PROMPT_SIZE];
-
- if (catch_errors (get_prompt_1, buf, "bad formatted prompt: ",
- RETURN_MASK_ALL))
- {
- return &buf[0]; /* successful formatted prompt */
- }
+ if (event_loop_p)
+ return PROMPT (0);
else
- {
- /* Prompt could not be formatted. */
- if (event_loop_p)
- return PROMPT (0);
- else
- return gdb_prompt_string;
- }
+ return gdb_prompt_string;
}
void
@@ -1946,7 +1692,6 @@
if (annotation_level > 1)
set_async_annotation_level (NULL, 0, NULL);
}
- gdb_prompt_escape = 0; /* default to none. */
/* Set the important stuff up for command editing. */
command_editing_p = 1;
@@ -1985,13 +1730,6 @@
add_show_from_set (c, &showlist);
set_cmd_sfunc (c, set_async_prompt);
}
-
- add_show_from_set
- (add_set_cmd ("prompt-escape-char", class_support, var_zinteger,
- (char *) &gdb_prompt_escape,
- "Set escape character for formatting of gdb's prompt",
- &setlist),
- &showlist);
add_com ("dont-repeat", class_support, dont_repeat_command, "Don't repeat this command.\n\
Primarily used inside of user-defined commands that should not be repeated when\n\
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [patch, rfc] Delete "set prompt-escape-char" command
2003-08-07 23:15 [patch, rfc] Delete "set prompt-escape-char" command Andrew Cagney
@ 2003-08-08 1:01 ` Bob Rossi
2003-08-16 18:39 ` Andrew Cagney
0 siblings, 1 reply; 3+ messages in thread
From: Bob Rossi @ 2003-08-08 1:01 UTC (permalink / raw)
To: Andrew Cagney; +Cc: gdb-patches
Geez, I would hope that the NEWS would mention it.
(gdb) apropos prompt
end -- Ends a list of commands or actions
set prompt -- Set gdb's prompt
set prompt-escape-char -- Set escape character for formatting of gdb's prompt
show prompt -- Show gdb's prompt
show prompt-escape-char -- Show escape character for formatting of gdb's prompt
I was tempted to use that feature for my front end, but decided not too.
Bob Rossi
On Thu, Aug 07, 2003 at 07:15:18PM -0400, Andrew Cagney wrote:
> Hello,
>
> Following up the thread: set prompt-escape-character
> http://sources.redhat.com/ml/gdb/2003-08/msg00051.html
>
> this deletes the never documented "set prompt-escape-char" command and
> associated prompt ``feature''. Comments? Objections? Should the NEWS
> file even mention this?
>
> Andrew (hopeing this will quietly go away :-)
> 2003-08-07 Andrew Cagney <cagney@redhat.com>
>
> * top.c (get_prompt_1): Delete function.
> (gdb_prompt_escape):
> (init_main): Do not clear "gdb_prompt_escape". Delete "set
> prompt-escape-char" command.
> (MAX_PROMPT_SIZE): Delete macro.
> (get_prompt): Simplify, do not call get_prompt_1.
>
> Index: top.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/top.c,v
> retrieving revision 1.74
> diff -u -r1.74 top.c
> --- top.c 4 Aug 2003 17:08:23 -0000 1.74
> +++ top.c 7 Aug 2003 22:50:36 -0000
> @@ -1388,267 +1388,13 @@
> \f
> /* get_prompt: access method for the GDB prompt string. */
>
> -#define MAX_PROMPT_SIZE 256
> -
> -/*
> - * int get_prompt_1 (char * buf);
> - *
> - * Work-horse for get_prompt (called via catch_errors).
> - * Argument is buffer to hold the formatted prompt.
> - *
> - * Returns: 1 for success (use formatted prompt)
> - * 0 for failure (use gdb_prompt_string).
> - */
> -
> -static int gdb_prompt_escape;
> -
> -static int
> -get_prompt_1 (void *data)
> -{
> - char *formatted_prompt = data;
> - char *local_prompt;
> -
> - if (event_loop_p)
> - local_prompt = PROMPT (0);
> - else
> - local_prompt = gdb_prompt_string;
> -
> -
> - if (gdb_prompt_escape == 0)
> - {
> - return 0; /* do no formatting */
> - }
> - else
> - /* formatted prompt */
> - {
> - char fmt[40], *promptp, *outp, *tmp;
> - struct value *arg_val;
> - DOUBLEST doubleval;
> - LONGEST longval;
> - CORE_ADDR addrval;
> -
> - int i, len;
> - struct type *arg_type, *elt_type;
> -
> - promptp = local_prompt;
> - outp = formatted_prompt;
> -
> - while (*promptp != '\0')
> - {
> - int available = MAX_PROMPT_SIZE - (outp - formatted_prompt) - 1;
> -
> - if (*promptp != gdb_prompt_escape)
> - {
> - if (available >= 1) /* overflow protect */
> - *outp++ = *promptp++;
> - }
> - else
> - {
> - /* GDB prompt string contains escape char. Parse for arg.
> - Two consecutive escape chars followed by arg followed by
> - a comma means to insert the arg using a default format.
> - Otherwise a printf format string may be included between
> - the two escape chars. eg:
> - %%foo, insert foo using default format
> - %2.2f%foo, insert foo using "%2.2f" format
> - A mismatch between the format string and the data type
> - of "foo" is an error (which we don't know how to protect
> - against). */
> -
> - fmt[0] = '\0'; /* assume null format string */
> - if (promptp[1] == gdb_prompt_escape) /* double esc char */
> - {
> - promptp += 2; /* skip past two escape chars. */
> - }
> - else
> - {
> - /* extract format string from between two esc chars */
> - i = 0;
> - do
> - {
> - fmt[i++] = *promptp++; /* copy format string */
> - }
> - while (i < sizeof (fmt) - 1 &&
> - *promptp != gdb_prompt_escape &&
> - *promptp != '\0');
> -
> - if (*promptp != gdb_prompt_escape)
> - error ("Syntax error at prompt position %d",
> - (int) (promptp - local_prompt));
> - else
> - {
> - promptp++; /* skip second escape char */
> - fmt[i++] = '\0'; /* terminate the format string */
> - }
> - }
> -
> - arg_val = parse_to_comma_and_eval (&promptp);
> - if (*promptp == ',')
> - promptp++; /* skip past the comma */
> - arg_type = check_typedef (VALUE_TYPE (arg_val));
> - switch (TYPE_CODE (arg_type))
> - {
> - case TYPE_CODE_ARRAY:
> - elt_type = check_typedef (TYPE_TARGET_TYPE (arg_type));
> - if (TYPE_LENGTH (arg_type) > 0 &&
> - TYPE_LENGTH (elt_type) == 1 &&
> - TYPE_CODE (elt_type) == TYPE_CODE_INT)
> - {
> - int len = TYPE_LENGTH (arg_type);
> -
> - if (VALUE_LAZY (arg_val))
> - value_fetch_lazy (arg_val);
> - tmp = VALUE_CONTENTS (arg_val);
> -
> - if (len > available)
> - len = available; /* overflow protect */
> -
> - /* FIXME: how to protect GDB from crashing
> - from bad user-supplied format string? */
> - if (fmt[0] != 0)
> - sprintf (outp, fmt, tmp);
> - else
> - strncpy (outp, tmp, len);
> - outp[len] = '\0';
> - }
> - break;
> - case TYPE_CODE_PTR:
> - elt_type = check_typedef (TYPE_TARGET_TYPE (arg_type));
> - addrval = value_as_address (arg_val);
> -
> - if (TYPE_LENGTH (elt_type) == 1 &&
> - TYPE_CODE (elt_type) == TYPE_CODE_INT &&
> - addrval != 0)
> - {
> - /* display it as a string */
> - char *default_fmt = "%s";
> - char *tmp;
> - int err = 0;
> -
> - /* Limiting the number of bytes that the following call
> - will read protects us from sprintf overflow later. */
> - i = target_read_string (addrval, /* src */
> - &tmp, /* dest */
> - available, /* len */
> - &err);
> - if (err) /* read failed */
> - error ("%s on target_read", safe_strerror (err));
> -
> - tmp[i] = '\0'; /* force-terminate string */
> - /* FIXME: how to protect GDB from crashing
> - from bad user-supplied format string? */
> - sprintf (outp, fmt[0] == 0 ? default_fmt : fmt,
> - tmp);
> - xfree (tmp);
> - }
> - else
> - {
> - /* display it as a pointer */
> - char *default_fmt = "0x%x";
> -
> - /* FIXME: how to protect GDB from crashing
> - from bad user-supplied format string? */
> - if (available >= 16 /*? */ ) /* overflow protect */
> - sprintf (outp, fmt[0] == 0 ? default_fmt : fmt,
> - (long) addrval);
> - }
> - break;
> - case TYPE_CODE_FLT:
> - {
> - char *default_fmt = "%g";
> -
> - doubleval = value_as_double (arg_val);
> - /* FIXME: how to protect GDB from crashing
> - from bad user-supplied format string? */
> - if (available >= 16 /*? */ ) /* overflow protect */
> - sprintf (outp, fmt[0] == 0 ? default_fmt : fmt,
> - (double) doubleval);
> - break;
> - }
> - case TYPE_CODE_INT:
> - {
> - char *default_fmt = "%d";
> -
> - longval = value_as_long (arg_val);
> - /* FIXME: how to protect GDB from crashing
> - from bad user-supplied format string? */
> - if (available >= 16 /*? */ ) /* overflow protect */
> - sprintf (outp, fmt[0] == 0 ? default_fmt : fmt,
> - (long) longval);
> - break;
> - }
> - case TYPE_CODE_BOOL:
> - {
> - /* no default format for bool */
> - longval = value_as_long (arg_val);
> - if (available >= 8 /*? */ ) /* overflow protect */
> - {
> - if (longval)
> - strcpy (outp, "<true>");
> - else
> - strcpy (outp, "<false>");
> - }
> - break;
> - }
> - case TYPE_CODE_ENUM:
> - {
> - /* no default format for enum */
> - longval = value_as_long (arg_val);
> - len = TYPE_NFIELDS (arg_type);
> - /* find enum name if possible */
> - for (i = 0; i < len; i++)
> - if (TYPE_FIELD_BITPOS (arg_type, i) == longval)
> - break; /* match -- end loop */
> -
> - if (i < len) /* enum name found */
> - {
> - char *name = TYPE_FIELD_NAME (arg_type, i);
> -
> - strncpy (outp, name, available);
> - /* in casel available < strlen (name), */
> - outp[available] = '\0';
> - }
> - else
> - {
> - if (available >= 16 /*? */ ) /* overflow protect */
> - sprintf (outp, "%ld", (long) longval);
> - }
> - break;
> - }
> - case TYPE_CODE_VOID:
> - *outp = '\0';
> - break; /* void type -- no output */
> - default:
> - error ("bad data type at prompt position %d",
> - (int) (promptp - local_prompt));
> - break;
> - }
> - outp += strlen (outp);
> - }
> - }
> - *outp++ = '\0'; /* terminate prompt string */
> - return 1;
> - }
> -}
> -
> char *
> get_prompt (void)
> {
> - static char buf[MAX_PROMPT_SIZE];
> -
> - if (catch_errors (get_prompt_1, buf, "bad formatted prompt: ",
> - RETURN_MASK_ALL))
> - {
> - return &buf[0]; /* successful formatted prompt */
> - }
> + if (event_loop_p)
> + return PROMPT (0);
> else
> - {
> - /* Prompt could not be formatted. */
> - if (event_loop_p)
> - return PROMPT (0);
> - else
> - return gdb_prompt_string;
> - }
> + return gdb_prompt_string;
> }
>
> void
> @@ -1946,7 +1692,6 @@
> if (annotation_level > 1)
> set_async_annotation_level (NULL, 0, NULL);
> }
> - gdb_prompt_escape = 0; /* default to none. */
>
> /* Set the important stuff up for command editing. */
> command_editing_p = 1;
> @@ -1985,13 +1730,6 @@
> add_show_from_set (c, &showlist);
> set_cmd_sfunc (c, set_async_prompt);
> }
> -
> - add_show_from_set
> - (add_set_cmd ("prompt-escape-char", class_support, var_zinteger,
> - (char *) &gdb_prompt_escape,
> - "Set escape character for formatting of gdb's prompt",
> - &setlist),
> - &showlist);
>
> add_com ("dont-repeat", class_support, dont_repeat_command, "Don't repeat this command.\n\
> Primarily used inside of user-defined commands that should not be repeated when\n\
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [patch, rfc] Delete "set prompt-escape-char" command
2003-08-08 1:01 ` Bob Rossi
@ 2003-08-16 18:39 ` Andrew Cagney
0 siblings, 0 replies; 3+ messages in thread
From: Andrew Cagney @ 2003-08-16 18:39 UTC (permalink / raw)
To: Bob Rossi; +Cc: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 695 bytes --]
> Geez, I would hope that the NEWS would mention it.
Good point, the attached, which I've committed, includes a NEWS entry.
> (gdb) apropos prompt
> end -- Ends a list of commands or actions
> set prompt -- Set gdb's prompt
> set prompt-escape-char -- Set escape character for formatting of gdb's prompt
> show prompt -- Show gdb's prompt
> show prompt-escape-char -- Show escape character for formatting of gdb's prompt
>
> I was tempted to use that feature for my front end, but decided not too.
I'd like to know how :-) It isn't documented and its behavior, without
very careful study of the source, is impossible to decipher and pretty
much guarenteed to be non-portable :-(
Andrew
[-- Attachment #2: diffs --]
[-- Type: text/plain, Size: 9374 bytes --]
2003-08-16 Andrew Cagney <cagney@redhat.com>
* NEWS: Mention that "set prompt-escape-char" was deleted.
* top.c (get_prompt_1): Delete function.
(gdb_prompt_escape):
(init_main): Do not clear "gdb_prompt_escape". Delete "set
prompt-escape-char" command.
(MAX_PROMPT_SIZE): Delete macro.
(get_prompt): Simplify, do not call get_prompt_1.
Index: NEWS
===================================================================
RCS file: /cvs/src/src/gdb/NEWS,v
retrieving revision 1.116
diff -u -r1.116 NEWS
--- NEWS 8 Aug 2003 22:26:37 -0000 1.116
+++ NEWS 16 Aug 2003 18:37:04 -0000
@@ -3,6 +3,12 @@
*** Changes since GDB 6.0:
+* "set prompt-escape-char" command deleted.
+
+The command "set prompt-escape-char" has been deleted. This command,
+and its very obscure effet on GDB's prompt, was never documented,
+tested, nor mentioned in the NEWS file.
+
*** Changes in GDB 6.0:
* GDB supports logging output to a file
Index: top.c
===================================================================
RCS file: /cvs/src/src/gdb/top.c,v
retrieving revision 1.74
diff -u -r1.74 top.c
--- top.c 4 Aug 2003 17:08:23 -0000 1.74
+++ top.c 16 Aug 2003 18:37:04 -0000
@@ -1388,267 +1388,13 @@
\f
/* get_prompt: access method for the GDB prompt string. */
-#define MAX_PROMPT_SIZE 256
-
-/*
- * int get_prompt_1 (char * buf);
- *
- * Work-horse for get_prompt (called via catch_errors).
- * Argument is buffer to hold the formatted prompt.
- *
- * Returns: 1 for success (use formatted prompt)
- * 0 for failure (use gdb_prompt_string).
- */
-
-static int gdb_prompt_escape;
-
-static int
-get_prompt_1 (void *data)
-{
- char *formatted_prompt = data;
- char *local_prompt;
-
- if (event_loop_p)
- local_prompt = PROMPT (0);
- else
- local_prompt = gdb_prompt_string;
-
-
- if (gdb_prompt_escape == 0)
- {
- return 0; /* do no formatting */
- }
- else
- /* formatted prompt */
- {
- char fmt[40], *promptp, *outp, *tmp;
- struct value *arg_val;
- DOUBLEST doubleval;
- LONGEST longval;
- CORE_ADDR addrval;
-
- int i, len;
- struct type *arg_type, *elt_type;
-
- promptp = local_prompt;
- outp = formatted_prompt;
-
- while (*promptp != '\0')
- {
- int available = MAX_PROMPT_SIZE - (outp - formatted_prompt) - 1;
-
- if (*promptp != gdb_prompt_escape)
- {
- if (available >= 1) /* overflow protect */
- *outp++ = *promptp++;
- }
- else
- {
- /* GDB prompt string contains escape char. Parse for arg.
- Two consecutive escape chars followed by arg followed by
- a comma means to insert the arg using a default format.
- Otherwise a printf format string may be included between
- the two escape chars. eg:
- %%foo, insert foo using default format
- %2.2f%foo, insert foo using "%2.2f" format
- A mismatch between the format string and the data type
- of "foo" is an error (which we don't know how to protect
- against). */
-
- fmt[0] = '\0'; /* assume null format string */
- if (promptp[1] == gdb_prompt_escape) /* double esc char */
- {
- promptp += 2; /* skip past two escape chars. */
- }
- else
- {
- /* extract format string from between two esc chars */
- i = 0;
- do
- {
- fmt[i++] = *promptp++; /* copy format string */
- }
- while (i < sizeof (fmt) - 1 &&
- *promptp != gdb_prompt_escape &&
- *promptp != '\0');
-
- if (*promptp != gdb_prompt_escape)
- error ("Syntax error at prompt position %d",
- (int) (promptp - local_prompt));
- else
- {
- promptp++; /* skip second escape char */
- fmt[i++] = '\0'; /* terminate the format string */
- }
- }
-
- arg_val = parse_to_comma_and_eval (&promptp);
- if (*promptp == ',')
- promptp++; /* skip past the comma */
- arg_type = check_typedef (VALUE_TYPE (arg_val));
- switch (TYPE_CODE (arg_type))
- {
- case TYPE_CODE_ARRAY:
- elt_type = check_typedef (TYPE_TARGET_TYPE (arg_type));
- if (TYPE_LENGTH (arg_type) > 0 &&
- TYPE_LENGTH (elt_type) == 1 &&
- TYPE_CODE (elt_type) == TYPE_CODE_INT)
- {
- int len = TYPE_LENGTH (arg_type);
-
- if (VALUE_LAZY (arg_val))
- value_fetch_lazy (arg_val);
- tmp = VALUE_CONTENTS (arg_val);
-
- if (len > available)
- len = available; /* overflow protect */
-
- /* FIXME: how to protect GDB from crashing
- from bad user-supplied format string? */
- if (fmt[0] != 0)
- sprintf (outp, fmt, tmp);
- else
- strncpy (outp, tmp, len);
- outp[len] = '\0';
- }
- break;
- case TYPE_CODE_PTR:
- elt_type = check_typedef (TYPE_TARGET_TYPE (arg_type));
- addrval = value_as_address (arg_val);
-
- if (TYPE_LENGTH (elt_type) == 1 &&
- TYPE_CODE (elt_type) == TYPE_CODE_INT &&
- addrval != 0)
- {
- /* display it as a string */
- char *default_fmt = "%s";
- char *tmp;
- int err = 0;
-
- /* Limiting the number of bytes that the following call
- will read protects us from sprintf overflow later. */
- i = target_read_string (addrval, /* src */
- &tmp, /* dest */
- available, /* len */
- &err);
- if (err) /* read failed */
- error ("%s on target_read", safe_strerror (err));
-
- tmp[i] = '\0'; /* force-terminate string */
- /* FIXME: how to protect GDB from crashing
- from bad user-supplied format string? */
- sprintf (outp, fmt[0] == 0 ? default_fmt : fmt,
- tmp);
- xfree (tmp);
- }
- else
- {
- /* display it as a pointer */
- char *default_fmt = "0x%x";
-
- /* FIXME: how to protect GDB from crashing
- from bad user-supplied format string? */
- if (available >= 16 /*? */ ) /* overflow protect */
- sprintf (outp, fmt[0] == 0 ? default_fmt : fmt,
- (long) addrval);
- }
- break;
- case TYPE_CODE_FLT:
- {
- char *default_fmt = "%g";
-
- doubleval = value_as_double (arg_val);
- /* FIXME: how to protect GDB from crashing
- from bad user-supplied format string? */
- if (available >= 16 /*? */ ) /* overflow protect */
- sprintf (outp, fmt[0] == 0 ? default_fmt : fmt,
- (double) doubleval);
- break;
- }
- case TYPE_CODE_INT:
- {
- char *default_fmt = "%d";
-
- longval = value_as_long (arg_val);
- /* FIXME: how to protect GDB from crashing
- from bad user-supplied format string? */
- if (available >= 16 /*? */ ) /* overflow protect */
- sprintf (outp, fmt[0] == 0 ? default_fmt : fmt,
- (long) longval);
- break;
- }
- case TYPE_CODE_BOOL:
- {
- /* no default format for bool */
- longval = value_as_long (arg_val);
- if (available >= 8 /*? */ ) /* overflow protect */
- {
- if (longval)
- strcpy (outp, "<true>");
- else
- strcpy (outp, "<false>");
- }
- break;
- }
- case TYPE_CODE_ENUM:
- {
- /* no default format for enum */
- longval = value_as_long (arg_val);
- len = TYPE_NFIELDS (arg_type);
- /* find enum name if possible */
- for (i = 0; i < len; i++)
- if (TYPE_FIELD_BITPOS (arg_type, i) == longval)
- break; /* match -- end loop */
-
- if (i < len) /* enum name found */
- {
- char *name = TYPE_FIELD_NAME (arg_type, i);
-
- strncpy (outp, name, available);
- /* in casel available < strlen (name), */
- outp[available] = '\0';
- }
- else
- {
- if (available >= 16 /*? */ ) /* overflow protect */
- sprintf (outp, "%ld", (long) longval);
- }
- break;
- }
- case TYPE_CODE_VOID:
- *outp = '\0';
- break; /* void type -- no output */
- default:
- error ("bad data type at prompt position %d",
- (int) (promptp - local_prompt));
- break;
- }
- outp += strlen (outp);
- }
- }
- *outp++ = '\0'; /* terminate prompt string */
- return 1;
- }
-}
-
char *
get_prompt (void)
{
- static char buf[MAX_PROMPT_SIZE];
-
- if (catch_errors (get_prompt_1, buf, "bad formatted prompt: ",
- RETURN_MASK_ALL))
- {
- return &buf[0]; /* successful formatted prompt */
- }
+ if (event_loop_p)
+ return PROMPT (0);
else
- {
- /* Prompt could not be formatted. */
- if (event_loop_p)
- return PROMPT (0);
- else
- return gdb_prompt_string;
- }
+ return gdb_prompt_string;
}
void
@@ -1946,7 +1692,6 @@
if (annotation_level > 1)
set_async_annotation_level (NULL, 0, NULL);
}
- gdb_prompt_escape = 0; /* default to none. */
/* Set the important stuff up for command editing. */
command_editing_p = 1;
@@ -1985,13 +1730,6 @@
add_show_from_set (c, &showlist);
set_cmd_sfunc (c, set_async_prompt);
}
-
- add_show_from_set
- (add_set_cmd ("prompt-escape-char", class_support, var_zinteger,
- (char *) &gdb_prompt_escape,
- "Set escape character for formatting of gdb's prompt",
- &setlist),
- &showlist);
add_com ("dont-repeat", class_support, dont_repeat_command, "Don't repeat this command.\n\
Primarily used inside of user-defined commands that should not be repeated when\n\
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2003-08-16 18:39 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-08-07 23:15 [patch, rfc] Delete "set prompt-escape-char" command Andrew Cagney
2003-08-08 1:01 ` Bob Rossi
2003-08-16 18:39 ` Andrew Cagney
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox