1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-11-01 18:30:55 +01:00

21619: define wide versions of zarrdup, zputs, niceztrlen.

This commit is contained in:
Clint Adams 2005-08-15 17:19:16 +00:00
parent b9d42d6a59
commit 987033eaf9
4 changed files with 130 additions and 0 deletions

View file

@ -1,5 +1,8 @@
2005-08-15 Clint Adams <clint@zsh.org>
* 21619: Src/string.c, Src/utils.c, Src/Zle/zle.h: define wide
versions of zarrdup, zputs, niceztrlen.
* 21565: Completion/Unix/Command/_man: better handle uncompresed
manpages with .[0-9] in their names.

View file

@ -58,6 +58,11 @@ typedef wint_t ZLE_INT_T;
#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 @@ typedef int ZLE_INT_T;
#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)

View file

@ -54,6 +54,22 @@ ztrdup(const char *s)
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 */
/**/

View file

@ -243,6 +243,46 @@ nicechar(int c)
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 @@ zarrdup(char **s)
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 @@ zputs(char const *s, FILE *stream)
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 @@ niceztrlen(char const *s)
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 */
/**/