From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13582 invoked from network); 1 Nov 2005 14:53:56 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 1 Nov 2005 14:53:56 -0000 Received: (qmail 59853 invoked from network); 1 Nov 2005 14:53:50 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 1 Nov 2005 14:53:50 -0000 Received: (qmail 2944 invoked by alias); 1 Nov 2005 14:53:47 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 21967 Received: (qmail 2933 invoked from network); 1 Nov 2005 14:53:46 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by sunsite.dk with SMTP; 1 Nov 2005 14:53:46 -0000 Received: (qmail 59570 invoked from network); 1 Nov 2005 14:53:46 -0000 Received: from cluster-d.mailcontrol.com (HELO rly14d.srv.mailcontrol.com) (217.69.20.190) by a.mx.sunsite.dk with SMTP; 1 Nov 2005 14:53:44 -0000 Received: from exchange03.csr.com (mailhost1.csr.com [81.105.217.43]) by rly14d.srv.mailcontrol.com (MailControl) with ESMTP id jA1ErTff028420 for ; Tue, 1 Nov 2005 14:53:43 GMT Received: from news01 ([10.103.143.38]) by exchange03.csr.com with Microsoft SMTPSVC(5.0.2195.6713); Tue, 1 Nov 2005 14:55:54 +0000 Date: Tue, 1 Nov 2005 14:53:29 +0000 From: Peter Stephenson To: zsh-workers@sunsite.dk Subject: Re: PATCH: CHR$(foo) => ${(#)foo} Message-Id: <20051101145329.0a091880.pws@csr.com> In-Reply-To: <200511011434.jA1EYf5B020570@news01.csr.com> References: <200511011434.jA1EYf5B020570@news01.csr.com> Organization: Cambridge Silicon Radio X-Mailer: Sylpheed version 0.9.12 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 01 Nov 2005 14:55:54.0863 (UTC) FILETIME=[5C1BA7F0:01C5DEF4] X-Scanned-By: MailControl A-05-40-01 (www.mailcontrol.com) on 10.68.0.124 X-Spam-Checker-Version: SpamAssassin 3.0.4 (2005-06-05) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.0.4 Peter Stephenson wrote: > There are lots of ways of turning a number into a character, but few the > other way round, none that I'm aware of convenient for use in general > substitutions. This adds the (#) expansion flag to do that. I couldn't > think of a better syntax, certainly none I was likely to remember. After posting this, I realised that handling arrays element by element was much more natural (consistent enough with other forms of array processing that it doesn't need specially documenting). You can do things like % foo=(0x41 0x42 0x43) % print ${(#j..)foo} ABC which was what I was trying to do in the first place. Index: Doc/Zsh/expn.yo =================================================================== RCS file: /cvsroot/zsh/zsh/Doc/Zsh/expn.yo,v retrieving revision 1.56 diff -u -r1.56 expn.yo --- Doc/Zsh/expn.yo 23 Sep 2005 17:03:17 -0000 1.56 +++ Doc/Zsh/expn.yo 1 Nov 2005 14:49:12 -0000 @@ -632,6 +632,11 @@ following flags are supported: startitem() +item(tt(#))( +Evaluate the parameter as a numeric expression and output the character +corresponding to the resulting integer. Note that this form is entirely +distinct from use of the tt(#) without parentheses. +) item(tt(%))( Expand all tt(%) escapes in the resulting words in the same way as in in prompts (see noderef(Prompt Expansion)). If this flag is given twice, Index: Src/subst.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/subst.c,v retrieving revision 1.42 diff -u -r1.42 subst.c --- Src/subst.c 13 Oct 2005 16:30:14 -0000 1.42 +++ Src/subst.c 1 Nov 2005 14:49:15 -0000 @@ -915,6 +915,10 @@ */ int globsubst = isset(GLOBSUBST); /* + * Indicates ${(#)...}. + */ + int evalchar = 0; + /* * Indicates ${#pm}, massaged by whichlen which is set by * the (c), (w), and (W) flags to indicate how we take the length. */ @@ -1320,6 +1324,11 @@ unique = 1; break; + case '#': + case Pound: + evalchar = 1; + break; + default: flagerr: zerr("error in flags", NULL, 0); @@ -2233,6 +2242,40 @@ } if (errflag) return NULL; + if (evalchar) { + /* + * Evaluate the value numerically and output the result as + * a character. + * + * Note this doesn't yet handle Unicode or multibyte characters: + * that will need handling more generally probably by + * an additional flag of some sort. + */ + zlong ires; + + if (isarr) { + char **aval2, **avptr, **av2ptr; + + aval2 = (char **)zhalloc((arrlen(aval)+1)*sizeof(char *)); + + for (avptr = aval, av2ptr = aval2; *avptr; avptr++, av2ptr++) + { + ires = mathevali(*avptr); + if (errflag) + return NULL; + *av2ptr = zhalloc(2); + sprintf(*av2ptr, "%c", (int)ires); + } + *av2ptr = NULL; + aval = aval2; + } else { + ires = mathevali(val); + if (errflag) + return NULL; + val = zhalloc(2); + sprintf(val, "%c", (int)ires); + } + } /* * This handles taking a length with ${#foo} and variations. * TODO: again. one might naively have thought this had the -- Peter Stephenson Software Engineer CSR PLC, Churchill House, Cambridge Business Park, Cowley Road Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070 This message has been scanned for viruses by BlackSpider MailControl - www.blackspider.com