Use struct buffer in gdb_readline_no_editing
gdb/ChangeLog: 2016-03-09 Pedro Alves <palves@redhat.com> * common/buffer.h (buffer_grow_char): New function. * top.c: Include buffer.h. (gdb_readline_no_editing): Rename 'prompt_arg' parameter to 'prompt'. Use struct buffer instead of xrealloc.
This commit is contained in:
parent
c5c136ea94
commit
7a3bde34bc
@ -1,3 +1,10 @@
|
||||
2016-03-09 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* common/buffer.h (buffer_grow_char): New function.
|
||||
* top.c: Include buffer.h.
|
||||
(gdb_readline_no_editing): Rename 'prompt_arg' parameter to
|
||||
'prompt'. Use struct buffer instead of xrealloc.
|
||||
|
||||
2016-03-09 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* defs.h (gdb_readline): Delete declaration.
|
||||
|
@ -31,6 +31,15 @@ struct buffer
|
||||
accommodate the new data. */
|
||||
void buffer_grow (struct buffer *buffer, const char *data, size_t size);
|
||||
|
||||
/* Append C to the end of BUFFER. Grows the buffer to accommodate the
|
||||
new data. */
|
||||
|
||||
static inline void
|
||||
buffer_grow_char (struct buffer *buffer, char c)
|
||||
{
|
||||
buffer_grow (buffer, &c, 1);
|
||||
}
|
||||
|
||||
/* Release any memory held by BUFFER. */
|
||||
void buffer_free (struct buffer *buffer);
|
||||
|
||||
|
40
gdb/top.c
40
gdb/top.c
@ -50,6 +50,7 @@
|
||||
#include "maint.h"
|
||||
#include "filenames.h"
|
||||
#include "frame.h"
|
||||
#include "buffer.h"
|
||||
|
||||
/* readline include files. */
|
||||
#include "readline/readline.h"
|
||||
@ -603,65 +604,60 @@ prevent_dont_repeat (void)
|
||||
|
||||
/* Read a line from the stream "instream" without command line editing.
|
||||
|
||||
It prints PROMPT_ARG once at the start.
|
||||
It prints PROMPT once at the start.
|
||||
Action is compatible with "readline", e.g. space for the result is
|
||||
malloc'd and should be freed by the caller.
|
||||
|
||||
A NULL return means end of file. */
|
||||
|
||||
static char *
|
||||
gdb_readline_no_editing (const char *prompt_arg)
|
||||
gdb_readline_no_editing (const char *prompt)
|
||||
{
|
||||
int c;
|
||||
char *result;
|
||||
int input_index = 0;
|
||||
int result_size = 80;
|
||||
struct buffer line_buffer;
|
||||
|
||||
if (prompt_arg)
|
||||
buffer_init (&line_buffer);
|
||||
|
||||
if (prompt != NULL)
|
||||
{
|
||||
/* Don't use a _filtered function here. It causes the assumed
|
||||
character position to be off, since the newline we read from
|
||||
the user is not accounted for. */
|
||||
fputs_unfiltered (prompt_arg, gdb_stdout);
|
||||
fputs_unfiltered (prompt, gdb_stdout);
|
||||
gdb_flush (gdb_stdout);
|
||||
}
|
||||
|
||||
result = (char *) xmalloc (result_size);
|
||||
|
||||
while (1)
|
||||
{
|
||||
int c;
|
||||
|
||||
/* Read from stdin if we are executing a user defined command.
|
||||
This is the right thing for prompt_for_continue, at least. */
|
||||
c = fgetc (instream ? instream : stdin);
|
||||
|
||||
if (c == EOF)
|
||||
{
|
||||
if (input_index > 0)
|
||||
if (line_buffer.used_size > 0)
|
||||
/* The last line does not end with a newline. Return it, and
|
||||
if we are called again fgetc will still return EOF and
|
||||
we'll return NULL then. */
|
||||
break;
|
||||
xfree (result);
|
||||
xfree (buffer_finish (&line_buffer));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (c == '\n')
|
||||
{
|
||||
if (input_index > 0 && result[input_index - 1] == '\r')
|
||||
input_index--;
|
||||
if (line_buffer.used_size > 0
|
||||
&& line_buffer.buffer[line_buffer.used_size - 1] == '\r')
|
||||
line_buffer.used_size--;
|
||||
break;
|
||||
}
|
||||
|
||||
result[input_index++] = c;
|
||||
while (input_index >= result_size)
|
||||
{
|
||||
result_size *= 2;
|
||||
result = (char *) xrealloc (result, result_size);
|
||||
}
|
||||
buffer_grow_char (&line_buffer, c);
|
||||
}
|
||||
|
||||
result[input_index++] = '\0';
|
||||
return result;
|
||||
buffer_grow_char (&line_buffer, '\0');
|
||||
return buffer_finish (&line_buffer);
|
||||
}
|
||||
|
||||
/* Variables which control command line editing and history
|
||||
|
Loading…
x
Reference in New Issue
Block a user