From: Mikael Magnusson <mikachu@gmail.com>
To: Daniel Shahaf <d.s@daniel.shahaf.name>
Cc: zsh-workers@zsh.org
Subject: Re: globbing in the repeat-count word gives "illegal character"
Date: Mon, 23 Mar 2020 07:53:51 +0100 [thread overview]
Message-ID: <CAHYJk3QDYrb5z9rh7D3y9cDJY3_Gs424chsTpWLP0qZyk9sL+g@mail.gmail.com> (raw)
In-Reply-To: <20200323053155.6644a1d6@tarpaulin.shahaf.local2>
On 3/23/20, Daniel Shahaf <d.s@daniel.shahaf.name> wrote:
> Mikael Magnusson wrote on Tue, 17 Mar 2020 19:37 +0100:
>> On 3/17/20, Daniel Shahaf <d.s@daniel.shahaf.name> wrote:
>> > [[[
>> > $ Src/zsh -f
>> > % cd "$(mktemp -d)"
>> > % repeat ? true
>> > zsh: bad math expression: illegal character: \M-W
>> > %
>> > ]]]
>> >
>> > [[[
>> > frame #1: 0x0000000000487eac zsh`matheval(s="\x97") at math.c:1479
>> > 1476 x = mathevall(s, MPREC_TOP, &junk);
>> > 1477 mtok = xmtok;
>> > 1478 if (*junk)
>> > -> 1479 zerr("bad math expression: illegal character: %c",
>> > *junk);
>> > 1480 return x;
>> > 1481 }
>> > 1482
>> > (lldb) p *junk
>> > (char) $0 = '\x97'
>> > ]]]
>> >
>> > [[[
>> > % ag 0x97 | cat
>> > Src/zsh.h:191:#define Quest ((char) 0x97)
>> > %
>> > ]]]
>>
>> Not limited to globbing characters,
>>
>> % repeat { false
>> zsh: bad math expression: illegal character: \M-O
>
> And what about this one? —
> .
> % repeat 2*2 pwd
> zsh: bad math expression: illegal character: \M-G
>
> What's the expected behaviour on this one? Should it report a different
> error, or perform globbing, or take «2*2» as a valid arithmetic
> expression and run 4 iterations of the loop body?
Same as for return, I feel, ie,
% () { return 2*2 }
(anon): no matches found: 2*2
% () { return 2\*2 }; echo $?
4
But if, due to hysterical raisins, globbing never runs for repeat
here, I guess we may as well just have it do arithmetic unquoted
there... but#2 it's probably confusing wrt spaces around the * in that
case... So yeah, I guess I'm not too sure :).
My brain isn't in zsh-code-mode so I can't comment on the rest...
> Code-wise, execrepeat() calls singsub() when the "has tokens" flag is set:
>
> 487 int
> 487 execrepeat(Estate state, UNUSED(int do_exec))
> 488 {
> ⋮
> 500 lastval = 0;
> 501 tmp = ecgetstr(state, EC_DUPTOK, &htok);
> 502 if (htok)
> 503 singsub(&tmp);
> 504 count = mathevali(tmp);
> 505 if (errflag)
> 506 return 1;
>
> When singsub() returns, there are still tokens in the string (Quest,
> Inbrace, or Star, respectively). Is that expected, or should singsub()
> have converted those tokens to their ASCII equivalents?
>
> Is the fix just to call untokenize() after singsub()? Some singsub()
> callers do this, but some don't, and I haven't figured out the rule (if
> there is one). I tried this and it seemed to work, but…
>
> Cheers,
>
> Daniel
>
--
Mikael Magnusson
next prev parent reply other threads:[~2020-03-23 6:54 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-17 3:29 Daniel Shahaf
2020-03-17 18:37 ` Mikael Magnusson
2020-03-23 5:31 ` Daniel Shahaf
2020-03-23 6:53 ` Mikael Magnusson [this message]
2020-03-25 21:09 ` Peter Stephenson
[not found] ` <20200325234655.786e8a88@tarpaulin.shahaf.local2>
2020-03-26 20:58 ` Peter Stephenson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAHYJk3QDYrb5z9rh7D3y9cDJY3_Gs424chsTpWLP0qZyk9sL+g@mail.gmail.com \
--to=mikachu@gmail.com \
--cc=d.s@daniel.shahaf.name \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).