diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | Completion/compinit | 3 | ||||
-rw-r--r-- | Src/glob.c | 35 | ||||
-rw-r--r-- | Src/pattern.c | 75 |
4 files changed, 87 insertions, 36 deletions
diff --git a/ChangeLog b/ChangeLog index f85626314..c495ede95 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2013-06-13 Peter Stephenson <p.w.stephenson@ntlworld.com> + + * 31465: Completion/compinit, Src/glob.c, Src/pattern.c: fix + basic completion and globbing use of pattern disables. + + * 31444: Doc/Zsh/builtins.yo, Doc/Zsh/options.yo, + Doc/zmacros.yo, Src/builtin.c, Src/exec.c, Src/options.c, + Src/pattern.c, Src/zsh.h: Basic (not fully functional) code for + enable/disable -p. + 2013-06-13 Barton E. Schaefer <schaefer@zsh.org> * 31474: Makefile.in, Src/zsh.mdd: create patchlevel.h correctly diff --git a/Completion/compinit b/Completion/compinit index 7b8a34619..f9d2c574c 100644 --- a/Completion/compinit +++ b/Completion/compinit @@ -163,8 +163,9 @@ _comp_options=( typeset -g _comp_setup='local -A _comp_caller_options; _comp_caller_options=(${(kv)options[@]}); - setopt localoptions localtraps ${_comp_options[@]}; + setopt localoptions localtraps localpatterns ${_comp_options[@]}; local IFS=$'\'\ \\t\\r\\n\\0\'' + enable -p \| \~ \( \? \* \[ \< \^ \# exec </dev/null; trap - ZERR local -a reply diff --git a/Src/glob.c b/Src/glob.c index db86d2468..0defb1a0f 100644 --- a/Src/glob.c +++ b/Src/glob.c @@ -445,41 +445,6 @@ insert(char *s, int checked) unqueue_signals(); } -/* Check to see if str is eligible for filename generation. */ - -/**/ -mod_export int -haswilds(char *str) -{ - /* `[' and `]' are legal even if bad patterns are usually not. */ - if ((*str == Inbrack || *str == Outbrack) && !str[1]) - return 0; - - /* If % is immediately followed by ?, then that ? is * - * not treated as a wildcard. This is so you don't have * - * to escape job references such as %?foo. */ - if (str[0] == '%' && str[1] == Quest) - str[1] = '?'; - - for (; *str; str++) { - switch (*str) { - case Inpar: - case Bar: - case Star: - case Inbrack: - case Inang: - case Quest: - return 1; - case Pound: - case Hat: - if (isset(EXTENDEDGLOB)) - return 1; - break; - } - } - return 0; -} - /* Do the globbing: scanner is called recursively * * with successive bits of the path until we've * * tried all of it. */ diff --git a/Src/pattern.c b/Src/pattern.c index a90d3cddc..b7897e75c 100644 --- a/Src/pattern.c +++ b/Src/pattern.c @@ -3966,3 +3966,78 @@ clearpatterndisables(void) { memset(zpc_disables, 0, ZPC_COUNT); } + + +/* Check to see if str is eligible for filename generation. */ + +/**/ +mod_export int +haswilds(char *str) +{ + char *start; + + /* `[' and `]' are legal even if bad patterns are usually not. */ + if ((*str == Inbrack || *str == Outbrack) && !str[1]) + return 0; + + /* If % is immediately followed by ?, then that ? is * + * not treated as a wildcard. This is so you don't have * + * to escape job references such as %?foo. */ + if (str[0] == '%' && str[1] == Quest) + str[1] = '?'; + + /* + * Note that at this point zpc_special has not been set up. + */ + start = str; + for (; *str; str++) { + switch (*str) { + case Inpar: + if ((!isset(SHGLOB) && !zpc_disables[ZPC_INPAR]) || + (str > start && isset(KSHGLOB) && + ((str[-1] == Quest && !zpc_disables[ZPC_KSH_QUEST]) || + (str[-1] == Star && !zpc_disables[ZPC_KSH_STAR]) || + (str[-1] == '+' && !zpc_disables[ZPC_KSH_PLUS]) || + (str[-1] == '!' && !zpc_disables[ZPC_KSH_BANG]) || + (str[-1] == '@' && !zpc_disables[ZPC_KSH_AT])))) + return 1; + break; + + case Bar: + if (!zpc_disables[ZPC_BAR]) + return 1; + break; + + case Star: + if (!zpc_disables[ZPC_STAR]) + return 1; + break; + + case Inbrack: + if (!zpc_disables[ZPC_INBRACK]) + return 1; + break; + + case Inang: + if (!zpc_disables[ZPC_INANG]) + return 1; + break; + + case Quest: + if (!zpc_disables[ZPC_QUEST]) + return 1; + break; + + case Pound: + if (isset(EXTENDEDGLOB) && !zpc_disables[ZPC_HASH]) + return 1; + break; + + case Hat: + if (isset(EXTENDEDGLOB) && !zpc_disables[ZPC_HAT]) + return 1; + break; + } + } + return 0; +} |