about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <p.w.stephenson@ntlworld.com>2013-12-16 22:20:06 +0000
committerPeter Stephenson <p.w.stephenson@ntlworld.com>2013-12-16 22:20:06 +0000
commitdb23c630051fe330782cda4089a16de7ec579f29 (patch)
treea5116fd1f42c7d42b5490d169a054a344731bf82
parentf06851f50d78b17a45159976aa167682ffdb87c2 (diff)
downloadzsh-db23c630051fe330782cda4089a16de7ec579f29.tar.gz
zsh-db23c630051fe330782cda4089a16de7ec579f29.tar.xz
zsh-db23c630051fe330782cda4089a16de7ec579f29.zip
32136: fix problem with kshglob.
Non-pattern characters that could be followed by "(" to introduce
a ksh glob but weren't caused failures.
-rw-r--r--ChangeLog4
-rw-r--r--Src/pattern.c14
-rw-r--r--Src/zsh.h6
-rw-r--r--Test/D02glob.ztst27
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)