From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1500 invoked from network); 21 Oct 2005 22:36:40 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 21 Oct 2005 22:36:40 -0000 Received: (qmail 97038 invoked from network); 21 Oct 2005 22:36:34 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 21 Oct 2005 22:36:34 -0000 Received: (qmail 18230 invoked by alias); 21 Oct 2005 22:36:31 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 21906 Received: (qmail 18220 invoked from network); 21 Oct 2005 22:36:30 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by sunsite.dk with SMTP; 21 Oct 2005 22:36:30 -0000 Received: (qmail 96747 invoked from network); 21 Oct 2005 22:36:30 -0000 Received: from mta09-winn.ispmail.ntl.com (81.103.221.49) by a.mx.sunsite.dk with SMTP; 21 Oct 2005 22:30:17 -0000 Received: from aamta09-winn.ispmail.ntl.com ([81.103.221.35]) by mta09-winn.ispmail.ntl.com with ESMTP id <20051021223005.IHYF8609.mta09-winn.ispmail.ntl.com@aamta09-winn.ispmail.ntl.com> for ; Fri, 21 Oct 2005 23:30:05 +0100 Received: from pwslaptop.csr.com ([81.105.238.64]) by aamta09-winn.ispmail.ntl.com with ESMTP id <20051021223002.LACL6564.aamta09-winn.ispmail.ntl.com@pwslaptop.csr.com> for ; Fri, 21 Oct 2005 23:30:02 +0100 Received: from pwslaptop.csr.com (pwslaptop.csr.com [127.0.0.1]) by pwslaptop.csr.com (8.13.4/8.13.4) with ESMTP id j9LMTpAo022673 for ; Fri, 21 Oct 2005 23:29:51 +0100 Received: from pwslaptop.csr.com (pws@localhost) by pwslaptop.csr.com (8.13.4/8.13.4/Submit) with ESMTP id j9LMTnku022669 for ; Fri, 21 Oct 2005 23:29:51 +0100 Message-Id: <200510212229.j9LMTnku022669@pwslaptop.csr.com> X-Authentication-Warning: pwslaptop.csr.com: pws owned process doing -bs From: Peter Stephenson To: zsh-workers@sunsite.dk Subject: Re: PATCH: displaying wide characters In-Reply-To: Your message of "Fri, 21 Oct 2005 14:39:42 -0000." <1051021143942.ZM7464@candle.brasslantern.com> Date: Fri, 21 Oct 2005 23:29:49 +0100 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.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.0.4 Bart Schaefer wrote: > } If the string is longer than the specified truncation > } length, it will appear in full, completely replacing > } the truncated string. > } > } which is unambiguous, so I presume there is a bug in the old code. > > Either that or an intentional change that failed to make it into the > documentation. The prompt truncation code was completely rewritten a > while back (prior to 4.0, so *quite* a while back). I'll assume the manual page is still correct. I don't remember any ^ suggestion of a change. | Look! ASCII apostrophes! This change makes the whole thing much more maintainable... I've also removed a few TODOs which no longer apply. Index: Src/prompt.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/prompt.c,v retrieving revision 1.28 diff -u -r1.28 prompt.c --- Src/prompt.c 19 Oct 2005 21:59:36 -0000 1.28 +++ Src/prompt.c 21 Oct 2005 22:23:18 -0000 @@ -1038,18 +1038,18 @@ * Note that if the truncation string is longer than the * truncation length (twidth > truncwidth), the truncation * string is used in full. - * - * TODO: we don't take account of multibyte characters - * in the string we're truncating. */ char *t = truncstr; int fullen = bp - ptr; int twidth, maxwidth; -#ifdef ZLE_UNICODE_SUPPORT int ntrunc = strlen(t); +#ifdef ZLE_UNICODE_SUPPORT /* Use screen width of string */ twidth = mb_width(t); +#else + twidth = ztrlen(t); +#endif if (twidth < truncwidth) { maxwidth = truncwidth - twidth; /* @@ -1110,6 +1110,7 @@ fulltextptr++; } } else { +#ifdef ZLE_UNICODE_SUPPORT /* * Normal text: build up a multibyte character. */ @@ -1143,6 +1144,13 @@ remw -= wcwidth(cc); } } +#else + /* Single byte character */ + if (*fulltextptr == Meta) + fulltextptr++; + fulltextptr++; + remw--; +#endif } } @@ -1170,6 +1178,7 @@ for (; *skiptext != Outpar && *skiptext; skiptext++); } else { +#ifdef ZLE_UNICODE_SUPPORT char inchar; wchar_t cc; int ret; @@ -1194,6 +1203,12 @@ maxwidth -= wcwidth(cc); } } +#else + if (*skiptext == Meta) + skiptext++; + skiptext++; + maxwidth--; +#endif } } /* @@ -1240,96 +1255,6 @@ bp = ptr; } *bp = '\0'; -#else - twidth = ztrlen(t); - maxwidth = twidth < truncwidth ? truncwidth - twidth : 0; - if (w < fullen) { - /* Invisible substrings, lots of shuffling. */ - int n = strlen(t); - char *p = ptr, *q = buf; - addbufspc(n); - ptr = buf + (p - q); /* addbufspc() may have realloc()'d */ - - if (truncatleft) { - p = ptr + n; - q = p; - - /* - * I don't think we need n and the test below since - * we must have enough space (we are using a subset - * of the existing text with no repetition) and the - * string is null-terminated, so I haven't copied it - * to the ZLE_UNICODE_SUPPORT section. - */ - n = fullen - w; - - /* Shift the whole string right, then * - * selectively copy to the left. */ - memmove(p, ptr, fullen); - while (w > 0 || n > 0) { - if (*p == Inpar) - do { - *q++ = *p; - --n; - } while (*p++ != Outpar && *p && n); - else if (w) { - if (--w < maxwidth) - *q++ = *p; - ++p; - } - } - bp = q; - } else { - /* Truncate on the right, selectively */ - q = ptr + fullen; - - /* First skip over as much as will "fit". */ - while (w > 0 && maxwidth > 0) { - if (*ptr == Inpar) - while (*ptr++ != Outpar && *ptr) {;} - else - ++ptr, --w, --maxwidth; - } - if (ptr < q) { - /* We didn't reach the end of the string. * - * In case there are more invisible bits, * - * insert the truncstr and keep looking. */ - memmove(ptr + n, ptr, q - ptr); - q = ptr + n; - while (*t) - *ptr++ = *t++; - while (*q) { - if (*q == Inpar) - do { - *ptr++ = *q; - } while (*q++ != Outpar && *q); - else - ++q; - } - bp = ptr; - *bp = 0; - } else - bp = ptr + n; - } - } else { - /* No invisible substrings. */ - if (twidth > fullen) { - addbufspc(twidth - fullen); - ptr = bp; /* addbufspc() may have realloc()'d buf */ - bp += twidth - fullen; - } else - bp -= fullen - truncwidth; - if (truncatleft) { - if (maxwidth) - memmove(ptr + strlen(t), ptr + fullen - maxwidth, - maxwidth); - } else - ptr += maxwidth; - } - /* Finally, copy the truncstr into place. */ - while (*t) - *ptr++ = *t++; -#endif } zsfree(truncstr); truncwidth = 0; Index: Src/Zle/zle_refresh.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Zle/zle_refresh.c,v retrieving revision 1.31 diff -u -r1.31 zle_refresh.c --- Src/Zle/zle_refresh.c 19 Oct 2005 23:45:06 -0000 1.31 +++ Src/Zle/zle_refresh.c 21 Oct 2005 22:23:19 -0000 @@ -413,11 +413,7 @@ rpms->sen = rpms->s + winw; } -/* - * TODO currently it assumes sceenwidth 1 for every character - * (except for characters in the prompt which are correctly handled - * by wcwidth()). - */ + /**/ mod_export void zrefresh(void) -- Peter Stephenson Web page still at http://www.pwstephenson.fsnet.co.uk/