From patchwork Thu May 18 20:18:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 69635 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8B07D3882039 for ; Thu, 18 May 2023 20:19:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8B07D3882039 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1684441153; bh=6uB759dveLVkwbJGPQlq4dwdL+LgQp/CsR88AGTZGc4=; h=Date:Subject:References:In-Reply-To:To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=FeszXfqSE9a23DG8RqDuJtCHT+TCaWT3n6MmmwfdyEtyqeCC3tW9Zcg1S+SKgQIxI gAUUbG0uiV1crVdDa2OA2yfImGByyn2LB0F4UW6Y2Zd0Hqc/GDHD2SjmVnkAZLU441 aHUl038I5STzeaj3LjS6rbS/+XkjWRomD4VcQeJE= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-il1-x131.google.com (mail-il1-x131.google.com [IPv6:2607:f8b0:4864:20::131]) by sourceware.org (Postfix) with ESMTPS id 0DF5E385700F for ; Thu, 18 May 2023 20:18:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0DF5E385700F Received: by mail-il1-x131.google.com with SMTP id e9e14a558f8ab-3381e9ec12bso19247715ab.3 for ; Thu, 18 May 2023 13:18:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684441093; x=1687033093; h=to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=6uB759dveLVkwbJGPQlq4dwdL+LgQp/CsR88AGTZGc4=; b=kISdipxZjY9smpZ/RcGKqt/FORxT9XA2RCFD9fcoOpIxBnC/RljWxoj+lHYTDJX0/9 XpOSoFksyPRZO1ZzECEvjle5LyAloY9YKWHEi6vyYp4/lAShe92fsCe86IKmXNB0LTJw z7K2IhhXxt/STpgQ4d6I4K4YiM4znsXKkLNjHez6VL8OcPAO3ByD1+MTVeAUQ+RyzSD3 nM1U87tcKkIkicvu60dhJn5xNd8uxE5mkNc6P+9/9kGHRfd+I3OR0Sv081y7q2dXif+z FJ6UZykMoIXIc2hNlaJiVX3Lp3SRXN62MGLXGsnMAxFP/LzlJJt7LDtl7OlQcnIel7Dt jKIA== X-Gm-Message-State: AC+VfDyrEUCLOaPBFcnyU7pC7F8oqNQIMi1BpO2YH2omiEbPD5t1Q64i anyqSzCfSp0UZPjKGdFaTkVgIqGYIoZNqcXvhhx6MQ== X-Google-Smtp-Source: ACHHUZ6vkhJHhxf4QhACTG3U4obWVtI0WrLvC2fFIqr8C2k0NjnqB+SpJswbEPatO9C3K587tBKpFA== X-Received: by 2002:a92:c8c3:0:b0:331:773f:e67a with SMTP id c3-20020a92c8c3000000b00331773fe67amr5604588ilq.31.1684441093253; Thu, 18 May 2023 13:18:13 -0700 (PDT) Received: from localhost.localdomain (75-166-157-55.hlrn.qwest.net. [75.166.157.55]) by smtp.gmail.com with ESMTPSA id i9-20020a05663813c900b00418ba399842sm703087jaj.13.2023.05.18.13.18.12 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 May 2023 13:18:12 -0700 (PDT) Date: Thu, 18 May 2023 14:18:13 -0600 Subject: [PATCH v2 7/9] Add second mi_parse constructor MIME-Version: 1.0 Message-Id: <20230404-dap-loaded-sources-v2-7-93f229095e03@adacore.com> References: <20230404-dap-loaded-sources-v2-0-93f229095e03@adacore.com> In-Reply-To: <20230404-dap-loaded-sources-v2-0-93f229095e03@adacore.com> To: gdb-patches@sourceware.org X-Mailer: b4 0.12.2 X-Spam-Status: No, score=-11.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Tom Tromey via Gdb-patches From: Tom Tromey Reply-To: Tom Tromey Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" This adds a second mi_parse constructor. This constructor takes a command name and vector of arguments, and does not do any escape processing. This also changes mi_parse::args to handle parse objects created this new way. --- gdb/mi/mi-parse.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/mi/mi-parse.h | 12 +++++-- 2 files changed, 107 insertions(+), 2 deletions(-) diff --git a/gdb/mi/mi-parse.c b/gdb/mi/mi-parse.c index 09207164291..a113d4d48da 100644 --- a/gdb/mi/mi-parse.c +++ b/gdb/mi/mi-parse.c @@ -109,6 +109,11 @@ mi_parse_escape (const char **string_ptr) void mi_parse::parse_argv () { + /* If arguments were already computed (or were supplied at + construction), then there's no need to re-compute them. */ + if (argv != nullptr) + return; + const char *chp = m_args.c_str (); int argc = 0; char **argv = XNEWVEC (char *, argc + 1); @@ -217,6 +222,27 @@ mi_parse::~mi_parse () /* See mi-parse.h. */ +const char * +mi_parse::args () +{ + /* If args were already computed, or if there is no pre-computed + argv, just return the args. */ + if (!m_args.empty () || argv == nullptr) + return m_args.c_str (); + + /* Compute args from argv. */ + for (int i = 0; i < argc; ++i) + { + if (!m_args.empty ()) + m_args += " "; + m_args += argv[i]; + } + + return m_args.c_str (); +} + +/* See mi-parse.h. */ + void mi_parse::set_thread_group (const char *arg, char **endp) { @@ -387,6 +413,77 @@ mi_parse::make (const char *cmd, char **token) return parse; } +/* See mi-parse.h. */ + +std::unique_ptr +mi_parse::make (gdb::unique_xmalloc_ptr command, + std::vector> args) +{ + std::unique_ptr parse (new struct mi_parse); + + parse->command = command.release (); + parse->token = xstrdup (""); + + if (parse->command[0] != '-') + throw_error (UNDEFINED_COMMAND_ERROR, + _("MI command '%s' does not start with '-'"), + parse->command); + + /* Find the command in the MI table. */ + parse->cmd = mi_cmd_lookup (parse->command + 1); + if (parse->cmd == NULL) + throw_error (UNDEFINED_COMMAND_ERROR, + _("Undefined MI command: %s"), parse->command); + + /* This over-allocates slightly, but it seems unimportant. */ + parse->argv = XCNEWVEC (char *, args.size () + 1); + + for (size_t i = 0; i < args.size (); ++i) + { + const char *chp = args[i].get (); + + /* See if --all is the last token in the input. */ + if (strcmp (chp, "--all") == 0) + { + parse->all = 1; + } + else if (strcmp (chp, "--thread-group") == 0) + { + ++i; + if (i == args.size ()) + error ("No argument to '--thread-group'"); + parse->set_thread_group (args[i].get (), nullptr); + } + else if (strcmp (chp, "--thread") == 0) + { + ++i; + if (i == args.size ()) + error ("No argument to '--thread'"); + parse->set_thread (args[i].get (), nullptr); + } + else if (strcmp (chp, "--frame") == 0) + { + ++i; + if (i == args.size ()) + error ("No argument to '--frame'"); + parse->set_frame (args[i].get (), nullptr); + } + else if (strcmp (chp, "--language") == 0) + { + ++i; + if (i == args.size ()) + error ("No argument to '--language'"); + parse->set_language (args[i].get (), nullptr); + } + else + parse->argv[parse->argc++] = args[i].release (); + } + + /* Fully parsed, flag as an MI command. */ + parse->op = MI_COMMAND; + return parse; +} + enum print_values mi_parse_print_values (const char *name) { diff --git a/gdb/mi/mi-parse.h b/gdb/mi/mi-parse.h index 19c41f23ed6..6373543529b 100644 --- a/gdb/mi/mi-parse.h +++ b/gdb/mi/mi-parse.h @@ -52,6 +52,15 @@ struct mi_parse static std::unique_ptr make (const char *cmd, char **token); + /* Create an mi_parse object given the command name and a vector + of arguments. Unlike with the other constructor, here the + arguments are treated "as is" -- no escape processing is + done. */ + + static std::unique_ptr make + (gdb::unique_xmalloc_ptr command, + std::vector> args); + ~mi_parse (); DISABLE_COPY_AND_ASSIGN (mi_parse); @@ -61,8 +70,7 @@ struct mi_parse /* Return the full argument string, as used by commands which are implemented as CLI commands. */ - const char *args () const - { return m_args.c_str (); } + const char *args (); enum mi_command_type op = MI_COMMAND; char *command = nullptr;