lineedit: fix column display for wide and combining chars in TAB completion
No binary (build failed)
—
(log yok)
| @@ -23,7 +23,8 @@ enum { | |
| #if !ENABLE_UNICODE_SUPPORT | |
| - | # define unicode_strlen(string) strlen(string) |
| + | # define unicode_strlen(string) strlen(string) |
| + | # define unicode_strwidth(string) strlen(string) |
| # define unicode_status UNICODE_OFF | |
| # define init_unicode() ((void)0) | |
| @@ -49,7 +50,10 @@ enum { | |
| # define ENABLE_UNICODE_BIDI_SUPPORT 0 | |
| # endif | |
| + | /* Number of unicode chars. Falls back to strlen() on invalid unicode */ |
| size_t FAST_FUNC unicode_strlen(const char *string); | |
| + | /* Width on terminal */ |
| + | size_t FAST_FUNC unicode_strwidth(const char *string); |
| enum { | |
| UNI_FLAG_PAD = (1 << 0), | |
| }; | |
| @@ -992,7 +992,7 @@ static void showfiles(void) | |
| /* find the longest file name - use that as the column width */ | |
| for (row = 0; row < nrows; row++) { | |
| - | l = unicode_strlen(matches[row]); |
| + | l = unicode_strwidth(matches[row]); |
| if (column_width < l) | |
| column_width = l; | |
| } | |
| @@ -1012,10 +1012,13 @@ static void showfiles(void) | |
| for (nc = 1; nc < ncols && n+nrows < nfiles; n += nrows, nc++) { | |
| printf("%s%-*s", matches[n], | |
| - | (int)(column_width - unicode_strlen(matches[n])), "" |
| + | (int)(column_width - unicode_strwidth(matches[n])), "" |
| ); | |
| } | |
| - | puts(matches[n]); |
| + | if (ENABLE_UNICODE_SUPPORT) |
| + | puts(printable_string(NULL, matches[n])); |
| + | else |
| + | puts(matches[n]); |
| } | |
| } | |
| @@ -25,13 +25,15 @@ uint8_t unicode_status; | |
| void FAST_FUNC init_unicode(void) | |
| { | |
| - | /* In unicode, this is a one character string */ |
| static const char unicode_0x394[] = { 0xce, 0x94, 0 }; | |
| + | size_t width; |
| if (unicode_status != UNICODE_UNKNOWN) | |
| return; | |
| - | |
| - | unicode_status = unicode_strlen(unicode_0x394) == 1 ? UNICODE_ON : UNICODE_OFF; |
| + | /* In unicode, this is a one character string */ |
| + | // can use unicode_strlen(string) too, but otherwise unicode_strlen() is unused |
| + | width = mbstowcs(NULL, unicode_0x394, INT_MAX); |
| + | unicode_status = (width == 1 ? UNICODE_ON : UNICODE_OFF); |
| } | |
| #else | |
| @@ -954,6 +956,7 @@ int FAST_FUNC unicode_bidi_is_neutral_wchar(wint_t wc) | |
| /* The rest is mostly same for libc and for "homegrown" support */ | |
| + | #if 0 // UNUSED |
| size_t FAST_FUNC unicode_strlen(const char *string) | |
| { | |
| size_t width = mbstowcs(NULL, string, INT_MAX); | |
| @@ -961,6 +964,14 @@ size_t FAST_FUNC unicode_strlen(const char *string) | |
| return strlen(string); | |
| return width; | |
| } | |
| + | #endif |
| + | |
| + | size_t FAST_FUNC unicode_strwidth(const char *string) |
| + | { |
| + | uni_stat_t uni_stat; |
| + | printable_string(&uni_stat, string); |
| + | return uni_stat.unicode_width; |
| + | } |
| static char* FAST_FUNC unicode_conv_to_printable2(uni_stat_t *stats, const char *src, unsigned width, int flags) | |
| { | |