From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12146 invoked by alias); 3 Apr 2017 08:51:55 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 40932 Received: (qmail 12017 invoked from network); 3 Apr 2017 08:51:55 -0000 X-Qmail-Scanner-Diagnostics: from mailout4.w1.samsung.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(210.118.77.14):SA:0(-5.0/5.0):. Processed in 1.205768 secs); 03 Apr 2017 08:51:55 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-5.0 required=5.0 tests=RCVD_IN_DNSWL_HI, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=3.4.1 X-Envelope-From: p.stephenson@samsung.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: none (ns1.primenet.com.au: domain at samsung.com does not designate permitted sender hosts) X-AuditID: cbfec7f1-f796e6d00000116b-e2-58e20d1f63fd Date: Mon, 03 Apr 2017 09:51:40 +0100 From: Peter Stephenson To: zsh-workers@zsh.org Subject: Re: Can't call multi-arg math function from array subscript Message-id: <20170403095140.5796e742@pwslap01u.europe.root.pri> In-reply-to: <170402115156.ZM27355@torch.brasslantern.com> Organization: Samsung Cambridge Solution Centre X-Mailer: Claws Mail 3.7.9 (GTK+ 2.22.0; i386-redhat-linux-gnu) MIME-version: 1.0 Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrDIsWRmVeSWpSXmKPExsWy7djP87ryvI8iDB4/Nbc42PyQyYHRY9XB D0wBjFFcNimpOZllqUX6dglcGbNunmErmC5YsXqJbAPjc54uRk4OCQETiUMbV7NC2GISF+6t Z+ti5OIQEljKKPH+7Coop5dJ4m/7a3aYjq+/r7JAJJYxShy/s5QVwpnGJHHh2CEmCOc0o8Th 7nmMEM4ZRomznZ+AMhwcLAKqEncPWYOMYhMwlJi6aTYjiC0iIC5xdu15FhBbWMBF4vjBBjYQ m1fAXmJfRz9YnFPASqKh4SNYPb+AvsTVvyAjQU6yl5h55QwjRL2gxI/J98DqmQV0JLZte8wO YctLbF7zlhnkHgmB/2wS+zf8ZAS5R0JAVmLTAWaIOS4Sxxa1Qr0pLPHq+BYoW0ais+Mg1K5+ Rokn3b4Qc2YwSpw+s4MNImEt0Xf7IiPEMj6JSdumM0PM55XoaBOCKPGQ+PFkGiOE7Sjx8sFD pgmMirOQnD0LydmzkJy9gJF5FaNIamlxbnpqsZFecWJucWleul5yfu4mRmAaOP3v+McdjO9P WB1iFOBgVOLhveDwMEKINbGsuDL3EKMEB7OSCG/dT6AQb0piZVVqUX58UWlOavEhRmkOFiVx Xq5T1yKEBNITS1KzU1MLUotgskwcnFINjIp/Vi03Zu5O+P0oKf+n4Tw1zoOPH2freJdu+Zvr O3mJYtuHpMmZ/rmx06/VbXHg8Z6rzsq6Zomstnpi6MOFXyMmJi11nbNohwOHy2LtAzJmV/v2 ft6j7lb71ehNx7q+ttsLZ101P8Cx9dPZFN0T5YL/57x277j6Rv+pSaejh+XDsB0teYzdtUos xRmJhlrMRcWJACrXM3b/AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrCIsWRmVeSWpSXmKPExsVy+t/xy7pTeB9FGEw5LmxxsPkhkwOjx6qD H5gCGKPcbDJSE1NSixRS85LzUzLz0m2VQkPcdC2UFPISc1NtlSJ0fUOClBTKEnNKgTwjAzTg 4BzgHqykb5fgljHr5hm2gumCFauXyDYwPufpYuTkkBAwkfj6+yoLhC0mceHeerYuRi4OIYEl jBL9HZuZIJwZTBKPOv+zQzinGSWW3p7CBtIiJHCGUeL9CZUuRg4OFgFVibuHrEHCbAKGElM3 zWYEsUUExCXOrj0PtkFYwEXi+MEGsFZeAXuJfR39YHFOASuJhoaPjBDz+xkl5rx+wgqS4BfQ l7j69xMTxHn2EjOvnGGEaBaU+DH5Hlgzs4CWxOZtTawQtrzE5jVvmSFuU5e4cXc3+wRG4VlI WmYhaZmFpGUBI/MqRpHU0uLc9NxiQ73ixNzi0rx0veT83E2MwBjaduzn5h2MlzYGH2IU4GBU 4uHVcH4YIcSaWFZcmXuIUYKDWUmEt+4nUIg3JbGyKrUoP76oNCe1+BCjKTBgJjJLiSbnA+M7 ryTe0MTQ3NLQyNjCwtzISEmct+TDlXAhgfTEktTs1NSC1CKYPiYOTqkGxuyAJwqfXVNveEQb bslednaGdQr3Z7v9v8OCPXO+vlj29vNEHd9/f19uMK+61cH8Pjt9GYcPw9EuydUbMp+unqa7 Nl1A1cpcgU1Qd9XB55v/XQ62c2U+VDzfYMm53Q1CNsY5B/0N7u1iMg3oCP3jc+vnJRWLPbdf yN89tlj3tFOSYkZvu3/VUyWW4oxEQy3mouJEADJ0xJ63AgAA X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170403085143eucas1p1be5794bebb2d74ce1097da51c266d2b0 X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?UTF-8?B?UGV0ZXIgU3RlcGhlbnNvbhtTQ1NDLURhdGEgUGxhbmUb?= =?UTF-8?B?7IK87ISx7KCE7J6QG1ByaW5jaXBhbCBFbmdpbmVlciwgU29mdHdhcmU=?= X-Global-Sender: =?UTF-8?B?UGV0ZXIgU3RlcGhlbnNvbhtTQ1NDLURhdGEgUGxhbmUbU2Ft?= =?UTF-8?B?c3VuZyBFbGVjdHJvbmljcxtQcmluY2lwYWwgRW5naW5lZXIsIFNvZnR3YXJl?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDA1Q0QwNTAwNTg=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20170402185230epcas1p467fce7a708bf94d7f2c8e032327196d9 X-RootMTR: 20170402185230epcas1p467fce7a708bf94d7f2c8e032327196d9 References: <170402115156.ZM27355@torch.brasslantern.com> On Sun, 2 Apr 2017 11:51:56 -0700 Bart Schaefer wrote: > Add another argument and strange things start happening: > > % twoarg() { return $(( $2 - $1 )) } > % functions -M twoarg > % print ${string[1,twoarg(1,4)]} > twoarg: bad math expression: operand expected at end of string > twoarg: bad math expression: operand expected at end of string It's going to be because getarg() doesn't do much parsing. The answer will be something like this, though I'm not sure what to do about quoting. pws diff --git a/Src/params.c b/Src/params.c index 785b9ea..a9683a6 100644 --- a/Src/params.c +++ b/Src/params.c @@ -1183,7 +1183,7 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, int *prevcharlen, int *nextcharlen) { int hasbeg = 0, word = 0, rev = 0, ind = 0, down = 0, l, i, ishash; - int keymatch = 0, needtok = 0, arglen, len; + int keymatch = 0, needtok = 0, arglen, len, inpar = 0; char *s = *str, *sep = NULL, *t, sav, *d, **ta, **p, *tt, c; zlong num = 1, beg = 0, r = 0, quote_arg = 0; Patprog pprog = NULL; @@ -1322,8 +1322,9 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, } for (t = s, i = 0; - (c = *t) && ((c != Outbrack && - (ishash || c != ',')) || i); t++) { + (c = *t) && + ((c != Outbrack && (ishash || c != ',')) || i || inpar); + t++) { /* Untokenize inull() except before brackets and double-quotes */ if (inull(c)) { c = t[1]; @@ -1344,6 +1345,10 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, i++; else if (c == ']' || c == Outbrack) i--; + if (c == '(' || c == Inpar) + inpar++; + else if (c == ')' || c == Outpar) + inpar--; if (ispecial(c)) needtok = 1; } diff --git a/Test/D06subscript.ztst b/Test/D06subscript.ztst index 1449236..f0a858b 100644 --- a/Test/D06subscript.ztst +++ b/Test/D06subscript.ztst @@ -266,3 +266,10 @@ >of the gang >of the gang >of the gang + + string='abcde' + twoarg() { return $(( $2 - $1 )) } + functions -M twoarg + print ${string[1,twoarg(1,4)]} +0:Commas inside parentheses do not confuse subscripts +>abc