diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Zle/zle.h | 10 | ||||
-rw-r--r-- | Src/string.c | 16 | ||||
-rw-r--r-- | Src/utils.c | 101 |
3 files changed, 127 insertions, 0 deletions
diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h index bbe3aeef3..2276f42b3 100644 --- a/Src/Zle/zle.h +++ b/Src/Zle/zle.h @@ -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) diff --git a/Src/string.c b/Src/string.c index 397c868ce..0a7f200ab 100644 --- a/Src/string.c +++ b/Src/string.c @@ -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 */ /**/ diff --git a/Src/utils.c b/Src/utils.c index e7a85f5da..96f18497f 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -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 */ /**/ |