summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2004-09-09 10:12:42 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2004-09-09 10:12:42 +0000
commit6b1dc0f701754f244cd090c8ec74db5af4a418ed (patch)
tree1a6da686de0cdef82b578853c3ece22c4911db32
parent65bbf722d9061b99c70722fc613ca612d4bd48d6 (diff)
downloadzsh-6b1dc0f701754f244cd090c8ec74db5af4a418ed.tar.gz
zsh-6b1dc0f701754f244cd090c8ec74db5af4a418ed.zip
20331: Use internal zlong variables for consistency
20332: Add WIDGETSTYLE zle parameter
-rw-r--r--ChangeLog10
-rw-r--r--Doc/Zsh/zle.yo10
-rw-r--r--Src/Zle/compctl.c2
-rw-r--r--Src/Zle/zle_params.c61
-rw-r--r--Src/builtin.c25
-rw-r--r--Src/hist.c48
-rw-r--r--Src/params.c27
-rw-r--r--Src/prompt.c4
-rw-r--r--Src/zsh.h3
9 files changed, 126 insertions, 64 deletions
diff --git a/ChangeLog b/ChangeLog
index d274fdc27..946995c59 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/Doc/Zsh/zle.yo b/Doc/Zsh/zle.yo
index ed80b269a..036c0284c 100644
--- a/Doc/Zsh/zle.yo
+++ b/Doc/Zsh/zle.yo
@@ -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)
diff --git a/Src/Zle/compctl.c b/Src/Zle/compctl.c
index 689d28a30..2f2996013 100644
--- a/Src/Zle/compctl.c
+++ b/Src/Zle/compctl.c
@@ -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. */
diff --git a/Src/Zle/zle_params.c b/Src/Zle/zle_params.c
index f0f1cde95..efbad97f5 100644
--- a/Src/Zle/zle_params.c
+++ b/Src/Zle/zle_params.c
@@ -55,43 +55,45 @@ static struct zleparam {
} zleparams[] = {
{ "BUFFER", PM_SCALAR, FN(set_buffer), FN(get_buffer),
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),
+ { "BUFFERLINES", PM_INTEGER | PM_READONLY, NULL, FN(get_bufferlines),
+ zleunsetfn, NULL },
+ { "CONTEXT", PM_SCALAR | PM_READONLY, NULL, FN(get_context),
zleunsetfn, NULL },
- { "PREBUFFER", PM_SCALAR | PM_READONLY, NULL, FN(get_prebuffer),
+ { "CURSOR", PM_INTEGER, FN(set_cursor), FN(get_cursor),
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),
+ { "killring", PM_ARRAY, FN(set_killring), FN(get_killring),
+ unset_killring, NULL },
+ { "LASTSEARCH", PM_SCALAR | PM_READONLY, NULL, FN(get_lsearch),
zleunsetfn, NULL },
- { "BUFFERLINES", PM_INTEGER | PM_READONLY, NULL, FN(get_bufferlines),
+ { "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 },
- { "CUTBUFFER", PM_SCALAR, FN(set_cutbuffer), FN(get_cutbuffer),
- unset_cutbuffer, NULL },
- { "killring", PM_ARRAY, FN(set_killring), FN(get_killring),
- unset_killring, 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 },
- { "POSTDISPLAY", PM_SCALAR, FN(set_postdisplay), FN(get_postdisplay),
+ { "RBUFFER", PM_SCALAR, FN(set_rbuffer), FN(get_rbuffer),
zleunsetfn, NULL },
- { "LASTSEARCH", PM_SCALAR | PM_READONLY, NULL, FN(get_lsearch),
+ { "WIDGET", PM_SCALAR | PM_READONLY, NULL, FN(get_widget),
zleunsetfn, NULL },
- { "CONTEXT", PM_SCALAR | PM_READONLY, NULL, FN(get_context),
+ { "WIDGETSTYLE", PM_SCALAR | PM_READONLY, NULL, FN(get_widgetstyle),
zleunsetfn, NULL },
{ NULL, 0, NULL, NULL, NULL, NULL }
};
@@ -280,6 +282,21 @@ get_widget(UNUSED(Param pm))
/**/
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))
{
return (lbindk ? lbindk->nam : "");
diff --git a/Src/builtin.c b/Src/builtin.c
index 0a2d55587..1cfad3e8a 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -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
diff --git a/Src/hist.c b/Src/hist.c
index 0a2226341..74b302cff 100644
--- a/Src/hist.c
+++ b/Src/hist.c
@@ -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;
diff --git a/Src/params.c b/Src/params.c
index 4c2a17ee8..f9e382004 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -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' */
diff --git a/Src/prompt.c b/Src/prompt.c
index c0e73fb5f..fd2977ab6 100644
--- a/Src/prompt.c
+++ b/Src/prompt.c
@@ -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);
}
}
diff --git a/Src/zsh.h b/Src/zsh.h
index 40d506044..d6515b171 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -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 */