From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6691 invoked from network); 5 Apr 2001 16:16:51 -0000 Received: from sunsite.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 5 Apr 2001 16:16:51 -0000 Received: (qmail 301 invoked by alias); 5 Apr 2001 16:16:46 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 13912 Received: (qmail 288 invoked from network); 5 Apr 2001 16:16:46 -0000 From: "Bart Schaefer" Message-Id: <1010405161507.ZM9535@candle.brasslantern.com> Date: Thu, 5 Apr 2001 16:15:07 +0000 In-Reply-To: <200104051122.NAA06140@beta.informatik.hu-berlin.de> Comments: In reply to Sven Wischnowsky "PATCH: reverse string subscripting" (Apr 5, 1:22pm) References: <200104051122.NAA06140@beta.informatik.hu-berlin.de> X-Mailer: Z-Mail (5.0.0 30July97) To: zsh-workers@sunsite.dk Subject: PATCH: 3.0.8 Re: PATCH: reverse string subscripting MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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