From patchwork Thu Feb 18 17:40:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 10900 Received: (qmail 81681 invoked by alias); 18 Feb 2016 17:40:48 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 81528 invoked by uid 89); 18 Feb 2016 17:40:47 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=377 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 18 Feb 2016 17:40:45 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 27F04BF9CB for ; Thu, 18 Feb 2016 17:40:44 +0000 (UTC) Received: from brno.lan (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u1IHea7E012351 for ; Thu, 18 Feb 2016 12:40:43 -0500 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 08/10] Use struct buffer in gdb_readline_callback_no_editing Date: Thu, 18 Feb 2016 17:40:34 +0000 Message-Id: <1455817236-13642-9-git-send-email-palves@redhat.com> In-Reply-To: <1455817236-13642-1-git-send-email-palves@redhat.com> References: <1455817236-13642-1-git-send-email-palves@redhat.com> gdb/ChangeLog: 2016-02-18 Pedro Alves * event-top.c: Include buffer.h. (gdb_readline_callback_no_editing): Use struct buffer instead of xrealloc. --- gdb/event-top.c | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/gdb/event-top.c b/gdb/event-top.c index ee44197..3447fc8 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -37,6 +37,7 @@ #include "gdbcmd.h" /* for dont_repeat() */ #include "annotate.h" #include "maint.h" +#include "buffer.h" /* readline include files. */ #include "readline/readline.h" @@ -382,7 +383,7 @@ top_level_prompt (void) return xstrdup (prompt); } -/* When there is an event ready on the stdin file desriptor, instead +/* When there is an event ready on the stdin file descriptor, instead of calling readline directly throught the callback function, or instead of calling gdb_readline_callback_no_editing, give gdb a chance to detect errors and do something. */ @@ -678,10 +679,11 @@ gdb_readline_callback_no_editing (gdb_client_data client_data) { int c; char *result; - int input_index = 0; - int result_size = 80; + struct buffer line_buffer; static int done_once = 0; + buffer_init (&line_buffer); + /* Unbuffer the input stream, so that, later on, the calls to fgetc fetch only one char at the time from the stream. The fgetc's will get up to the first newline, but there may be more chars in the @@ -694,8 +696,6 @@ gdb_readline_callback_no_editing (gdb_client_data client_data) done_once = 1; } - result = (char *) xmalloc (result_size); - /* We still need the while loop here, even though it would seem obvious to invoke gdb_readline_callback_no_editing at every character entered. If not using the readline library, the @@ -712,32 +712,31 @@ gdb_readline_callback_no_editing (gdb_client_data client_data) if (c == EOF) { - if (input_index > 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); + 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 (buffer_finish (&line_buffer)); (*input_handler) (0); return; } 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'; + buffer_grow_char (&line_buffer, '\0'); + result = buffer_finish (&line_buffer); (*input_handler) (result); }