From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24714 invoked by alias); 14 Dec 2010 10:20:39 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 28529 Received: (qmail 22161 invoked from network); 14 Dec 2010 10:20:26 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_LOW, SPF_HELO_PASS autolearn=ham version=3.3.1 Received-SPF: none (ns1.primenet.com.au: domain at csr.com does not designate permitted sender hosts) Date: Tue, 14 Dec 2010 10:20:16 +0000 From: Peter Stephenson To: Subject: Re: Another ${(z)param} buglet Message-ID: <20101214102016.726d2ae6@pwslap01u.europe.root.pri> In-Reply-To: <20101213181203.5a5ba7d5@pwslap01u.europe.root.pri> References: <101207203441.ZM4340@torch.brasslantern.com> <20101208175103.40d6cc29@pwslap01u.europe.root.pri> <101209074233.ZM8003@torch.brasslantern.com> <20101209181632.27d47e95@pwslap01u.europe.root.pri> <20101209201913.43a94f54@pws-pc.ntlworld.com> <20101212224523.423399db@pws-pc.ntlworld.com> <101212172652.ZM9617@torch.brasslantern.com> <20101213094746.35712a38@pwslap01u.europe.root.pri> <101213093514.ZM10971@torch.brasslantern.com> <20101213181203.5a5ba7d5@pwslap01u.europe.root.pri> Organization: Cambridge Silicon Radio X-Mailer: Claws Mail 3.7.6 (GTK+ 2.20.1; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 14 Dec 2010 10:20:16.0630 (UTC) FILETIME=[809C5160:01CB9B78] X-Scanned-By: MailControl A_10_80_00 (www.mailcontrol.com) on 10.71.0.121 On Mon, 13 Dec 2010 18:12:03 +0000 Peter Stephenson wrote: > lexsave/lexrestore should probably save and restore lexflags: not done > that yet. Then we don't need to do it in bufferwords() (which does > it cleanly already, but goodness knows what ZLE does). This does that, which enables a small amount of tidying up in ZLE, and also adds a special flag for ZLE mode which removes the chance of side effects when using bufferwords() from elsewhere. Index: Src/hist.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/hist.c,v retrieving revision 1.108 diff -p -u -r1.108 hist.c --- Src/hist.c 14 Dec 2010 09:59:04 -0000 1.108 +++ Src/hist.c 14 Dec 2010 10:17:10 -0000 @@ -2897,11 +2897,9 @@ histfileIsLocked(void) * If index is non-NULL, and input is from a string in ZLE, *index * is set to the position of the end of the current editor word. * - * comments is used if buf is non-NULL (i.e. this is not a string - * from ZLE). - * If it is 0, comments are not parsed; they are treated as ordinary words. - * If it is 1, comments are treated as single strings, one per line. - * If it is 2, comments are removed. + * flags is passed directly to lexflags, see lex.c, except that + * we 'or' in the bit LEXFLAGS_ACTIVE to make sure the variable + * is set. */ /**/ @@ -2909,7 +2907,7 @@ mod_export LinkList bufferwords(LinkList list, char *buf, int *index, int flags) { int num = 0, cur = -1, got = 0, ne = noerrs; - int owb = wb, owe = we, oadx = addedx, ozp = lexflags, onc = nocomments; + int owb = wb, owe = we, oadx = addedx, onc = nocomments; int ona = noaliases, ocs = zlemetacs, oll = zlemetall; int forloop = 0, rcquotes = opts[RCQUOTES]; char *p, *addedspaceptr; @@ -3120,7 +3118,6 @@ bufferwords(LinkList list, char *buf, in strinend(); inpop(); errflag = 0; - lexflags = ozp; nocomments = onc; noerrs = ne; lexrestore(); Index: Src/lex.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/lex.c,v retrieving revision 1.60 diff -p -u -r1.60 lex.c --- Src/lex.c 14 Dec 2010 09:59:04 -0000 1.60 +++ Src/lex.c 14 Dec 2010 10:17:10 -0000 @@ -126,7 +126,7 @@ mod_export int noaliases; * Note that although it is passed into the lexer as an input, the * lexer can set it to zero after finding the word it's searching for. * This only happens if the line being parsed actually does come from - * ZLE. + * ZLE, and hence the bit LEXFLAGS_ZLE is set. */ /**/ @@ -202,6 +202,7 @@ struct lexstack { int isfirstch; int histactive; int histdone; + int lexflags; int stophist; int hlinesz; char *hline; @@ -258,6 +259,7 @@ lexsave(void) ls->isfirstch = isfirstch; ls->histactive = histactive; ls->histdone = histdone; + ls->lexflags = lexflags; ls->stophist = stophist; stophist = 0; if (!lstack) { @@ -332,6 +334,7 @@ lexrestore(void) isfirstch = lstack->isfirstch; histactive = lstack->histactive; histdone = lstack->histdone; + lexflags = lstack->lexflags; stophist = lstack->stophist; chline = lstack->hline; hptr = lstack->hptr; @@ -1804,7 +1807,7 @@ exalias(void) } else zshlextext = tokstr; - if (lexflags && !(inbufflags & INP_ALIAS)) { + if ((lexflags & LEXFLAGS_ZLE) && !(inbufflags & INP_ALIAS)) { int zp = lexflags; gotword(); Index: Src/zsh.h =================================================================== RCS file: /cvsroot/zsh/zsh/Src/zsh.h,v retrieving revision 1.171 diff -p -u -r1.171 zsh.h --- Src/zsh.h 14 Dec 2010 09:59:04 -0000 1.171 +++ Src/zsh.h 14 Dec 2010 10:17:10 -0000 @@ -1835,13 +1835,19 @@ struct histent { */ #define LEXFLAGS_ACTIVE 0x0001 /* + * Being used from zle. This is slightly more intrusive + * (=> grotesquely non-modular) than use from within + * the main shell, so it's a separate flag. + */ +#define LEXFLAGS_ZLE 0x0002 +/* * Parse comments and treat each comment as a single string */ -#define LEXFLAGS_COMMENTS_KEEP 0x0002 +#define LEXFLAGS_COMMENTS_KEEP 0x0004 /* * Parse comments and strip them. */ -#define LEXFLAGS_COMMENTS_STRIP 0x0004 +#define LEXFLAGS_COMMENTS_STRIP 0x0008 /* * Either of the above */ @@ -1849,7 +1855,7 @@ struct histent { /* * Treat newlines as whitespace */ -#define LEXFLAGS_NEWLINE 0x0008 +#define LEXFLAGS_NEWLINE 0x0010 /******************************************/ /* Definitions for programable completion */ Index: Src/Zle/compcore.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Zle/compcore.c,v retrieving revision 1.103 diff -p -u -r1.103 compcore.c --- Src/Zle/compcore.c 14 Dec 2010 09:59:04 -0000 1.103 +++ Src/Zle/compcore.c 14 Dec 2010 10:17:10 -0000 @@ -1481,13 +1481,13 @@ set_comp_sep(void) /* Put the string in the lexer buffer and call the lexer to * * get the words we have to expand. */ - lexflags = LEXFLAGS_ACTIVE; ocs = zlemetacs; oll = zlemetall; ol = zlemetaline; addedx = 1; noerrs = 1; lexsave(); + lexflags = LEXFLAGS_ZLE; /* * tl is the length of the temporary string including * the space at the start and the x at the cursor position, @@ -1634,7 +1634,7 @@ set_comp_sep(void) noaliases = ona; strinend(); inpop(); - errflag = lexflags = 0; + errflag = 0; noerrs = ne; lexrestore(); wb = owb; Index: Src/Zle/compctl.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Zle/compctl.c,v retrieving revision 1.39 diff -p -u -r1.39 compctl.c --- Src/Zle/compctl.c 14 Dec 2010 09:59:04 -0000 1.39 +++ Src/Zle/compctl.c 14 Dec 2010 10:17:11 -0000 @@ -2789,10 +2789,10 @@ sep_comp_string(char *ss, char *s, int n /* Put the string in the lexer buffer and call the lexer to * * get the words we have to expand. */ - lexflags = LEXFLAGS_ACTIVE; addedx = 1; noerrs = 1; lexsave(); + lexflags = LEXFLAGS_ZLE; tmp = (char *) zhalloc(tl = sl + 3 + strlen(s)); strcpy(tmp, ss); tmp[sl] = ' '; @@ -2843,7 +2843,7 @@ sep_comp_string(char *ss, char *s, int n noaliases = ona; strinend(); inpop(); - errflag = lexflags = 0; + errflag = 0; noerrs = ne; lexrestore(); wb = owb; @@ -3703,8 +3703,8 @@ makecomplistflags(Compctl cc, char *s, i /* Put the string in the lexer buffer and call the lexer to * * get the words we have to expand. */ - lexflags = LEXFLAGS_ACTIVE; lexsave(); + lexflags = LEXFLAGS_ZLE; tmpbuf = (char *)zhalloc(strlen(cc->str) + 5); sprintf(tmpbuf, "foo %s", cc->str); /* KLUDGE! */ inpush(tmpbuf, 0, NULL); @@ -3721,7 +3721,7 @@ makecomplistflags(Compctl cc, char *s, i noaliases = ona; strinend(); inpop(); - errflag = lexflags = 0; + errflag = 0; lexrestore(); /* Fine, now do full expansion. */ prefork(foo, 0); Index: Src/Zle/zle_tricky.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Zle/zle_tricky.c,v retrieving revision 1.103 diff -p -u -r1.103 zle_tricky.c --- Src/Zle/zle_tricky.c 14 Dec 2010 09:59:04 -0000 1.103 +++ Src/Zle/zle_tricky.c 14 Dec 2010 10:17:11 -0000 @@ -1140,9 +1140,9 @@ get_comp_string(void) zsfree(varname); varname = NULL; insubscr = 0; - lexflags = LEXFLAGS_ACTIVE; clwpos = -1; lexsave(); + lexflags = LEXFLAGS_ZLE; inpush(dupstrspace(linptr), 0, NULL); strinbeg(0); wordpos = tt0 = cp = rd = ins = oins = linarr = parct = ia = redirpos = 0; @@ -2707,7 +2707,6 @@ doexpandhist(void) noaliases = ona; strinend(); inpop(); - lexflags = 0; lexrestore(); expanding = 0; @@ -2807,8 +2806,8 @@ getcurcmd(void) int curlincmd; char *s = NULL; - lexflags = LEXFLAGS_ACTIVE; lexsave(); + lexflags = LEXFLAGS_ZLE; metafy_line(); inpush(dupstrspace(zlemetaline), 0, NULL); strinbeg(1); @@ -2829,7 +2828,7 @@ getcurcmd(void) popheap(); strinend(); inpop(); - errflag = lexflags = 0; + errflag = 0; unmetafy_line(); lexrestore(); -- Peter Stephenson Software Engineer Tel: +44 (0)1223 692070 Cambridge Silicon Radio Limited Churchill House, Cambridge Business Park, Cowley Road, Cambridge, CB4 0WZ, UK Member of the CSR plc group of companies. CSR plc registered in England and Wales, registered number 4187346, registered office Churchill House, Cambridge Business Park, Cowley Road, Cambridge, CB4 0WZ, United Kingdom