20331: Use internal zlong variables for consistency

20332: Add WIDGETSTYLE zle parameter
This commit is contained in:
Peter Stephenson 2004-09-09 10:12:42 +00:00
parent 65bbf722d9
commit 6b1dc0f701
9 changed files with 130 additions and 68 deletions

View file

@ -1,3 +1,13 @@
2004-09-09 Peter Stephenson <pws@csr.com>
* 20332: Src/Zle/zle_params.c, Doc/Zsh/zle.yo: add WIDGETSTYLE zle
parameter to reveal widget implementation: function name for zle
-N widgets and internal completion widget for zle -C widgets.
* 20331: Src/builtin.c, Src/hist.c, Src/params.c, Src/prompt.c,
Src/zsh.h, Src/Zle/compctl.c: Where possible use internal zlong
variables for integers that correspond to shell variables.
2004-09-08 Peter Stephenson <pws@csr.com>
* 20330: Src/Zle/zle_thingy.c, Doc/Zsh/zle.yo: rationalise status

View file

@ -732,6 +732,16 @@ vindex(WIDGET)
item(tt(WIDGET) (scalar))(
The name of the widget currently being executed; read-only.
)
vindex(WIDGETSTYLE)
item(tt(WIDGET) (scalar))(
Describes the implementation behind the widget currently being executed;
the second argument that followed tt(zle -C) or tt(zle -N) when the widget
was defined, if any. If the widget was defined with tt(zle -N) and there was
no second argument this is the same as the first argument. Hence for
tt(zle -N) this gives the name of the function that implements the widget,
and for tt(zle -C) this gives the internal completion widget that defines
the type of completion. Read-only.
)
enditem()
subsect(Special Widget)

View file

@ -3692,7 +3692,7 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
/* We have a pattern to take things from the history. */
Patprog pprogc = NULL;
char *e, *h, hpatsav;
int i = addhistnum(curhist,-1,HIST_FOREIGN), n = cc->hnum;
zlong i = addhistnum(curhist,-1,HIST_FOREIGN), n = cc->hnum;
Histent he = gethistent(i, GETHIST_UPWARD);
/* Parse the pattern, if it isn't the null string. */

View file

