From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10782 invoked from network); 26 Jan 2005 02:31:07 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 26 Jan 2005 02:31:07 -0000 Received: (qmail 83736 invoked from network); 26 Jan 2005 02:31:00 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 26 Jan 2005 02:31:00 -0000 Received: (qmail 26419 invoked by alias); 26 Jan 2005 02:30:52 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 20747 Received: (qmail 26406 invoked from network); 26 Jan 2005 02:30:52 -0000 Received: from unknown (HELO a.mx.sunsite.dk) (130.225.247.88) by sunsite.dk with SMTP; 26 Jan 2005 02:30:52 -0000 Received: (qmail 83335 invoked from network); 26 Jan 2005 02:29:53 -0000 Received: from acolyte.scowler.net (216.254.112.45) by a.mx.sunsite.dk with SMTP; 26 Jan 2005 02:29:49 -0000 Received: by acolyte.scowler.net (Postfix, from userid 1000) id 5A6007004D; Tue, 25 Jan 2005 21:29:47 -0500 (EST) Date: Tue, 25 Jan 2005 21:29:47 -0500 From: Clint Adams To: Peter Stephenson Cc: Zsh hackers list Subject: Re: PATCH: Unicode additions, next phase. Message-ID: <20050126022947.GA12574@scowler.net> Mail-Followup-To: Peter Stephenson , Zsh hackers list References: <200501251446.j0PEkoFJ024136@news01.csr.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200501251446.j0PEkoFJ024136@news01.csr.com> User-Agent: Mutt/1.5.6+20040907i X-Spam-Checker-Version: SpamAssassin 3.0.2 on a.mx.sunsite.dk X-Spam-Level: X-Spam-Status: No, score=-2.6 required=6.0 tests=AWL,BAYES_00 autolearn=ham version=3.0.2 X-Spam-Hits: -2.6 > The key missing bits are screen output from zle_refresh.c and key Here's a stab at that, though any line containing the string "error" is broken. M Src/Zle/zle_refresh.c M Src/system.h * modified files --- orig/Src/Zle/zle_refresh.c +++ mod/Src/Zle/zle_refresh.c @@ -86,7 +86,7 @@ * add non-editable text to that being displayed. */ /**/ -unsigned char *predisplay, *postdisplay; +ZLE_STRING_T predisplay, postdisplay; /**/ int predisplaylen, postdisplaylen; @@ -284,13 +284,17 @@ t0 = -1, /* tmp */ tosln = 0; /* tmp in statusline stuff */ unsigned char *s, /* pointer into the video buffer */ - *t, /* pointer into the real buffer */ *sen, /* pointer to end of the video buffer (eol) */ + *u; /* pointer for status line stuff */ + ZLE_STRING_T t, /* pointer into the real buffer */ *scs; /* pointer to cursor position in real buffer */ char **qbuf; /* tmp */ - unsigned char *tmpline; /* line with added pre/post text */ + ZLE_STRING_T tmpline; /* line with added pre/post text */ int tmpcs, tmpll; /* ditto cursor position and line length */ int tmpalloced; /* flag to free tmpline when finished */ +#ifdef ZLE_UNICODE_SUPPORT + mbstate_t shiftstate; /* wcrtomb shift state */ +#endif if (trashedzle) reexpandprompt(); @@ -304,13 +308,13 @@ if (predisplaylen || postdisplaylen) { /* There is extra text to display at the start or end of the line */ - tmpline = zalloc(zlell + predisplaylen + postdisplaylen); + tmpline = zalloc((zlell + predisplaylen + postdisplaylen)*ZLE_CHAR_SIZE); if (predisplaylen) - memcpy(tmpline, predisplay, predisplaylen); + ZS_memcpy(tmpline, predisplay, predisplaylen); if (zlell) - memcpy(tmpline+predisplaylen, zleline, zlell); + ZS_memcpy(tmpline+predisplaylen, zleline, zlell); if (postdisplaylen) - memcpy(tmpline+predisplaylen+zlell, postdisplay, postdisplaylen); + ZS_memcpy(tmpline+predisplaylen+zlell, postdisplay, postdisplaylen); tmpcs = zlecs + predisplaylen; tmpll = predisplaylen + zlell + postdisplaylen; tmpalloced = 1; @@ -455,10 +459,10 @@ if (t == scs) /* if cursor is here, remember it */ nvcs = s - (unsigned char *)(nbuf[nvln = ln]); - if (*t == '\n') { /* newline */ + if (*t == ZLENL){ /* newline */ nbuf[ln][winw + 1] = '\0'; /* text not wrapped */ nextline - } else if (*t == '\t') { /* tab */ + } else if (*t == ZLETAB) { /* tab */ t0 = (char *)s - nbuf[ln]; if ((t0 | 7) + 1 >= winw) { nbuf[ln][winw + 1] = '\n'; /* text wrapped */ @@ -467,15 +471,31 @@ do *s++ = ' '; while ((++t0) & 7); - } else if (icntrl(*t)) { /* other control character */ + } else if (ZC_icntrl(*t)) { /* other control character */ *s++ = '^'; if (s == sen) { nbuf[ln][winw + 1] = '\n'; /* text wrapped */ nextline } +#ifdef ZLE_UNICODE_SUPPORT +# error What to do here +#else *s++ = (*t == 127) ? '?' : (*t | '@'); - } else /* normal character */ +#endif + } else { /* normal character */ +#ifdef ZLE_UNICODE_SUPPORT + size_t i; + + i = wcrtomb(s, *t, &shiftstate); + if (i == -1) { + /* error; what to do? */ + } else { + s += i; + } +#else *s++ = *t; +#endif + } if (s == sen) { nbuf[ln][winw + 1] = '\n'; /* text wrapped */ nextline @@ -501,17 +521,17 @@ tosln = ln + 1; nbuf[ln][winw + 1] = '\0'; /* text not wrapped */ snextline - t = (unsigned char *)statusline; - for (; t < (unsigned char *)statusline + statusll; t++) { - if (icntrl(*t)) { /* simplified processing in the status line */ + u = (unsigned char *)statusline; + for (; u < (unsigned char *)statusline + statusll; u++) { + if (icntrl(*u)) { /* simplified processing in the status line */ *s++ = '^'; if (s == sen) { nbuf[ln][winw + 1] = '\n'; /* text wrapped */ snextline } - *s++ = (*t == 127) ? '?' : (*t | '@'); + *s++ = (*u == 127) ? '?' : (*u | '@'); } else - *s++ = *t; + *s++ = *u; if (s == sen) { nbuf[ln][winw + 1] = '\n'; /* text wrapped */ snextline --- orig/Src/system.h +++ mod/Src/system.h @@ -724,6 +724,9 @@ #define ZLENL L'\n' #define ZLENUL L'\0' +#define ZLETAB L'\t' +#define ZS_memcpy wmemcpy +#define ZC_icntrl iswcntrl #else typedef int ZLE_CHAR_T; typedef unsigned char *ZLE_STRING_T; @@ -731,4 +734,7 @@ #define ZLENL '\n' #define ZLENUL '\0' +#define ZLETAB '\t' +#define ZS_memcpy memcpy +#define ZC_icntrl icntrl #endif