From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id YZo1KlIhMGrNeAgAWB0awg (envelope-from ) for ; Mon, 15 Jun 2026 11:59:14 -0400 Authentication-Results: simark.ca; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=foss header.b=f79QmfkZ; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id A8FC21E098; Mon, 15 Jun 2026 11:59:14 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.1 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_INVALID,DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [IPv6:2620:52:6:3111::32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 69A3B1E070 for ; Mon, 15 Jun 2026 11:59:13 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8164D4C31830 for ; Mon, 15 Jun 2026 15:59:12 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8164D4C31830 Authentication-Results: sourceware.org; dkim=fail reason="signature verification failed" (1024-bit key, unprotected) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=foss header.b=f79QmfkZ Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 709B04B92097; Mon, 15 Jun 2026 15:58:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 709B04B92097 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 709B04B92097 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1781539102; cv=none; b=jXf8mWD0x8buA+UZOJlDMd5INmFTRuH+/fgLf+JfCWvjtEMI2ZkdPwGwCdkKX2dGf8W5mXeLO69B5gKEkS0fRX9sKE6xLamdT6KsALumu9fhP+wp5Fqo3esCFku4/nfdmpn6o2K8LPgKAW9cFPBvaFKf++XP2mPSsm/wK5Dfh4U= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1781539102; c=relaxed/simple; bh=kLPQmg10nG85j9Bd6SG8iB+XoDswJJ8LxOcTv6UrNFw=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=u0Of8YKZLzwYN9t6Fr+xa19HsBHrROV6RsvK7wCtaoCFGbbYPckC6tbU/ZK8lv9WUu0i2WdLHV+urVrGTDEoVy3bv7Y9LvDrmO/ZujcoKsUw4dYAJua6TCQjie9d+FnvOyCTGlNHwDAE5N1j/u+mBeHnCHLoyK4+XuCG8qj9avo= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=foss header.b=f79QmfkZ DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 709B04B92097 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id DA4F8176B; Mon, 15 Jun 2026 08:58:16 -0700 (PDT) Received: from e142624-vm1.arm.com (e142624-vm1.arm.com [10.2.197.111]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B1C0A3F763; Mon, 15 Jun 2026 08:58:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1781539101; bh=kLPQmg10nG85j9Bd6SG8iB+XoDswJJ8LxOcTv6UrNFw=; h=From:To:Cc:Subject:Date:From; b=f79QmfkZVr9ML049PRlh0Sqhx8I06z9Bgvni8NlMQNLl0qDY1fg/2ahGnu2bwgfh8 0GG/NcGeSu9peFTddVLuJG/RKrxqFhgW/z40Sb/nf3Zwbg2xRilnu0JVJq59ml4D8+ mtw4V/ChXSqJwhFVCVVSdBvJ1YQ6DBuyTOq8fT7A= From: Richard Earnshaw To: binutils@sourceware.org, gdb-patches@sourceware.org Cc: Richard.Earnshaw@arm.com, Sunil Dora Subject: [committed] Port expandargstr from gcc/libiberty Date: Mon, 15 Jun 2026 16:57:31 +0100 Message-ID: <20260615155731.2965355-1-rearnsha@arm.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org From: Richard.Earnshaw@arm.com Sync recent changes to libiberty. include/ChangeLog: * libiberty.h (expandargstr): Declare. libiberty/ChangeLog: * argv.c (expandargstr): New function. Signed-off-by: Sunil Dora --- Committing as obvious. diff --git a/include/libiberty.h b/include/libiberty.h index ae0e94bc4c5..e905f2cf190 100644 --- a/include/libiberty.h +++ b/include/libiberty.h @@ -94,6 +94,11 @@ extern int writeargv (char * const *, FILE *); extern int countargv (char * const *); +/* Expand VAL as a response file if it begins with '@' and return the + result as a shell-quoted string. */ + +extern char *expandargstr (const char *, const char *); + /* Return the last component of a path name. Note that we can't use a prototype here because the parameter is declared inconsistently across different systems, sometimes as "char *" and sometimes as diff --git a/libiberty/argv.c b/libiberty/argv.c index 64127f70c99..35e2750c5ff 100644 --- a/libiberty/argv.c +++ b/libiberty/argv.c @@ -492,6 +492,81 @@ countargv (char * const *argv) return argc; } +/* + +@deftypefn Extension {char *} expandargstr @ + (const char *@var{progname}, const char *@var{val}) + +Expand @var{val} as a response file via @code{expandargv} if it begins +with @samp{@@}, using @var{progname} as @code{argv[0]}, and return the +expanded option list as a shell-quoted string. Returns a newly +allocated string. + +@end deftypefn + +*/ + +char * +expandargstr (const char *progname, const char *val) +{ + int argc = 2; + char **argv; + char **orig; + size_t len; + char *buf; + char *p; + int i; + + if (val[0] != '@') + return xstrdup (val); + + argv = (char **) xcalloc (3, sizeof (char *)); + orig = argv; + argv[0] = xstrdup (progname); + argv[1] = xstrdup (val); + argv[2] = NULL; + expandargv (&argc, &argv); + if (argv != orig) + freeargv (orig); + + len = 1; + for (i = 1; argv[i] != NULL; i++) + { + const char *q; + if (i > 1) + len++; + len += 2; + for (q = argv[i]; *q; q++) + len += (*q == '\'') ? 4 : 1; + } + + buf = (char *) xmalloc (len); + p = buf; + for (i = 1; argv[i] != NULL; i++) + { + const char *q; + if (i > 1) + *p++ = ' '; + *p++ = '\''; + for (q = argv[i]; *q; q++) + { + if (*q == '\'') + { + *p++ = '\''; + *p++ = '\\'; + *p++ = '\''; + *p++ = '\''; + } + else + *p++ = *q; + } + *p++ = '\''; + } + *p = '\0'; + freeargv (argv); + return buf; +} + #ifdef MAIN /* Simple little test driver. */ -- 2.43.0