summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2015-10-27 11:54:19 +0000
committerPeter Stephenson <pws@zsh.org>2015-10-27 11:54:19 +0000
commitb498bd7ce5b8f126f420f8f9fd4946912f8334da (patch)
treed85eca8c5af3da0279f6e661e1534664603911e0
parent63fd71f171e9d282985ba24e5f3ee2507bce6f47 (diff)
downloadzsh-b498bd7ce5b8f126f420f8f9fd4946912f8334da.tar.gz
zsh-b498bd7ce5b8f126f420f8f9fd4946912f8334da.tar.xz
zsh-b498bd7ce5b8f126f420f8f9fd4946912f8334da.zip
36982: Fix bug with (#cN) patterns and remove redundant description.
We need to restore the current count of matches when returning to
match at the point where we previously matched.
-rw-r--r--ChangeLog4
-rw-r--r--Doc/Zsh/expn.yo10
-rw-r--r--Src/pattern.c1
-rw-r--r--Test/D02glob.ztst8
-rw-r--r--Test/D04parameter.ztst9
5 files changed, 22 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index b64f785f7..cd8359281 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2015-10-27  Peter Stephenson  <p.stephenson@samsung.com>
 
+	* 36982: Doc/Zsh/expn.yo, Src/pattern.c, Test/D02glob.ztst,
+	Test/D04parameter.ztst: fix actual bug with (#cN) and back off
+	previous change.
+
 	* 36977: Doc/Zsh/expn.yo: note about complications of pattern
 	repetitions (#cN).
 
diff --git a/Doc/Zsh/expn.yo b/Doc/Zsh/expn.yo
index 49a0f0d53..5ea8610f2 100644
--- a/Doc/Zsh/expn.yo
+++ b/Doc/Zsh/expn.yo
@@ -2192,16 +2192,6 @@ inclusive.  The form tt(LPAR()#c)var(N)tt(RPAR()) requires exactly tt(N)
 matches; tt(LPAR()#c,)var(M)tt(RPAR()) is equivalent to specifying var(N)
 as 0; tt(LPAR()#c)var(N)tt(,RPAR()) specifies that there is no maximum
 limit on the number of matches.
-
-Note that if the previous group of characters contains wildcards,
-results can be unpredictable to the point of being logically incorrect.
-It is recommended that the pattern be trimmed to match the minimum
-possible.  For example, to match a string of the form `tt(1_2_3_)', use
-a pattern of the form `tt(LPAR()[[:digit:]]##_+RPAR()LPAR()#c3+RPAR())', not
-`tt(LPAR()*_+RPAR()LPAR()#c3+RPAR())'.  This arises from the
-complicated interaction between attempts to match a number of
-repetitions of the whole pattern and attempts to match the wildcard
-`tt(*)'.
 )
 vindex(MATCH)
 vindex(MBEGIN)
diff --git a/Src/pattern.c b/Src/pattern.c
index 8b07cca92..9e8a80ae1 100644
--- a/Src/pattern.c
+++ b/Src/pattern.c
@@ -3376,6 +3376,7 @@ patmatch(Upat prog)
 		    scan[P_CT_CURRENT].l = cur + 1;
 		    if (patmatch(scan + P_CT_OPERAND))
 			return 1;
+		    scan[P_CT_CURRENT].l = cur;
 		    patinput = patinput_thistime;
 		}
 		if (cur < min)
diff --git a/Test/D02glob.ztst b/Test/D02glob.ztst
index 3e2095a0c..f944a4fbd 100644
--- a/Test/D02glob.ztst
+++ b/Test/D02glob.ztst
@@ -574,3 +574,11 @@
 0:Optimisation to squeeze multiple *'s used as ordinary glob wildcards.
 >glob.tmp/ra=1.0_et=3.5
 >glob.tmp/ra=1.0_et=3.5
+
+  [[ 1_2_ = (*_)(#c1) ]] && print 1 OK  # because * matches 1_2
+  [[ 1_2_ = (*_)(#c2) ]] && print 2 OK
+  [[ 1_2_ = (*_)(#c3) ]] || print 3 OK
+0:Some more complicated backtracking with match counts.
+>1 OK
+>2 OK
+>3 OK
diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst
index f1cc23e7c..cb7079c98 100644
--- a/Test/D04parameter.ztst
+++ b/Test/D04parameter.ztst
@@ -1735,3 +1735,12 @@
 0:History modifier works the same for scalar and array substitution
 >ddd bdb cdc
 >ddd bdb cdc
+
+ a=1_2_3_4_5_6
+ print ${a#(*_)(#c2)}
+ print ${a#(*_)(#c5)}
+ print ${a#(*_)(#c7)}
+0:Complicated backtracking with match counts
+>3_4_5_6
+>6
+>1_2_3_4_5_6