Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: globbing in the repeat-count word gives "illegal character"
Mikael Magnusson wrote on Tue, 17 Mar 2020 19:37 +0100:
> On 3/17/20, Daniel Shahaf <d.s@xxxxxxxxxxxxxxxxxx> 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?
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
Messages sorted by:
Reverse Date,
Date,
Thread,
Author