From 347a63da0cf1c681ac97c21a107b4722abf449b2 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Thu, 13 Jun 2013 18:40:36 +0100 Subject: 31465: fix basic completion and globbing uses of disabled patterns --- Src/glob.c | 35 ---------------------------- Src/pattern.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 35 deletions(-) (limited to 'Src') 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; +} -- cgit 1.4.1