From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from euclid.skiles.gatech.edu (list@euclid.skiles.gatech.edu [130.207.146.50]) by coral.primenet.com.au (8.7.5/8.7.3) with ESMTP id JAA19256 for ; Thu, 3 Oct 1996 09:36:27 +1000 (EST) Received: (from list@localhost) by euclid.skiles.gatech.edu (8.7.3/8.7.3) id TAA06588; Wed, 2 Oct 1996 19:24:45 -0400 (EDT) Resent-Date: Wed, 2 Oct 1996 19:24:45 -0400 (EDT) From: Zoltan Hidvegi Message-Id: <199610022156.XAA00979@hzoli.ppp.cs.elte.hu> Subject: Re: Old 'cd ......' function broken. To: pws@ifh.de (Peter Stephenson) Date: Wed, 2 Oct 1996 23:56:04 +0200 (MET DST) Cc: peta@cim.mcgill.ca, zsh-workers@math.gatech.edu In-Reply-To: <199610011522.RAA02255@sgi.ifh.de> from Peter Stephenson at "Oct 1, 96 05:22:00 pm" X-Mailer: ELM [version 2.4ME+ PL17 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Resent-Message-ID: <"i75tC1.0.sc1.zclKo"@euclid> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/2189 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu > peta@cim.mcgill.ca wrote: > > I got this from the zsh mailing list a while ago. It used to work > > but no more (zsh-3.0.0). It doesnt like ${(r:(${#1}-1)*3-1::../:)b} > > It looks like the expression after the first : isn't being interpreted > as a mathematical expression for evaluation any more. Somebody will > know if this is a feature, otherwise it's a bug. You can get away > with: The expression is interpreted as a mathematical expression but it does not expanded before arithmetic evaluation. The patch below fixes that. Zoltan rcsdiff -qc -kk -r2.50 -r2.51 subst.c *** Src/subst.c --- Src/subst.c 1996/10/02 21:51:13 2.51 *************** *** 654,659 **** --- 654,687 ---- return s; } + /**/ + int + get_intarg(char **s) + { + char *t = get_strarg(*s + 1); + char *p, sav; + long ret; + + if (!*t) + return -1; + sav = *t; + *t = '\0'; + p = dupstring(*s + 2); + *s = t; + *t = sav; + if (parsestr(p)) + return -1; + singsub(&p); + if (errflag) + return -1; + ret = matheval(p); + if (errflag) + return -1; + if (ret < 0) + ret = -ret; + return ret < 0 ? -ret : ret; + } + /* parameter substitution */ #define isstring(c) ((c) == '$' || (char)(c) == String || (char)(c) == Qstring) *************** *** 708,714 **** inbrace = 1; s++; if (*s == '(' || *s == Inpar) { ! char *t, sav, *d; int tt = 0; long num; int escapes = 0; --- 736,742 ---- inbrace = 1; s++; if (*s == '(' || *s == Inpar) { ! char *t, sav; int tt = 0; long num; int escapes = 0; *************** *** 751,768 **** substr = 1; break; case 'I': ! flnum = 0; ! t = get_strarg(++s); ! if (*t) { ! sav = *t; ! *t = '\0'; ! d = dupstring(s + 1); ! untokenize(d); ! if ((flnum = mathevalarg(s + 1, &d)) < 0) ! flnum = -flnum; ! *t = sav; ! s = t; ! } else goto flagerr; break; --- 779,786 ---- substr = 1; break; case 'I': ! flnum = get_intarg(&s); ! if (flnum < 0) goto flagerr; break; *************** *** 828,854 **** tt = 1; /* fall through */ case 'r': ! t = get_strarg(++s); ! if (!*t) goto flagerr; - sav = *t; - *t = '\0'; - d = dupstring(s + 1); - untokenize(d); - if ((num = mathevalarg(d, &d)) < 0) - num = -num; if (tt) prenum = num; else postnum = num; ! *t = sav; ! sav = *s; ! s = t + 1; ! if (*s != sav) { ! s--; ! break; ! } ! t = get_strarg(s); if (!*t) goto flagerr; sav = *t; --- 846,859 ---- tt = 1; /* fall through */ case 'r': ! num = get_intarg(&s); ! if (num < 0) goto flagerr; if (tt) prenum = num; else postnum = num; ! t = get_strarg(++s); if (!*t) goto flagerr; sav = *t; *************** *** 1608,1625 **** (*ptr)++; break; case 'F': ! rec = -1; (*ptr)++; - ptr1 = get_strarg(ptr2 = *ptr); - if ((sav = *ptr1)) - *ptr1 = '\0'; - ptr2 = dupstring(ptr2 + 1); - if (sav) - *ptr1 = sav; - untokenize(ptr2); - rec = mathevalarg(ptr2, &ptr2); - *ptr = ptr1 + 1; - c = '\0'; break; default: *ptr = lptr; --- 1613,1620 ---- (*ptr)++; break; case 'F': ! rec = get_intarg(ptr); (*ptr)++; break; default: *ptr = lptr;