Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: echoti and number of arguments
- X-seq: zsh-workers 18551
- From: Stephane CHAZELAS <Stephane_CHAZELAS@xxxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxxxxx>
- Subject: Re: echoti and number of arguments
- Date: Mon, 19 May 2003 16:51:09 +0200
- In-reply-to: <6877.1053340085@xxxxxxx>; from pws@xxxxxxx on Mon, May 19, 2003 at 11:28:05AM +0100
- Mail-followup-to: Zsh hackers list <zsh-workers@xxxxxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- References: <20030517100115.A128@xxxxxxxxxxxxxxxxxx> <6877.1053340085@xxxxxxx>
On Mon, May 19, 2003 at 11:28:05AM +0100, Peter Stephenson wrote:
> Stephane CHAZELAS wrote:
> > I've noticed that the number of arguments was checked with
> > echoti. It's not a good idea.
>
> I think we need a configure test to make sure tparm() can take nine
> arguments to make sure we don't get into compatibility problems. That
> will depend on various curses-style things, c.f terminfo.mdd.
More than that, tparm can take 0 to 9 parameters, which can be
of type "int" or "char*" and it's the responsability of the
caller to provide enough arguments and of the right type.
For instance
TERM=hpterm echoti pfx 1 "test"
Should call
tputs(tparm(tigetstr("pfx"), 1, "test"),1,putraw)
and to know that the second parameter is not a number, well, two
approaches:
1- parse tigetstr("pfx") => hard to do and redondant with
what tparm() already does.
2- hard code the few existing capabilities that accept
non-integers (that's what ncurses' tput(1) does using this
table:
TD(Num_Str, "pkey_key", "pfkey", "pk"),
TD(Num_Str, "pkey_local", "pfloc", "pl"),
TD(Num_Str, "pkey_xmit", "pfx", "px"),
TD(Num_Str, "plab_norm", "pln", "pn"),
TD(Num_Str_Str, "pkey_plab", "pfxl", "xl"),
The problem with that approach is the lack of extensibility.
But, for the probably limited usage of echoti in zsh, that's
probably far enough (and there already are hardcoded capnames
in Modules/terminfo.c).
For other capabilities, tparm() should be called with 9 numeric
arguments (non-provided ones defaulting to 0).
Note that actually zsh's "bin_echoti" is quite bogus. I've spent
several minutes wondering how the
"tputs(tparm(t, atoi(*argv)), num, putraw)" could work with
"cup" while we are actually passing only one parameter to
tparm(). It seems to be due to some side effect of the va_list
processing (I guess tparm() actually takes "num" as its second
parameter somewhere on some stack), if I change it to
z= tparm(t, atoi(*argv)); tputs(z, num, putraw), it doesn't work
anymore.
Note that there are problems with echotc too when libtermcap is
ncurses. For instance, when you do a tgetstr("AB"), you actually
get the terminfo entry for "setab", in terminfo format. So, the
routine used to count the number of expected arguments doesn't
work either (as you don't have a termcap format). Note that
tcsh's echotc is fooled on that one too.
$ echotc AB 1
echotc: not enough arguments
(my setab is \E[%?%p1%{8}%<%t%p1%'('%+%e%p1%{92}%+%;%dm, which
anyway cannot be mapped to termcap format).
--
Stéphane
Messages sorted by:
Reverse Date,
Date,
Thread,
Author