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/utils.c | |
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/utils.c')
-rw-r--r-- | Src/utils.c | 44 |
1 files changed, 37 insertions, 7 deletions
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; + } } |