Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: 3.0.8 Re: PATCH: reverse string subscripting



On Apr 5,  1:22pm, Sven Wischnowsky wrote:
} 
}   % a=abcd
}   % echo $a[1,(r)d]
} 
} didn't work, because it stopped one character too early trying to find
} the matching substring for `d'.

It appears that all 3.0 versions of zsh have this same bug, for both
forward and reverse pattern matches.  The third hunk below is just an
optimization (avoid redoing the strlen()).


Index: Src/params.c
===================================================================
--- Src/params.c	2000/09/27 03:18:54	1.1.1.6.4.6
+++ Src/params.c	2001/04/05 16:01:19
@@ -468,12 +468,14 @@
 		    }
 		return a2 ? -1 : 0;
 	    } else {
+	    	char *de;
 		d = getstrvalue(v);
 		if (!d || !*d)
 		    return 0;
+		de = d + strlen(d);
 		if (a2) {
 		    if (down)
-			for (r = -2, t = d + strlen(d) - 1; t >= d; r--, t--) {
+			for (r = -2, t = de; t >= d; r--, t--) {
 			    sav = *t;
 			    *t = '\0';
 			    if (domatch(d, c, 0) && !--num) {
@@ -482,7 +484,7 @@
 			    }
 			    *t = sav;
 		    } else
-			for (r = 0, t = d; *t; r++, t++) {
+			for (r = 0, t = d; t <= de; r++, t++) {
 			    sav = *t;
 			    *t = '\0';
 			    if (domatch(d, c, 0) && !--num) {
@@ -493,11 +495,11 @@
 			}
 		} else {
 		    if (down)
-			for (r = -1, t = d + strlen(d) - 1; t >= d; r--, t--) {
+			for (r = -1, t = de - 1; t >= d; r--, t--) {
 			    if (domatch(t, c, 0) && !--num)
 				return r;
 		    } else
-			for (r = 1, t = d; *t; r++, t++)
+			for (r = 1, t = d; t < de; r++, t++)
 			    if (domatch(t, c, 0) && !--num)
 				return r;
 		}

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com

Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net   



Messages sorted by: Reverse Date, Date, Thread, Author