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.
This commit is contained in:
Andrew Cagney 2003-08-16 18:38:46 +00:00
parent 4677b45628
commit 7989c619f9
3 changed files with 19 additions and 265 deletions

View File

@ -1,3 +1,13 @@
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.
2003-08-16 Andrew Cagney <cagney@redhat.com>
* Makefile.in (printcmd.o, valprint.o): Do not try to build with

View File

@ -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

268
gdb/top.c
View File

@ -1388,267 +1388,13 @@ There is absolutely no warranty for GDB. Type \"show warranty\" for details.\n"
/* 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 @@ init_main (void)
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;
@ -1986,13 +1731,6 @@ init_main (void)
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\
hitting return.");