From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26579 invoked from network); 15 Aug 2005 17:16:17 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 15 Aug 2005 17:16:17 -0000 Received: (qmail 84687 invoked from network); 15 Aug 2005 17:16:11 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 15 Aug 2005 17:16:11 -0000 Received: (qmail 13014 invoked by alias); 15 Aug 2005 17:16:08 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 21619 Received: (qmail 13005 invoked from network); 15 Aug 2005 17:16:08 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by sunsite.dk with SMTP; 15 Aug 2005 17:16:08 -0000 Received: (qmail 84401 invoked from network); 15 Aug 2005 17:16:07 -0000 Received: from acolyte.scowler.net (216.254.112.45) by a.mx.sunsite.dk with SMTP; 15 Aug 2005 17:16:03 -0000 Received: by acolyte.scowler.net (Postfix, from userid 1000) id 77F2A70055; Mon, 15 Aug 2005 13:15:21 -0400 (EDT) Date: Mon, 15 Aug 2005 13:15:21 -0400 From: Clint Adams To: Peter Stephenson Cc: zsh-workers@sunsite.dk Subject: Re: some unicode issues [was Re: PATCH: fix 4, was Re: unpatch: metafying zle line] Message-ID: <20050815171521.GA30174@scowler.net> Mail-Followup-To: Peter Stephenson , zsh-workers@sunsite.dk References: <200508121021.j7CAL18n012569@news01.csr.com> <20050815105717.723be294.pws@csr.com> <20050815150648.GA24152@scowler.net> <200508151513.j7FFDmYU030329@news01.csr.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200508151513.j7FFDmYU030329@news01.csr.com> User-Agent: Mutt/1.5.9i 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=BAYES_00 autolearn=ham version=3.0.4 > Display width has not yet been looked at all. It would be good if > someone did. I made a huge mess, but this part of it may be useful. --- orig/Src/Zle/zle.h +++ mod/Src/Zle/zle.h @@ -58,6 +58,11 @@ #define ZS_strcpy wcscpy #define ZS_strncpy wcsncpy #define ZS_strncmp wcsncmp +#define ZS_zarrdup wcs_zarrdup +#define ZS_width wcslen +#define ZS_strchr wcschr +#define ZS_zputs wcs_zputs +#define ZS_nicewidth wcs_niceztrlen #define ZC_iblank iswspace #define ZC_icntrl iswcntrl @@ -89,6 +94,11 @@ #define ZS_memmove memmove #define ZS_memset memset #define ZS_memcmp memcmp +#define ZS_zarrdup zarrdup +#define ZS_width ztrlen +#define ZS_strchr strchr +#define ZS_zputs zputs +#define ZS_nicewidth niceztrlen #ifdef __GNUC__ static inline size_t ZS_strlen(ZLE_STRING_T s) --- orig/Src/string.c +++ mod/Src/string.c @@ -54,6 +54,22 @@ return t; } +#ifdef ZLE_UNICODE_SUPPORT +/**/ +mod_export wchar_t * +wcs_ztrdup(const wchar_t *s) +{ + wchar_t *t; + + if (!s) + return NULL; + t = (wchar_t *)zalloc(wcslen((wchar_t *)s) + 1); + wcscpy(t, s); + return t; +} +#endif /* ZLE_UNICODE_SUPPORT */ + + /* concatenate s1, s2, and s3 in dynamically allocated buffer */ /**/ --- orig/Src/utils.c +++ mod/Src/utils.c @@ -243,6 +243,46 @@ return buf; } +#ifdef ZLE_UNICODE_SUPPORT +/**/ +mod_export wchar_t * +wcs_nicechar(wint_t c) +{ + static wchar_t buf[6]; + wchar_t *s = buf; + if (iswprint(c)) + goto done; + if (c > 0x80) { + if (isset(PRINTEIGHTBIT)) + goto done; + *s++ = '\\'; + *s++ = 'M'; + *s++ = '-'; + c &= 0x7f; + if(iswprint(c)) + goto done; + } + if (c == 0x7f) { + *s++ = '^'; + c = '?'; + } else if (c == '\n') { + *s++ = '\\'; + c = 'n'; + } else if (c == '\t') { + *s++ = '\\'; + c = 't'; + } else if (c < 0x20) { + *s++ = '^'; + c += 0x40; + } + done: + *s++ = c; + *s = 0; + return buf; +} +#endif /* ZLE_UNICODE_SUPPORT */ + + /* Output a string's visible representation. */ #if 0 /**/ @@ -2453,6 +2493,21 @@ return y; } +#ifdef ZLE_UNICODE_SUPPORT +/**/ +mod_export wchar_t ** +wcs_zarrdup(wchar_t **s) +{ + wchar_t **x, **y; + + y = x = (wchar_t **) zalloc(sizeof(wchar_t *) * (arrlen((char **)s) + 1)); + + while ((*x++ = wcs_ztrdup(*s++))); + + return y; +} +#endif /* ZLE_UNICODE_SUPPORT */ + /**/ static char * spname(char *oldname) @@ -3051,6 +3106,29 @@ return 0; } +#ifdef ZLE_UNICODE_SUPPORT +/**/ +mod_export int +wcs_zputs(wchar_t const *s, FILE *stream) +{ + wint_t c; + + while (*s) { + if (*s == Meta) + c = *++s ^ 32; + else if(itok(*s)) { + s++; + continue; + } else + c = *s; + s++; + if (fputwc(c, stream) == WEOF) + return EOF; + } + return 0; +} +#endif /* ZLE_UNICODE_SUPPORT */ + /* Create a visibly-represented duplicate of a string. */ /**/ @@ -3137,6 +3215,29 @@ return l; } +#ifdef ZLE_UNICODE_SUPPORT +/**/ +mod_export size_t +wcs_nicewidth(wchar_t const *s) +{ + size_t l = 0; + wint_t c; + + while ((c = *s++)) { + if (itok(c)) { + if (c <= (wint_t)Comma) + c = ztokens[c - Pound]; + else + continue; + } + if (c == Meta) + c = *s++ ^ 32; + l += wcswidth(wcs_nicechar(c), 6); + } + return l; +} +#endif /* ZLE_UNICODE_SUPPORT */ + /* check for special characters in the string */ /**/