summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/Zle/complist.c2
-rw-r--r--Src/Zle/zle_refresh.c3
-rw-r--r--Src/Zle/zle_tricky.c2
-rw-r--r--Src/Zle/zle_utils.c5
-rw-r--r--Src/exec.c4
-rw-r--r--Src/hashtable.c5
-rw-r--r--Src/params.c9
-rw-r--r--Src/pattern.c26
-rw-r--r--Src/signals.c5
-rw-r--r--Src/text.c4
-rw-r--r--Src/utils.c10
11 files changed, 59 insertions, 16 deletions
diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c
index fd90ccb31..01bcb7cf8 100644
--- a/Src/Zle/complist.c
+++ b/Src/Zle/complist.c
@@ -2386,7 +2386,7 @@ domenuselect(Hookdef dummy, Chdata dat)
* to be metafied locally in a couple of places.
* It's horrifically difficult to work out where the line
* is metafied, so I've resorted to the following.
- * Unfortunately we need to unmetatfy in zrefresh() when
+ * Unfortunately we need to unmetafy in zrefresh() when
* we want to display something. Maybe this function can
* be done better.
*/
diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c
index 78046fb7b..0c28c0a2d 100644
--- a/Src/Zle/zle_refresh.c
+++ b/Src/Zle/zle_refresh.c
@@ -1761,7 +1761,8 @@ singlelineout:
inlist = 1;
listmatches();
inlist = 0;
- zrefresh();
+ if (!errflag)
+ zrefresh();
}
if (showinglist == -1)
showinglist = nlnct;
diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c
index 97bdcc020..b1a6f9e7e 100644
--- a/Src/Zle/zle_tricky.c
+++ b/Src/Zle/zle_tricky.c
@@ -2812,6 +2812,8 @@ doexpandhist(void)
do {
ctxtlex();
} while (tok != ENDINPUT && tok != LEXERR);
+ if (tok == LEXERR)
+ lexstop = 0;
while (!lexstop)
hgetc();
/* We have to save errflags because it's reset in zcontext_restore. Since *
diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c
index d1d320613..9751f7a1f 100644
--- a/Src/Zle/zle_utils.c
+++ b/Src/Zle/zle_utils.c
@@ -1183,6 +1183,11 @@ getzlequery(void)
/* get a character from the tty and interpret it */
c = getfullchar(0);
+ /*
+ * We'll interpret an interruption here as only interrupting the
+ * query, not the line editor.
+ */
+ errflag &= ~ERRFLAG_INT;
if (c == ZWC('\t'))
c = ZWC('y');
else if (ZC_icntrl(c) || c == ZLEEOF)
diff --git a/Src/exec.c b/Src/exec.c
index 45f1c66f0..109a04a26 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -5392,7 +5392,9 @@ getfpfunc(char *s, int *ksh, char **fname)
}
unmetafy(buf, NULL);
if (!access(buf, R_OK) && (fd = open(buf, O_RDONLY | O_NOCTTY)) != -1) {
- if ((len = lseek(fd, 0, 2)) != -1) {
+ struct stat st;
+ if (!fstat(fd, &st) && S_ISREG(st.st_mode) &&
+ (len = lseek(fd, 0, 2)) != -1) {
d = (char *) zalloc(len + 1);
lseek(fd, 0, 0);
if ((rlen = read(fd, d, len)) >= 0) {
diff --git a/Src/hashtable.c b/Src/hashtable.c
index 90739a882..2d1ff87cb 100644
--- a/Src/hashtable.c
+++ b/Src/hashtable.c
@@ -1234,7 +1234,10 @@ printaliasnode(HashNode hn, int printflags)
}
if (printflags & PRINT_WHENCE_WORD) {
- printf("%s: alias\n", a->node.nam);
+ if (a->node.flags & ALIAS_SUFFIX)
+ printf("%s: suffix alias\n", a->node.nam);
+ else
+ printf("%s: alias\n", a->node.nam);
return;
}
diff --git a/Src/params.c b/Src/params.c
index 00f43e47d..de151a4cd 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -3312,9 +3312,12 @@ arrhashsetfn(Param pm, char **val, int augment)
zerr("bad set of key/value pairs for associative array");
return;
}
- if (alen)
- if (!(augment && (ht = paramtab = pm->gsu.h->getfn(pm))))
- ht = paramtab = newparamtable(17, pm->node.nam);
+ if (augment) {
+ ht = paramtab = pm->gsu.h->getfn(pm);
+ }
+ if (alen && (!augment || !paramtab)) {
+ ht = paramtab = newparamtable(17, pm->node.nam);
+ }
while (*aptr) {
/* The parameter name is ztrdup'd... */
v->pm = createparam(*aptr, PM_SCALAR|PM_UNSET);
diff --git a/Src/pattern.c b/Src/pattern.c
index 7d38988a0..b4ba33e49 100644
--- a/Src/pattern.c
+++ b/Src/pattern.c
@@ -224,6 +224,22 @@ typedef zlong zrange_t;
typedef unsigned long zrange_t;
#endif
+#ifdef MULTIBYTE_SUPPORT
+/*
+ * Handle a byte that's not part of a valid character.
+ *
+ * This range in Unicode is recommended for purposes of this
+ * kind as it corresponds to invalid characters.
+ *
+ * Note that this strictly only works if wchar_t represents
+ * Unicode code points, which isn't necessarily true; however,
+ * converting an invalid character into an unknown format is
+ * a bit tricky...
+ */
+#define WCHAR_INVALID(ch) \
+ ((wchar_t) (0xDC00 + STOUC(ch)))
+#endif /* MULTIBYTE_SUPPORT */
+
/*
* Array of characters corresponding to zpc_chars enum, which it must match.
*/
@@ -353,10 +369,10 @@ metacharinc(char **x)
return wc;
}
- /* Error. Treat as single byte. */
+ /* Error. */
/* Reset the shift state for next time. */
memset(&shiftstate, 0, sizeof(shiftstate));
- return (wchar_t) STOUC(*(*x)++);
+ return WCHAR_INVALID(*(*x)++);
}
#else
@@ -1867,10 +1883,10 @@ charref(char *x, char *y)
ret = mbrtowc(&wc, x, y-x, &shiftstate);
if (ret == MB_INVALID || ret == MB_INCOMPLETE) {
- /* Error. Treat as single byte. */
+ /* Error. */
/* Reset the shift state for next time. */
memset(&shiftstate, 0, sizeof(shiftstate));
- return (wchar_t) STOUC(*x);
+ return WCHAR_INVALID(*x);
}
return wc;
@@ -1922,7 +1938,7 @@ charrefinc(char **x, char *y, int *z)
*z = 1;
/* Reset the shift state for next time. */
memset(&shiftstate, 0, sizeof(shiftstate));
- return (wchar_t) STOUC(*(*x)++);
+ return WCHAR_INVALID(*(*x)++);
}
/* Nulls here are normal characters */
diff --git a/Src/signals.c b/Src/signals.c
index f45c1860c..aa0b5aaa7 100644
--- a/Src/signals.c
+++ b/Src/signals.c
@@ -1348,6 +1348,7 @@ void
dotrap(int sig)
{
void *funcprog;
+ int q = queue_signal_level();
if (sigtrapped[sig] & ZSIG_FUNC) {
HashNode hn = gettrapnode(sig, 0);
@@ -1370,5 +1371,9 @@ dotrap(int sig)
if ((sigtrapped[sig] & ZSIG_IGNORED) || !funcprog || errflag)
return;
+ dont_queue_signals();
+
dotrapargs(sig, sigtrapped+sig, funcprog);
+
+ restore_queue_signals(q);
}
diff --git a/Src/text.c b/Src/text.c
index 3978a26a9..7e65f43a4 100644
--- a/Src/text.c
+++ b/Src/text.c
@@ -77,8 +77,8 @@ taddpending(char *str1, char *str2)
*/
if (tpending) {
int oldlen = strlen(tpending);
- tpending = zrealloc(tpending, len + oldlen);
- sprintf(tpending + oldlen, "%s%s", str1, str2);
+ tpending = zrealloc(tpending, len + oldlen + 1);
+ sprintf(tpending + oldlen, "\n%s%s", str1, str2);
} else {
tpending = (char *)zalloc(len);
sprintf(tpending, "%s%s", str1, str2);
diff --git a/Src/utils.c b/Src/utils.c
index 4c4dc55cd..ca68eae32 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -2538,11 +2538,16 @@ static int
read1char(int echo)
{
char c;
+ int q = queue_signal_level();
+ dont_queue_signals();
while (read(SHTTY, &c, 1) != 1) {
- if (errno != EINTR || errflag || retflag || breaks || contflag)
+ if (errno != EINTR || errflag || retflag || breaks || contflag) {
+ restore_queue_signals(q);
return -1;
+ }
}
+ restore_queue_signals(q);
if (echo)
write_loop(SHTTY, &c, 1);
return STOUC(c);
@@ -3083,7 +3088,8 @@ morefmt:
case '#':
case '_':
case '-':
- case '0' ... '9':
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
goto morefmt;
strftimehandling:
default: