diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | Src/pattern.c | 14 | ||||
-rw-r--r-- | Src/zsh.h | 6 | ||||
-rw-r--r-- | Test/D02glob.ztst | 27 |
4 files changed, 46 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog index 6460ccc90..a1085bd23 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2013-12-16 Peter Stephenson <p.w.stephenson@ntlworld.com> + * 32136: Src/pattern.c, Src/zsh.h, Test/D02glob.ztst: + fix problem with +*, @*, !* when kshglob is set introduced + by pattern disable feature. + * unposted: NEWS: add ZLE_PROMPT_INDENT. * Patrick Oscity + pws: 32114: Doc/Zsh/params.yo, diff --git a/Src/pattern.c b/Src/pattern.c index a7ef12573..b79c3b444 100644 --- a/Src/pattern.c +++ b/Src/pattern.c @@ -1265,12 +1265,18 @@ patcomppiece(int *flagp, int paren) * the character following is an end-of-segment character. Thus * tildes are not special if there is nothing following to * be excluded. + * + * Don't look for X()-style kshglobs at this point; we've + * checked above for the case with parentheses and we don't + * want to match without parentheses. */ - if (kshchar || (memchr(zpc_special, *patparse, ZPC_COUNT) && - (*patparse != zpc_special[ZPC_TILDE] || - patparse[1] == '/' || - !memchr(zpc_special, patparse[1], ZPC_SEG_COUNT)))) + if (kshchar || + (memchr(zpc_special, *patparse, ZPC_NO_KSH_GLOB) && + (*patparse != zpc_special[ZPC_TILDE] || + patparse[1] == '/' || + !memchr(zpc_special, patparse[1], ZPC_SEG_COUNT)))) { break; + } } /* Remember the previous character for backtracking */ diff --git a/Src/zsh.h b/Src/zsh.h index a935d23ad..c86d2a62c 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -1417,7 +1417,11 @@ enum zpc_chars { ZPC_HAT, /* ^ for exclusion (extended glob) */ ZPC_HASH, /* # for repetition (extended glob) */ ZPC_BNULLKEEP, /* Special backslashed null not removed */ - ZPC_KSH_QUEST, /* ? for ?(...) in KSH_GLOB */ + /* + * These characters are only valid before a parenthesis + */ + ZPC_NO_KSH_GLOB, + ZPC_KSH_QUEST = ZPC_NO_KSH_GLOB, /* ? for ?(...) in KSH_GLOB */ ZPC_KSH_STAR, /* * for *(...) in KSH_GLOB */ ZPC_KSH_PLUS, /* + for +(...) in KSH_GLOB */ ZPC_KSH_BANG, /* ! for !(...) in KSH_GLOB */ diff --git a/Test/D02glob.ztst b/Test/D02glob.ztst index 81b002120..1f8f65286 100644 --- a/Test/D02glob.ztst +++ b/Test/D02glob.ztst @@ -499,3 +499,30 @@ ) 0:No error with empty null glob with (N). > + + (setopt kshglob + test_array=( + '+fours' '+*' + '@titude' '@*' + '!bang' '!*' + # and check they work in the real kshglob cases too... + '+bus+bus' '+(+bus|-car)' + '@sinhats' '@(@sinhats|wrensinfens)' + '!kerror' '!(!somethingelse)' + # and these don't match, to be sure + '+more' '+(+less)' + '@all@all' '@(@all)' + '!goesitall' '!(!goesitall)' + ) + for str pat in $test_array; do + eval "[[ $str = $pat ]]" && print "$str matches $pat" + done + true + ) +0:kshglob option does not break +, @, ! without following open parenthesis +>+fours matches +* +>@titude matches @* +>!bang matches !* +>+bus+bus matches +(+bus|-car) +>@sinhats matches @(@sinhats|wrensinfens) +>!kerror matches !(!somethingelse) |