diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Zle/complist.c | 2 | ||||
-rw-r--r-- | Src/Zle/zle_refresh.c | 3 | ||||
-rw-r--r-- | Src/Zle/zle_tricky.c | 2 | ||||
-rw-r--r-- | Src/Zle/zle_utils.c | 5 | ||||
-rw-r--r-- | Src/exec.c | 4 | ||||
-rw-r--r-- | Src/hashtable.c | 5 | ||||
-rw-r--r-- | Src/params.c | 9 | ||||
-rw-r--r-- | Src/pattern.c | 26 | ||||
-rw-r--r-- | Src/signals.c | 5 | ||||
-rw-r--r-- | Src/text.c | 4 | ||||
-rw-r--r-- | Src/utils.c | 10 |
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: |