@ -55,43 +55,45 @@ static struct zleparam {
} zleparams[] = {
{ "BUFFER", PM_SCALAR, FN(set_buffer), FN(get_buffer),
zleunsetfn, NULL },
{ "BUFFERLINES", PM_INTEGER | PM_READONLY, NULL, FN(get_bufferlines),
zleunsetfn, NULL },
{ "CONTEXT", PM_SCALAR | PM_READONLY, NULL, FN(get_context),
zleunsetfn, NULL },
{ "CURSOR", PM_INTEGER, FN(set_cursor), FN(get_cursor),
zleunsetfn, NULL },
{ "MARK", PM_INTEGER, FN(set_mark), FN(get_mark),
zleunsetfn, NULL },
{ "LBUFFER", PM_SCALAR, FN(set_lbuffer), FN(get_lbuffer),
zleunsetfn, NULL },
{ "RBUFFER", PM_SCALAR, FN(set_rbuffer), FN(get_rbuffer),
zleunsetfn, NULL },
{ "PREBUFFER", PM_SCALAR | PM_READONLY, NULL, FN(get_prebuffer),
zleunsetfn, NULL },
{ "WIDGET", PM_SCALAR | PM_READONLY, NULL, FN(get_widget),
zleunsetfn, NULL },
{ "LASTWIDGET", PM_SCALAR | PM_READONLY, NULL, FN(get_lwidget),
{ "CUTBUFFER", PM_SCALAR, FN(set_cutbuffer), FN(get_cutbuffer),
unset_cutbuffer, NULL },
{ "HISTNO", PM_INTEGER, FN(set_histno), FN(get_histno),
zleunsetfn, NULL },
{ "KEYMAP", PM_SCALAR | PM_READONLY, NULL, FN(get_keymap),
zleunsetfn, NULL },
{ "KEYS", PM_SCALAR | PM_READONLY, NULL, FN(get_keys),
zleunsetfn, NULL },
{ "NUMERIC", PM_INTEGER | PM_UNSET, FN(set_numeric), FN(get_numeric),
unset_numeric, NULL },
{ "HISTNO", PM_INTEGER, FN(set_histno), FN(get_histno),
zleunsetfn, NULL },
{ "BUFFERLINES", PM_INTEGER | PM_READONLY, NULL, FN(get_bufferlines),
zleunsetfn, NULL },
{ "PENDING", PM_INTEGER | PM_READONLY, NULL, FN(get_pending),
zleunsetfn, NULL },
{ "CUTBUFFER", PM_SCALAR, FN(set_cutbuffer), FN(get_cutbuffer),
unset_cutbuffer, NULL },
{ "killring", PM_ARRAY, FN(set_killring), FN(get_killring),
unset_killring, NULL },
{ "PREDISPLAY", PM_SCALAR, FN(set_predisplay), FN(get_predisplay),
zleunsetfn, NULL },
{ "POSTDISPLAY", PM_SCALAR, FN(set_postdisplay), FN(get_postdisplay),
zleunsetfn, NULL },
{ "LASTSEARCH", PM_SCALAR | PM_READONLY, NULL, FN(get_lsearch),
zleunsetfn, NULL },
{ "CONTEXT", PM_SCALAR | PM_READONLY, NULL, FN(get_context),
{ "LASTWIDGET", PM_SCALAR | PM_READONLY, NULL, FN(get_lwidget),
zleunsetfn, NULL },
{ "LBUFFER", PM_SCALAR, FN(set_lbuffer), FN(get_lbuffer),
zleunsetfn, NULL },
{ "MARK", PM_INTEGER, FN(set_mark), FN(get_mark),
zleunsetfn, NULL },
{ "NUMERIC", PM_INTEGER | PM_UNSET, FN(set_numeric), FN(get_numeric),
unset_numeric, NULL },
{ "PENDING", PM_INTEGER | PM_READONLY, NULL, FN(get_pending),
zleunsetfn, NULL },
{ "POSTDISPLAY", PM_SCALAR, FN(set_postdisplay), FN(get_postdisplay),
zleunsetfn, NULL },
{ "PREBUFFER", PM_SCALAR | PM_READONLY, NULL, FN(get_prebuffer),
zleunsetfn, NULL },
{ "PREDISPLAY", PM_SCALAR, FN(set_predisplay), FN(get_predisplay),
zleunsetfn, NULL },
{ "RBUFFER", PM_SCALAR, FN(set_rbuffer), FN(get_rbuffer),
zleunsetfn, NULL },
{ "WIDGET", PM_SCALAR | PM_READONLY, NULL, FN(get_widget),
zleunsetfn, NULL },
{ "WIDGETSTYLE", PM_SCALAR | PM_READONLY, NULL, FN(get_widgetstyle),
zleunsetfn, NULL },
{ NULL, 0, NULL, NULL, NULL, NULL }
};
@ -278,6 +280,21 @@ get_widget(UNUSED(Param pm))
return bindk->nam;
}
/**/
static char *
get_widgetstyle(UNUSED(Param pm))
{
Widget widget = bindk->widget;
int flags = widget->flags;
if (flags & WIDGET_INT)
return ".internal"; /* Don't see how this can ever be returned... */
else if (flags & WIDGET_NCOMP)
return widget->u.comp.wid;
else
return widget->u.fnnam;
}
/**/
static char *
get_lwidget(UNUSED(Param pm))

View file

@ -1293,7 +1293,8 @@ printif(char *str, int c)
int
bin_fc(char *nam, char **argv, Options ops, int func)
{
int first = -1, last = -1, retval;
zlong first = -1, last = -1;
int retval;
char *s;
struct asgment *asgf = NULL, *asgl = NULL;
Patprog pprog = NULL;
@ -1305,15 +1306,15 @@ bin_fc(char *nam, char **argv, Options ops, int func)
}
if (OPT_ISSET(ops,'p')) {
char *hf = "";
int hs = DEFAULT_HISTSIZE;
int shs = 0;
zlong hs = DEFAULT_HISTSIZE;
zlong shs = 0;
int level = OPT_ISSET(ops,'a') ? locallevel : -1;
if (*argv) {
hf = *argv++;
if (*argv) {
hs = atoi(*argv++);
hs = zstrtol(*argv++, NULL, 10);
if (*argv)
shs = atoi(*argv++);
shs = zstrtol(*argv++, NULL, 10);
else
shs = hs;
if (*argv) {
@ -1490,10 +1491,10 @@ bin_fc(char *nam, char **argv, Options ops, int func)
/* get the history event associated with s */
/**/
static int
static zlong
fcgetcomm(char *s)
{
int cmd;
zlong cmd;
/* First try to match a history number. Negative *
* numbers indicate reversed numbering. */
@ -1558,9 +1559,11 @@ fcsubs(char **sp, struct asgment *sub)
/**/
static int
fclist(FILE *f, Options ops, int first, int last, struct asgment *subs, Patprog pprog)
fclist(FILE *f, Options ops, zlong first, zlong last,
struct asgment *subs, Patprog pprog)
{
int fclistdone = 0, tmp;
int fclistdone = 0;
zlong tmp;
char *s;
Histent ent;
@ -1592,7 +1595,9 @@ fclist(FILE *f, Options ops, int first, int last, struct asgment *subs, Patprog
/* do numbering */
if (!OPT_ISSET(ops,'n')) {
fprintf(f, "%5d%c ", ent->histnum,
char buf[DIGBUFSIZE];
convbase(buf, ent->histnum, 10);
fprintf(f, "%5s%c ", buf,
ent->flags & HIST_FOREIGN? '*' : ' ');
}
/* output actual time (and possibly date) of execution of the

View file

@ -79,7 +79,7 @@ mod_export int excs, exlast;
*/
/**/
mod_export int curhist;
mod_export zlong curhist;
/**/
struct histent curline;
@ -87,7 +87,7 @@ struct histent curline;
/* current line count of allocated history entries */
/**/
int histlinect;
zlong histlinect;
/* The history lines are kept in a hash, and also doubly-linked in a ring */
@ -99,12 +99,12 @@ mod_export Histent hist_ring;
/* capacity of history lists */
/**/
int histsiz;
zlong histsiz;
/* desired history-file size (in lines) */
/**/
int savehistsiz;
zlong savehistsiz;
/* if = 1, we have performed history substitution on the current line *
* if = 2, we have used the 'p' modifier */
@ -178,7 +178,7 @@ int hlinesz;
/* default event (usually curhist-1, that is, "!!") */
static int defev;
static zlong defev;
/* add a character to the current history word */
@ -339,8 +339,10 @@ getargc(Histent ehist)
static int
histsubchar(int c)
{
int ev, farg, evset = -1, larg, argc, cflag = 0, bflag = 0;
static int mev = -1, marg = -1;
int farg, evset = -1, larg, argc, cflag = 0, bflag = 0;
zlong ev;
static int marg = -1;
static zlong mev = -1;
char buf[256], *ptr;
char *sline;
Histent ehist;
@ -410,7 +412,7 @@ histsubchar(int c)
return -1;
}
} else {
int t0;
zlong t0;
for (;;) {
if (inblank(c) || c == ';' || c == ':' || c == '^' ||
@ -448,7 +450,7 @@ histsubchar(int c)
ev = defev;
evset = 0;
}
} else if ((t0 = atoi(buf))) {
} else if ((t0 = zstrtol(buf, NULL, 10))) {
ev = (t0 < 0) ? addhistnum(curhist,t0,HIST_FOREIGN) : t0;
evset = 1;
} else if ((unsigned)*buf == bangchar) {
@ -839,8 +841,8 @@ histremovedups(void)
}
/**/
mod_export int
addhistnum(int hl, int n, int xflags)
mod_export zlong
addhistnum(zlong hl, int n, int xflags)
{
int dir = n < 0? -1 : n > 0? 1 : 0;
Histent he = gethistent(hl, dir);
@ -892,7 +894,7 @@ down_histent(Histent he)
/**/
mod_export Histent
gethistent(int ev, int nearmatch)
gethistent(zlong ev, int nearmatch)
{
Histent he;
@ -927,7 +929,7 @@ putoldhistentryontop(short keep_going)
Histent he = keep_going? next : hist_ring->down;
next = he->down;
if (isset(HISTEXPIREDUPSFIRST) && !(he->flags & HIST_DUP)) {
static int max_unique_ct = 0;
static zlong max_unique_ct = 0;
if (!keep_going)
max_unique_ct = savehistsiz;
do {
@ -1346,7 +1348,7 @@ getargspec(int argc, int marg, int evset)
/* do ?foo? search */
/**/
static int
static zlong
hconsearch(char *str, int *marg)
{
int t1 = 0;
@ -1370,7 +1372,7 @@ hconsearch(char *str, int *marg)
/* do !foo search */
/**/
int
zlong
hcomsearch(char *str)
{
Histent he;
@ -1795,7 +1797,7 @@ static struct histfile_stats {
char *text;
time_t stim, mtim;
off_t fpos, fsiz;
int next_write_ev;
zlong next_write_ev;
} lasthist;
static struct histsave {
@ -1803,16 +1805,16 @@ static struct histsave {
char *histfile;
HashTable histtab;
Histent hist_ring;
int curhist;
int histlinect;
int histsiz;
int savehistsiz;
zlong curhist;
zlong histlinect;
zlong histsiz;
zlong savehistsiz;
int locallevel;
} *histsave_stack;
static int histsave_stack_size = 0;
static int histsave_stack_pos = 0;
static int histfile_linect;
static zlong histfile_linect;
static int
readhistline(int start, char **bufp, int *bufsiz, FILE *in)
@ -2006,7 +2008,7 @@ savehistfile(char *fn, int err, int writeflags)
char *t, *start = NULL;
FILE *out;
Histent he;
int xcurhist = curhist - !!(histactive & HA_ACTIVE);
zlong xcurhist = curhist - !!(histactive & HA_ACTIVE);
int extended_history = isset(EXTENDEDHISTORY);
if (!interact || savehistsiz <= 0 || !hist_ring
@ -2345,7 +2347,7 @@ bufferwords(LinkList list, char *buf, int *index)
/**/
int
pushhiststack(char *hf, int hs, int shs, int level)
pushhiststack(char *hf, zlong hs, zlong shs, int level)
{
struct histsave *h;
int curline_in_ring = (histactive & HA_ACTIVE) && hist_ring == &curline;

View file

@ -2493,7 +2493,7 @@ nullintsetfn(UNUSED(Param pm), UNUSED(zlong x))
mod_export zlong
intvargetfn(Param pm)
{
return *((zlong *)pm->u.data);
return *pm->u.valptr;
}
/* Function to set value of generic special integer *
@ -2504,7 +2504,7 @@ intvargetfn(Param pm)
mod_export void
intvarsetfn(Param pm, zlong x)
{
*((zlong *)pm->u.data) = x;
*pm->u.valptr = x;
}
/* Function to set value of any ZLE-related integer *
@ -2515,7 +2515,7 @@ intvarsetfn(Param pm, zlong x)
void
zlevarsetfn(Param pm, zlong x)
{
zlong *p = (zlong *)pm->u.data;
zlong *p = pm->u.valptr;
*p = x;
if (p == &lines || p == &columns)
@ -2745,7 +2745,13 @@ randomsetfn(UNUSED(Param pm), zlong v)
zlong
intsecondsgetfn(Param pm)
{
return (zlong)floatsecondsgetfn(pm);
struct timeval now;
struct timezone dummy_tz;
gettimeofday(&now, &dummy_tz);
return (zlong)(now.tv_sec - shtimer.tv_sec) +
(zlong)(now.tv_usec - shtimer.tv_usec) / (zlong)1000000;
}
/* Function to set value of special parameter `SECONDS' */
@ -2754,7 +2760,16 @@ intsecondsgetfn(Param pm)
void
intsecondssetfn(Param pm, zlong x)
{
floatsecondssetfn(pm, (double)x);
struct timeval now;
struct timezone dummy_tz;
zlong diff;
gettimeofday(&now, &dummy_tz);
diff = (zlong)now.tv_sec - x;
shtimer.tv_sec = diff;
if ((zlong)shtimer.tv_sec != diff)
zwarn("SECONDS truncated on assignment", NULL, 0);
shtimer.tv_usec = 0;
}
/**/
@ -3090,6 +3105,8 @@ void
errnosetfn(UNUSED(Param pm), zlong x)
{
errno = (int)x;
if ((zlong)errno != x)
zwarn("errno truncated on assignment", NULL, 0);
}
/* Function to get value for special parameter `ERRNO' */

View file

@ -384,7 +384,7 @@ putpromptchar(int doprint, int endchar)
case 'h':
case '!':
addbufspc(DIGBUFSIZE);
sprintf(bp, "%d", curhist);
convbase(bp, curhist, 10);
bp += strlen(bp);
break;
case 'j':
@ -676,7 +676,7 @@ putpromptchar(int doprint, int endchar)
pputc('!');
} else {
addbufspc(DIGBUFSIZE);
sprintf(bp, "%d", curhist);
convbase(bp, curhist, 10);
bp += strlen(bp);
}
}

View file

@ -1129,6 +1129,7 @@ struct param {
char **arr; /* value if declared array (PM_ARRAY) */
char *str; /* value if declared string (PM_SCALAR) */
zlong val; /* value if declared integer (PM_INTEGER) */
zlong *valptr; /* value if special pointer to integer */
double dval; /* value if declared float
(PM_EFLOAT|PM_FFLOAT) */
HashTable hash; /* value if declared assoc (PM_HASHED) */
@ -1334,7 +1335,7 @@ struct histent {
short *words; /* Position of words in history */
/* line: as pairs of start, end */
int nwords; /* Number of words in history line */
int histnum; /* A sequential history number */
zlong histnum; /* A sequential history number */
};
#define HIST_MAKEUNIQUE 0x00000001 /* Kill this new entry if not unique */