summaryrefslogtreecommitdiff
path: root/Src/Zle
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Zle')
-rw-r--r--Src/Zle/compcore.c16
-rw-r--r--Src/Zle/complist.c11
-rw-r--r--Src/Zle/computil.c10
-rw-r--r--Src/Zle/zle_main.c35
-rw-r--r--Src/Zle/zle_tricky.c19
5 files changed, 64 insertions, 27 deletions
diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c
index 06e7afbfb..a7ada2564 100644
--- a/Src/Zle/compcore.c
+++ b/Src/Zle/compcore.c
@@ -1526,14 +1526,15 @@ get_user_var(char *nam)
/* Otherwise it should be a parameter name. */
char **arr = NULL, *val;
+ queue_signals();
if ((arr = getaparam(nam)) || (arr = gethparam(nam)))
- return (incompfunc ? arrdup(arr) : arr);
-
- if ((val = getsparam(nam))) {
+ arr = (incompfunc ? arrdup(arr) : arr);
+ else if ((val = getsparam(nam))) {
arr = (char **) zhalloc(2*sizeof(char *));
arr[0] = (incompfunc ? dupstring(val) : val);
arr[1] = NULL;
}
+ unqueue_signals();
return arr;
}
}
@@ -1542,14 +1543,19 @@ static char **
get_data_arr(char *name, int keys)
{
struct value vbuf;
+ char **ret;
Value v;
+ queue_signals();
if (!(v = fetchvalue(&vbuf, &name, 1,
(keys ? SCANPM_WANTKEYS : SCANPM_WANTVALS) |
SCANPM_MATCHMANY)))
- return NULL;
+ ret = NULL;
+ else
+ ret = getarrvalue(v);
+ unqueue_signals();
- return getarrvalue(v);
+ return ret;
}
/* This is used by compadd to add a couple of matches. The arguments are
diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c
index 6982dc774..714719d62 100644
--- a/Src/Zle/complist.c
+++ b/Src/Zle/complist.c
@@ -340,6 +340,7 @@ getcols(Listcols c)
int i, l;
max_caplen = lr_caplen = 0;
+ queue_signals();
if (!(s = getsparam("ZLS_COLORS")) &&
!(s = getsparam("ZLS_COLOURS"))) {
for (i = 0; i < NUM_COLS; i++)
@@ -356,6 +357,7 @@ getcols(Listcols c)
if ((max_caplen = strlen(c->files[COL_MA]->col)) <
(l = strlen(c->files[COL_EC]->col)))
max_caplen = l;
+ unqueue_signals();
return;
}
/* We have one of the parameters, use it. */
@@ -366,6 +368,7 @@ getcols(Listcols c)
s++;
else
s = getcoldef(c, s);
+ unqueue_signals();
/* Use default values for those that aren't set explicitly. */
for (i = 0; i < NUM_COLS; i++) {
@@ -1528,8 +1531,10 @@ complistmatches(Hookdef dummy, Chdata dat)
mscroll = 0;
mlistp = NULL;
+ queue_signals();
if (mselect >= 0 || mlbeg >= 0 ||
- (mlistp = getsparam("LISTPROMPT"))) {
+ (mlistp = dupstring(getsparam("LISTPROMPT")))) {
+ unqueue_signals();
if (mlistp && !*mlistp)
mlistp = "%SAt %p: Hit TAB for more, or the character to insert%s";
trashzle();
@@ -1545,6 +1550,7 @@ complistmatches(Hookdef dummy, Chdata dat)
minfo.asked = (listdat.nlines + nlnct <= lines);
}
} else {
+ unqueue_signals();
mlistp = NULL;
if (asklist()) {
amatches = oamatches;
@@ -1641,6 +1647,7 @@ domenuselect(Hookdef dummy, Chdata dat)
int nolist = 0;
char *s;
+ queue_signals();
if (fdat || (dummy && (!(s = getsparam("MENUSELECT")) ||
(dat && dat->num < atoi(s))))) {
if (fdat) {
@@ -1648,6 +1655,7 @@ domenuselect(Hookdef dummy, Chdata dat)
fdat->num = dat->num;
fdat->nmesg = dat->nmesg;
}
+ unqueue_signals();
return 0;
}
if ((s = getsparam("MENUSCROLL"))) {
@@ -1659,6 +1667,7 @@ domenuselect(Hookdef dummy, Chdata dat)
}
if ((mstatus = dupstring(getsparam("MENUPROMPT"))) && !*mstatus)
mstatus = "%SScrolling active: current selection at %p%s";
+ unqueue_signals();
mhasstat = (mstatus && *mstatus);
fdat = dat;
selectlocalmap(mskeymap);
diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c
index 3672de687..4afc492dc 100644
--- a/Src/Zle/computil.c
+++ b/Src/Zle/computil.c
@@ -2606,6 +2606,7 @@ bin_compquote(char *nam, char **args, char *ops, int func)
while ((name = *args++)) {
name = dupstring(name);
+ queue_signals();
if ((v = getvalue(&vbuf, &name, 0))) {
switch (PM_TYPE(v->pm->flags)) {
case PM_SCALAR:
@@ -2630,6 +2631,7 @@ bin_compquote(char *nam, char **args, char *ops, int func)
}
} else
zwarnnam(nam, "unknown parameter: %s", args[-1], 0);
+ unqueue_signals();
}
return 0;
}
@@ -3580,6 +3582,7 @@ bin_compfiles(char *nam, char **args, char *ops, int func)
zwarnnam(nam, "too few arguments", NULL, 0);
return 1;
}
+ queue_signals();
if (!(tmp = getaparam(args[1]))) {
zwarnnam(nam, "unknown parameter: %s", args[1], 0);
return 0;
@@ -3590,6 +3593,7 @@ bin_compfiles(char *nam, char **args, char *ops, int func)
l, getaparam(args[2]), args[3],
args[4], args[5],
getaparam(args[6]), args + 7));
+ unqueue_signals();
return 0;
}
case 'i':
@@ -3608,16 +3612,19 @@ bin_compfiles(char *nam, char **args, char *ops, int func)
zwarnnam(nam, "too many arguments", NULL, 0);
return 1;
}
+ queue_signals();
tmp = getaparam(args[2]);
l = newlinklist();
if (tmp)
for (; *tmp; tmp++)
addlinknode(l, *tmp);
if (!(tmp = getaparam(args[1]))) {
+ unqueue_signals();
zwarnnam(nam, "unknown parameter: %s", args[1], 0);
return 0;
}
cf_ignore(tmp, l, args[3], args[4]);
+ unqueue_signals();
set_list_array(args[2], l);
return 0;
}
@@ -3635,12 +3642,15 @@ bin_compfiles(char *nam, char **args, char *ops, int func)
zwarnnam(nam, "too many arguments", NULL, 0);
return 1;
}
+ queue_signals();
if (!(tmp = getaparam(args[1]))) {
+ unqueue_signals();
zwarnnam(nam, "unknown parameter: %s", args[1], 0);
return 0;
}
if ((l = cf_remove_other(tmp, args[2], &ret)))
set_list_array(args[1], l);
+ unqueue_signals();
return ret;
}
}
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index b2a662072..c5923d74d 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -313,17 +313,12 @@ static int
breakread(int fd, char *buf, int n)
{
fd_set f;
- int ret;
FD_ZERO(&f);
FD_SET(fd, &f);
- ALLOWTRAPS {
- ret = (select(fd + 1, (SELECT_ARG_2_T) & f, NULL, NULL, NULL) == -1 ?
- EOF : read(fd, buf, n));
- } DISALLOWTRAPS;
-
- return ret;
+ return (select(fd + 1, (SELECT_ARG_2_T) & f, NULL, NULL, NULL) == -1 ?
+ EOF : read(fd, buf, n));
}
# define read breakread
@@ -394,7 +389,7 @@ getkey(int keytmout)
# else
ioctl(SHTTY, TCSETA, &ti.tio);
# endif
- r = ztrapread(SHTTY, &cc, 1);
+ r = read(SHTTY, &cc, 1);
# ifdef HAVE_TERMIOS_H
tcsetattr(SHTTY, TCSANOW, &shttyinfo.tio);
# else
@@ -405,7 +400,7 @@ getkey(int keytmout)
#endif
}
for (;;) {
- r = ztrapread(SHTTY, &cc, 1);
+ r = read(SHTTY, &cc, 1);
if (r == 1)
break;
if (r == 0) {
@@ -664,8 +659,11 @@ execzlefunc(Thingy func, char **args)
ret = completecall(args);
if (atcurhist)
histline = curhist;
- } else
+ } else {
+ queue_signals();
ret = w->u.fn(args);
+ unqueue_signals();
+ }
if (!(wflags & ZLE_NOTCOMMAND))
lastcmd = wflags;
}
@@ -836,9 +834,11 @@ bin_vared(char *name, char **args, char *ops, int func)
}
/* handle non-existent parameter */
s = args[0];
+ queue_signals();
v = fetchvalue(&vbuf, &s, (!create || type == PM_SCALAR),
SCANPM_WANTKEYS|SCANPM_WANTVALS|SCANPM_MATCHMANY);
if (!v && !create) {
+ unqueue_signals();
zwarnnam(name, "no such variable: %s", args[0], 0);
return 1;
} else if (v) {
@@ -885,11 +885,13 @@ bin_vared(char *name, char **args, char *ops, int func)
} else {
s = ztrdup(getstrvalue(v));
}
- pm = v->pm;
+ unqueue_signals();
} else if (*s) {
+ unqueue_signals();
zwarnnam(name, "invalid parameter name: %s", args[0], 0);
return 1;
} else {
+ unqueue_signals();
s = ztrdup(s);
}
@@ -935,14 +937,12 @@ bin_vared(char *name, char **args, char *ops, int func)
if (t[strlen(t) - 1] == '\n')
t[strlen(t) - 1] = '\0';
/* final assignment of parameter value */
- if (create && (!pm || (type && PM_TYPE(pm->flags) != type))) {
- if (pm)
- unsetparam(args[0]);
+ if (create) {
+ unsetparam(args[0]);
createparam(args[0], type);
- pm = 0;
}
- if (!pm)
- pm = (Param) paramtab->getnode(paramtab, args[0]);
+ queue_signals();
+ pm = (Param) paramtab->getnode(paramtab, args[0]);
if (pm && (PM_TYPE(pm->flags) & (PM_ARRAY|PM_HASHED))) {
char **a;
@@ -957,6 +957,7 @@ bin_vared(char *name, char **args, char *ops, int func)
sethparam(args[0], a);
} else
setsparam(args[0], t);
+ unqueue_signals();
return 0;
}
diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c
index d6250ce23..7476b833b 100644
--- a/Src/Zle/zle_tricky.c
+++ b/Src/Zle/zle_tricky.c
@@ -535,24 +535,33 @@ parambeg(char *s)
static int
docomplete(int lst)
{
+ static int active = 0;
+
char *s, *ol;
int olst = lst, chl = 0, ne = noerrs, ocs, ret = 0, dat[2];
+ if (active) {
+ zwarn("completion cannot be used recursively (yet)", NULL, 0);
+ return 1;
+ }
+ active = 1;
if (undoing)
setlastline();
if (!module_loaded("zsh/complete"))
load_module("zsh/compctl");
- if (runhookdef(BEFORECOMPLETEHOOK, (void *) &lst))
+ if (runhookdef(BEFORECOMPLETEHOOK, (void *) &lst)) {
+ active = 0;
return 0;
-
+ }
/* Expand history references before starting completion. If anything *
* changed, do no more. */
- if (doexpandhist())
+ if (doexpandhist()) {
+ active = 0;
return 0;
-
+ }
metafy_line();
ocs = cs;
@@ -608,6 +617,7 @@ docomplete(int lst)
unmetafy_line();
zsfree(s);
zsfree(qword);
+ active = 0;
return 1;
}
ocs = cs;
@@ -785,6 +795,7 @@ docomplete(int lst)
dat[1] = ret;
runhookdef(AFTERCOMPLETEHOOK, (void *) dat);
+ active = 0;
return dat[1];
}