]> granicus.if.org Git - procps-ng/commitdiff
top: some minor tweaks to the utf-8 multi-byte support
authorJim Warner <james.warner@comcast.net>
Sat, 30 Sep 2017 06:11:11 +0000 (01:11 -0500)
committerCraig Small <csmall@enc.com.au>
Sun, 1 Oct 2017 11:30:16 +0000 (22:30 +1100)
Translatable column headers are supposed to be limited
to no more than 7 characters, even though some columns
are wider than that or even variable width. That value
of 7 is dictated by the Fields Management screen which
will otherwise truncate a column header longer than 7.

Our new utf-8 support did not adequately deal with the
potential need for truncation of column headers should
that limit of 7 be exceeded. This patch corrects that.

[ a few comments were also tweaked just a little bit ]

Signed-off-by: Jim Warner <james.warner@comcast.net>
top/top.c

index 3b799f114d4484568a74ec2daa77d0e6603a2f84..412b4476c11d69075f4cd06c5e334a93b29a6b5a 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -643,7 +643,7 @@ static void sig_resize (int dont_care_sig) {
 \f
 /*######  Special UTF-8 Multi-Byte support  ##############################*/
 
-        /* Support for NLS translated 'string' length */
+        /* Support for NLS translated multi-byte strings */
 static char UTF8_tab[] = {
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 - 0x0F
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 - 0x1F
@@ -682,7 +682,7 @@ static int utf8_delta (const char *str) {
 
 
         /*
-         * Determine a logical end within a potential multi-byte string
+         * Determine a physical end within a potential multi-byte string
          * where maximum printable chars could be accommodated in width */
 static int utf8_embody (const char *str, int width) {
     const unsigned char *p = (const unsigned char *)str;
@@ -691,9 +691,8 @@ static int utf8_embody (const char *str, int width) {
     while (*p) {
         // -1 represents a decoding error, pretend it's untranslated ...
         if (0 > (clen = UTF8_tab[*p])) return width;
-        if (cnum + 1 >= width) break;
         p += clen;
-        ++cnum;
+        if (++cnum >= width) break;
     }
     return (int)((const char *)p - str);
 } // end: utf8_embody
@@ -705,9 +704,11 @@ static int utf8_embody (const char *str, int width) {
 static const char *utf8_justify (const char *str, int width, int justr) {
    static char l_fmt[]  = "%-*.*s%s", r_fmt[] = "%*.*s%s";
    static char buf[SCREENMAX];
+   const char *p;
 
-   width += utf8_delta(str);
-   snprintf(buf, sizeof(buf), justr ? r_fmt : l_fmt, width, width, str, COLPADSTR);
+   p = fmtmk("%.*s", utf8_embody(str, width), str);
+   width += utf8_delta(p);
+   snprintf(buf, sizeof(buf), justr ? r_fmt : l_fmt, width, width, p, COLPADSTR);
    return buf;
 } // end: utf8_justify