diff options
author | Barton E. Schaefer <schaefer@zsh.org> | 2014-10-02 08:39:43 -0700 |
---|---|---|
committer | Barton E. Schaefer <schaefer@zsh.org> | 2014-10-02 08:39:43 -0700 |
commit | 57252dc1e0b9f3b67189ac4957e51c31ee156ff6 (patch) | |
tree | df98604eed85eed5a61d7b38ea9469dd5a6238b4 /Src | |
parent | 7adc786b0594d55de737e8ae63c3b34d9caa1ede (diff) | |
download | zsh-57252dc1e0b9f3b67189ac4957e51c31ee156ff6.tar.gz zsh-57252dc1e0b9f3b67189ac4957e51c31ee156ff6.tar.xz zsh-57252dc1e0b9f3b67189ac4957e51c31ee156ff6.zip |
33320 (cf. PWS 33311): revert 33069, fix lexing of bangchar during completion
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.
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Zle/compcore.c | 2 | ||||
-rw-r--r-- | Src/utils.c | 44 | ||||
-rw-r--r-- | Src/ztype.h | 9 |
3 files changed, 48 insertions, 7 deletions
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) |