diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | Completion/Base/Completer/_expand_alias | 2 | ||||
-rw-r--r-- | Src/Zle/compcore.c | 2 | ||||
-rw-r--r-- | Src/utils.c | 44 | ||||
-rw-r--r-- | Src/ztype.h | 9 |
5 files changed, 56 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog index cd8978e73..0ba82a4c5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2014-10-02 Barton E. Schaefer <schaefer@zsh.org> + + * 33320 (cf. PWS 33311): Completion/Base/Completer/_expand_alias, + Src/Zle/compcore.c, Src/utils.c, Src/ztype.h: revert 33069; add + typtab_flags bits (replaces specialcomma boolean) to record any + unusual handling of typtab entries; signal safety; make bangchar + non-special during completion lexing of the command line. + 2014-10-02 Peter Stephenson <p.stephenson@samsung.com> * 33325: Src/exec.c, Test/A05execution.ztst: fix ksh autoloads diff --git a/Completion/Base/Completer/_expand_alias b/Completion/Base/Completer/_expand_alias index 9064ce830..8240e4162 100644 --- a/Completion/Base/Completer/_expand_alias +++ b/Completion/Base/Completer/_expand_alias @@ -25,8 +25,6 @@ else pre=(_main_complete - aliases) fi -[[ "$compstate[quoting]" = (single|double) ]] || word="${(Q)word}" - zstyle -s ":completion:${curcontext}:" regular tmp || tmp=yes case $tmp in always) sel=r;; diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c index ac7785ab7..35d410cc6 100644 --- a/Src/Zle/compcore.c +++ b/Src/Zle/compcore.c @@ -702,6 +702,7 @@ callcompfunc(char *s, char *fn) } zsfree(compprefix); zsfree(compsuffix); + makebangspecial(0); if (unset(COMPLETEINWORD)) { tmp = (linwhat == IN_MATH ? dupstring(s) : multiquote(s, 0)); untokenize(tmp); @@ -722,6 +723,7 @@ callcompfunc(char *s, char *fn) untokenize(ss); compsuffix = ztrdup(ss); } + makebangspecial(1); zsfree(complastprefix); zsfree(complastsuffix); complastprefix = ztrdup(compprefix); diff --git a/Src/utils.c b/Src/utils.c index 9109f66a7..e6eb8e6a7 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -3424,12 +3424,12 @@ equalsplit(char *s, char **t) return 0; } -static int specialcomma; /* the ztypes table */ /**/ mod_export short int typtab[256]; +static int typtab_flags = 0; /* initialize the ztypes table */ @@ -3440,8 +3440,15 @@ inittyptab(void) int t0; char *s; - for (t0 = 0; t0 != 256; t0++) - typtab[t0] = 0; + if (!(typtab_flags & ZTF_INIT)) { + typtab_flags = ZTF_INIT; + if (interact && isset(SHINSTDIN)) + typtab_flags |= ZTF_INTERACT; + } + + queue_signals(); + + memset(typtab, 0, sizeof(typtab)); for (t0 = 0; t0 != 32; t0++) typtab[t0] = typtab[t0 + 128] = ICNTRL; typtab[127] = ICNTRL; @@ -3514,20 +3521,43 @@ inittyptab(void) #endif for (s = SPECCHARS; *s; s++) typtab[STOUC(*s)] |= ISPECIAL; - if (specialcomma) + if (typtab_flags & ZTF_SP_COMMA) typtab[STOUC(',')] |= ISPECIAL; - if (isset(BANGHIST) && bangchar && interact && isset(SHINSTDIN)) + if (isset(BANGHIST) && bangchar && (typtab_flags & ZTF_INTERACT)) { + typtab_flags |= ZTF_BANGCHAR; typtab[bangchar] |= ISPECIAL; + } else + typtab_flags &= ~ZTF_BANGCHAR; + + unqueue_signals(); } /**/ mod_export void makecommaspecial(int yesno) { - if ((specialcomma = yesno) != 0) + if (yesno != 0) { + typtab_flags |= ZTF_SP_COMMA; typtab[STOUC(',')] |= ISPECIAL; - else + } else { + typtab_flags &= ~ZTF_SP_COMMA; typtab[STOUC(',')] &= ~ISPECIAL; + } +} + +/**/ +mod_export void +makebangspecial(int yesno) +{ + /* Name and call signature for congruence with makecommaspecial(), + * but in this case when yesno is nonzero we defer to the state + * saved by inittyptab(). + */ + if (yesno == 0) { + typtab[bangchar] &= ~ISPECIAL; + } else if (typtab_flags & ZTF_BANGCHAR) { + typtab[bangchar] |= ISPECIAL; + } } diff --git a/Src/ztype.h b/Src/ztype.h index 14f66101c..eef0f23db 100644 --- a/Src/ztype.h +++ b/Src/ztype.h @@ -59,6 +59,15 @@ #define iwsep(X) zistype(X,IWSEP) #define inull(X) zistype(X,INULL) +/* + * Bit flags for typtab_flags --- preserved after + * shell initialisation. + */ +#define ZTF_INIT (0x0001) /* One-off initialisation done */ +#define ZTF_INTERACT (0x0002) /* Shell interative and reading from stdin */ +#define ZTF_SP_COMMA (0x0004) /* Treat comma as a special characters */ +#define ZTF_BANGCHAR (0x0008) /* Treat bangchar as a special character */ + #ifdef MULTIBYTE_SUPPORT #define WC_ZISTYPE(X,Y) wcsitype((X),(Y)) #define WC_ISPRINT(X) iswprint(X) |