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:
Pedro Alves 2016-03-09 18:25:00 +00:00
parent c5c136ea94
commit 7a3bde34bc
3 changed files with 34 additions and 22 deletions

View File

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

View File

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

View File

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