From patchwork Tue Apr 4 17:08:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 67274 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 EF14D384D1BB for ; Tue, 4 Apr 2023 17:09:57 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EF14D384D1BB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1680628198; bh=YL5lkVULLsDc3crbkCxhIg0V4lZqSoPrtsotwrVddrc=; 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=TUbqFu3viDEALxyJryPyHKhKRqYD2fXD62G8O7sPWgMM6C3n2D/h585/NCaar4L/9 qWFpIV/CGDU826wwFjVGTr8Va8qMQoG/RrfJBzNCM5thjLHOuqf76I/kwDHPd8otdL V9QVgm+d+6Q9fvnZg36QlbDwusxOOKkeQIf8XOkc= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-il1-x12d.google.com (mail-il1-x12d.google.com [IPv6:2607:f8b0:4864:20::12d]) by sourceware.org (Postfix) with ESMTPS id A225F3858C39 for ; Tue, 4 Apr 2023 17:08:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A225F3858C39 Received: by mail-il1-x12d.google.com with SMTP id n1so16716448ili.10 for ; Tue, 04 Apr 2023 10:08:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680628135; 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=YL5lkVULLsDc3crbkCxhIg0V4lZqSoPrtsotwrVddrc=; b=pBqz6hRU/Gl/ez0gEY3CV1cvU3/N5TcYYj390HrLylK9C0wyH0G84X+KxjcDPRLEzj 1kGXmPsFf08uqd2ZmZH8yQASXUnyGXIIBX6GINvQRH0GMFWPFsQYtXgnMC4Cv3Cvut8K 4+lIj+Ig/7D5kKBLSwF82Nyz2G6k1b2lf3n5il5sDPpO2qHrN8mJbIM4ZenLRpfyc7XJ GAZ+j9LiEDsYHZCSmwC/anGZgQts0VEsr/83+CzZX7x6UKPZYPRLZswzr3MPF5u5Lr2Z oz8o1RPvCTSF1Dlkk++MLgJEF6sQBnp/GJB9kkYvCT0nIxFuB8aFF3vrExPR9ebwAvx2 vmrA== X-Gm-Message-State: AAQBX9db9X0mknioxAsr/WABGAxns7r1uiKymddGzKUQQ0pSITpxyUtp 7w2+v98ZGA3R5YynpgDf24oOD/W1cQah65f/UYq7HQ== X-Google-Smtp-Source: AKy350aT0BFOnVH7QC7Ibd/kdGJxIGD82VsPr/5oop2D0jPIaYbfOEnxF3t/yEZ/vOJlZ7AJ5Gl3og== X-Received: by 2002:a92:d941:0:b0:315:352e:d5d0 with SMTP id l1-20020a92d941000000b00315352ed5d0mr2411457ilq.32.1680628135272; Tue, 04 Apr 2023 10:08:55 -0700 (PDT) Received: from localhost.localdomain (71-211-185-113.hlrn.qwest.net. [71.211.185.113]) by smtp.gmail.com with ESMTPSA id f4-20020a02a104000000b0040b4c29010fsm1188306jag.140.2023.04.04.10.08.54 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Apr 2023 10:08:55 -0700 (PDT) Date: Tue, 04 Apr 2023 11:08:55 -0600 Subject: [PATCH 7/9] Add second mi_parse constructor MIME-Version: 1.0 Message-Id: <20230404-dap-loaded-sources-v1-7-75c796bd644b@adacore.com> References: <20230404-dap-loaded-sources-v1-0-75c796bd644b@adacore.com> In-Reply-To: <20230404-dap-loaded-sources-v1-0-75c796bd644b@adacore.com> To: gdb-patches@sourceware.org X-Mailer: b4 0.12.2 X-Spam-Status: No, score=-11.6 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 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 | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/mi/mi-parse.h | 12 ++++++-- 2 files changed, 102 insertions(+), 2 deletions(-) diff --git a/gdb/mi/mi-parse.c b/gdb/mi/mi-parse.c index c9c446e0821..e570bdceff5 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,72 @@ 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 (""); + + /* Find the command in the MI table. */ + parse->cmd = mi_cmd_lookup (parse->command); + 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;