From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.2 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 Received: from zero.zsh.org (zero.zsh.org [IPv6:2a02:898:31:0:48:4558:7a:7368]) by inbox.vuxu.org (Postfix) with ESMTP id 81CF521619 for ; Sat, 24 Feb 2024 15:41:38 +0100 (CET) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20210803; t=1708785698; b=YLLqaB6dmCqcdlfAxMvTNnRDezCe1hdZhw4B7kTfxm48AHzM1oKS8G3NtoE43Widui0WAxst1V eKptwbYveFXVK4n7Xi1HK+znznMlYYY8d9x0yGril8NaLhpUqeBFRRO1XlBH7KDPooucMAZgDg Ydw7zPo7x5a9vuxPV2hvgaRXPjJWmztkVwLW6hL/pYPK7eHcvMZmsA+yY5J7zRqJIiUfma3vtT NJb5OQSyQr8EqjNF/b2g7NJ4yFxAQRfQWE9KkSWVGuYF+0SpOxxOJegG0WF88boPOiUmKOAFO6 g8bhXvBXHSq0sDI6Ib8EZ3Xj9VSNah/z10OIzOPpNbwkCw==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (relay1-d.mail.gandi.net) smtp.remote-ip=217.70.183.193; dmarc=none header.from=chazelas.org; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20210803; t=1708785698; bh=433yzv7jonffQ+Q7HbPiz2tKOjX5jSLFOWhNrwxlKtE=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:In-Reply-To:Content-Type:MIME-Version:References:Message-ID: Subject:Cc:To:From:Date:DKIM-Signature; b=JA43lkgkFK9vscc2UBT1Lz848A6BkcPpLWC68LAlOuROWSGh/tTwzhALUBfI7fTjzvqoky3bGf PgakUb9pNa8v+aDeSb2FpBclga8MKzGLa6CvWEAKrLnBg/UVNb1jQsFKt1f1ru7B0FYdh09OwZ Jbg83yEZ7rMx21kQ8ncFrTyxLn0/TqDL6OitaUKAuIl+Hl7H4dfLVvmPLn8QrYB+k4qcXoWPbv mO0qfiijdXOyFaePVCVCwLHD7M+/ZrXk45jDGfVLjbt/+wYcW1pC0axObqAlfeXwM3VtDTAlDG mIQyLikRu3vd8Gi0KCLzi1IsHO+n1dVfBlD+e+jNFG5eeg==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=zsh.org; s=rsa-20210803; h=List-Archive:List-Owner:List-Post:List-Unsubscribe: List-Subscribe:List-Help:List-Id:Sender:In-Reply-To:Content-Type:MIME-Version :References:Message-ID:Subject:Cc:To:From:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID; bh=AmtvDPaxNL8+0SCarVnhPOr68SYsC+r2J9dVknHbnIM=; b=gVGi5CFN4Aqbf45MSmy3zeH1XH YUgJooFI3Tr5CfCqNts278MaBMoFuK8JyqZCD/kemjdBjxKEOK7EVLrRwPG0vCCDPs90Hmq8p+xbk 97YVQ9osYnILW++i+7z287IBN3oo8Nqw2ro/pxkqk/hBttHCxwledbOi55mr8oYBoOl6fqnRtSmcn glaSyuv5ZholK3pq2WEjzfYnEgzk1b/cNhhxkTtJQBbWnUdhBDkrtdDKoVsCNNG8gVY4tcrg2vvR3 KSVe5ZGcrnwn1AA7S+gnY7aeyc6rRO11fX0t2TDE/5A/XBJsHvmnnfPLQgWgXSIYyh8LS1GY1tqwG x0ESg3pA==; Received: by zero.zsh.org with local id 1rdtDb-0003Pc-Qv; Sat, 24 Feb 2024 14:41:35 +0000 Authentication-Results: zsh.org; iprev=pass (relay1-d.mail.gandi.net) smtp.remote-ip=217.70.183.193; dmarc=none header.from=chazelas.org; arc=none Received: from relay1-d.mail.gandi.net ([217.70.183.193]:45979) by zero.zsh.org with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) id 1rdtCy-00036S-0O; Sat, 24 Feb 2024 14:40:57 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id D5ACB240003; Sat, 24 Feb 2024 14:40:43 +0000 (UTC) Date: Sat, 24 Feb 2024 14:40:41 +0000 From: Stephane Chazelas To: Bart Schaefer Cc: Zsh hackers list Subject: Re: Example / partial fix for printf with math expressions Message-ID: <20240224144041.7huny3lmihsrokdm@chazelas.org> Mail-Followup-To: Bart Schaefer , Zsh hackers list References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-GND-Sasl: stephane@chazelas.org X-Seq: 52591 Archived-At: X-Loop: zsh-workers@zsh.org Errors-To: zsh-workers-owner@zsh.org Precedence: list Precedence: bulk Sender: zsh-workers-request@zsh.org X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: 2024-02-23 15:23:52 -0800, Bart Schaefer: > No attachment, so beware line wrap. > > This repairs (printf "%d" ...) but obviously hasn't touched any of the > several other places where bin_print() calls matheval() and friends. > Upshot, math expects to get metafied strings, bin_print() does not (or > at least not always) pass them that way. > > I also did not investigate whether curarg needs a known length rather > than calling metafy with -1, but since math is internally going to > stop at nul bytes anyway, I don't think it matters. [...] Ah sorry, I hadn't seen that message when replying in the other thread. The math parser seems to work OK with NULs at least in: $ typeset -A a $ typeset -p a typeset -A a=( [$'\C-@']=1 ) $ let $'b = (a = ##\0) + 32'; echo $a $b 0 32 With and without your example patch applied however: $ printf '%d\n' $'a[\0]++' zsh: invalid subscript 0 With the one below using curlen / len[argp-args]: $ typeset -A a $ printf '%d\n' $'a[\0]++' 0 $ typeset -p a typeset -A a=( [$'\C-@']=1 ) diff --git a/Src/builtin.c b/Src/builtin.c index dd352c146..f72d14da4 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -5247,7 +5247,8 @@ bin_print(char *name, char **args, Options ops, int func) } } if (*argp) { - width = (int)mathevali(*argp++); + width = (int)mathevali(metafy(*argp, len[argp - args], META_USEHEAP)); + argp++; if (errflag) { errflag &= ~ERRFLAG_ERROR; ret = 1; @@ -5281,7 +5282,8 @@ bin_print(char *name, char **args, Options ops, int func) } if (*argp) { - prec = (int)mathevali(*argp++); + prec = (int)mathevali(metafy(*argp, len[argp - args], META_USEHEAP)); + argp++; if (errflag) { errflag &= ~ERRFLAG_ERROR; ret = 1; @@ -5465,7 +5467,7 @@ bin_print(char *name, char **args, Options ops, int func) *d++ = 'l'; #endif *d++ = 'l', *d++ = *c, *d = '\0'; - zlongval = (curarg) ? mathevali(curarg) : 0; + zlongval = (curarg) ? mathevali(metafy(curarg, curlen, META_HEAPDUP)) : 0; if (errflag) { zlongval = 0; errflag &= ~ERRFLAG_ERROR; @@ -5516,7 +5518,7 @@ bin_print(char *name, char **args, Options ops, int func) if (!curarg) zulongval = (zulong)0; else if (!zstrtoul_underscore(curarg, &zulongval)) - zulongval = mathevali(curarg); + zulongval = mathevali(metafy(curarg, curlen, META_HEAPDUP)); if (errflag) { zulongval = 0; errflag &= ~ERRFLAG_ERROR;