From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19600 invoked by alias); 19 Oct 2016 01:19:33 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 19582 invoked by uid 89); 19 Oct 2016 01:19:33 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.2 required=5.0 tests=BAYES_00,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=no version=3.3.2 spammy=7838, 783,8 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 ESMTP; Wed, 19 Oct 2016 01:19:31 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 184434E4F6 for ; Wed, 19 Oct 2016 01:12:24 +0000 (UTC) Received: from cascais.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u9J1CJjZ019701 for ; Tue, 18 Oct 2016 21:12:23 -0400 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH v2 04/31] cli-script.c: Simplify using std::string, eliminate cleanups Date: Wed, 19 Oct 2016 01:19:00 -0000 Message-Id: <1476839539-8374-5-git-send-email-palves@redhat.com> In-Reply-To: <1476839539-8374-1-git-send-email-palves@redhat.com> References: <1476839539-8374-1-git-send-email-palves@redhat.com> X-SW-Source: 2016-10/txt/msg00550.txt.bz2 gdb/ChangeLog: yyyy-mm-dd Pedro Alves * cli/cli-script.c (execute_control_command): Use std::string instead of cleanups. (locate_arg): Constify return type. (insert_args): Constify paremeter. Simplify using std::string. Return a std::string. --- gdb/cli/cli-script.c | 110 ++++++++++++++++----------------------------------- 1 file changed, 33 insertions(+), 77 deletions(-) diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c index c36cce6..6f1cc8a 100644 --- a/gdb/cli/cli-script.c +++ b/gdb/cli/cli-script.c @@ -41,7 +41,7 @@ recurse_read_control_structure (char * (*read_next_line_func) (void), void (*validator)(char *, void *), void *closure); -static char *insert_args (char *line); +static std::string insert_args (const char *line); static struct cleanup * setup_user_args (char *p); @@ -448,7 +448,6 @@ execute_control_command (struct command_line *cmd) struct value *val_mark; int loop; enum command_control_type ret; - char *new_line; /* Start by assuming failure, if a problem is detected, the code below will simply "break" out of the switch. */ @@ -457,12 +456,13 @@ execute_control_command (struct command_line *cmd) switch (cmd->control_type) { case simple_control: - /* A simple command, execute it and return. */ - new_line = insert_args (cmd->line); - make_cleanup (free_current_contents, &new_line); - execute_command (new_line, 0); - ret = cmd->control_type; - break; + { + /* A simple command, execute it and return. */ + std::string new_line = insert_args (cmd->line); + execute_command (&new_line[0], 0); + ret = cmd->control_type; + break; + } case continue_control: print_command_trace ("loop_continue"); @@ -489,9 +489,8 @@ execute_control_command (struct command_line *cmd) print_command_trace (buffer); /* Parse the loop control expression for the while statement. */ - new_line = insert_args (cmd->line); - make_cleanup (free_current_contents, &new_line); - expr = parse_expression (new_line); + std::string new_line = insert_args (cmd->line); + expr = parse_expression (new_line.c_str ()); make_cleanup (free_current_contents, &expr); ret = simple_control; @@ -555,10 +554,9 @@ execute_control_command (struct command_line *cmd) xsnprintf (buffer, len, "if %s", cmd->line); print_command_trace (buffer); - new_line = insert_args (cmd->line); - make_cleanup (free_current_contents, &new_line); /* Parse the conditional for the if statement. */ - expr = parse_expression (new_line); + std::string new_line = insert_args (cmd->line); + expr = parse_expression (new_line.c_str ()); make_cleanup (free_current_contents, &expr); current = NULL; @@ -598,9 +596,8 @@ execute_control_command (struct command_line *cmd) { /* Breakpoint commands list, record the commands in the breakpoint's command list and return. */ - new_line = insert_args (cmd->line); - make_cleanup (free_current_contents, &new_line); - ret = commands_from_control_command (new_line, cmd); + std::string new_line = insert_args (cmd->line); + ret = commands_from_control_command (new_line.c_str (), cmd); break; } @@ -786,8 +783,8 @@ setup_user_args (char *p) /* Given character string P, return a point to the first argument ($arg), or NULL if P contains no arguments. */ -static char * -locate_arg (char *p) +static const char * +locate_arg (const char *p) { while ((p = strchr (p, '$'))) { @@ -800,93 +797,52 @@ locate_arg (char *p) } /* Insert the user defined arguments stored in user_arg into the $arg - arguments found in line, with the updated copy being placed into - nline. */ + arguments found in line. */ -static char * -insert_args (char *line) +static std::string +insert_args (const char *line) { - char *p, *save_line, *new_line; - unsigned len, i; - /* If we are not in a user-defined function, treat $argc, $arg0, et cetera as normal convenience variables. */ if (user_args == NULL) - return xstrdup (line); + return line; - /* First we need to know how much memory to allocate for the new - line. */ - save_line = line; - len = 0; - while ((p = locate_arg (line))) - { - len += p - line; - i = p[4] - '0'; - - if (p[4] == 'c') - { - /* $argc. Number will be <=10. */ - len += user_args->count == 10 ? 2 : 1; - } - else if (i >= user_args->count) - { - error (_("Missing argument %d in user function."), i); - return NULL; - } - else - { - len += user_args->a[i].len; - } - line = p + 5; - } - - /* Don't forget the tail. */ - len += strlen (line); - - /* Allocate space for the new line and fill it in. */ - new_line = (char *) xmalloc (len + 1); - - /* Restore pointer to beginning of old line. */ - line = save_line; - - /* Save pointer to beginning of new line. */ - save_line = new_line; + std::string new_line; + const char *p; while ((p = locate_arg (line))) { int i, len; - memcpy (new_line, line, p - line); - new_line += p - line; + new_line.append (line, p - line); if (p[4] == 'c') { gdb_assert (user_args->count >= 0 && user_args->count <= 10); if (user_args->count == 10) { - *(new_line++) = '1'; - *(new_line++) = '0'; + new_line += '1'; + new_line += '0'; } else - *(new_line++) = user_args->count + '0'; + new_line += user_args->count + '0'; } else { i = p[4] - '0'; + if (i >= user_args->count) + error (_("Missing argument %d in user function."), i); + len = user_args->a[i].len; - if (len) - { - memcpy (new_line, user_args->a[i].arg, len); - new_line += len; - } + if (len > 0) + new_line.append (user_args->a[i].arg, len); } line = p + 5; } /* Don't forget the tail. */ - strcpy (new_line, line); + new_line.append (line); - /* Return a pointer to the beginning of the new line. */ - return save_line; + return new_line; } -- 2.5.5