]> granicus.if.org Git - procps-ng/commitdiff
top: enable bottom 'window' multi-byte char capability <=== port of newlib 723b418c
authorJim Warner <james.warner@comcast.net>
Wed, 15 Jun 2022 05:00:00 +0000 (00:00 -0500)
committerCraig Small <csmall@dropbear.xyz>
Sun, 19 Jun 2022 10:58:51 +0000 (20:58 +1000)
______________________________ original newlib message

If the special bottom 'window' routines remain unaware
of potential multi-byte characters, that heading could
be truncated prematurely and unnecessary blank line(s)
added to the reserved rows at the bottom of a display.

So, in both cases, this patch will now account for any
difference between string lengths and display columns.

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

index d721e26e9f1b8cf460aa94f2375c0499c33e3135..cf8a09f37b6f3d8efcc1c31d84cfd8de2a0a4f9b 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -5134,10 +5134,14 @@ static int bot_focus_str (const char *hdr, const char *str) {
       if (n >= sizeof(Bot_buf)) n = sizeof(Bot_buf) - 1;
       if (!*str || !strcmp(str, "-")) strcpy(Bot_buf, "n/a");
       else memccpy(Bot_buf, str, '\0', n);
-      Bot_rsvd = 1 + BOT_RSVD + (strlen(Bot_buf) / Screen_cols);
+      Bot_rsvd = 1 + BOT_RSVD + ((strlen(Bot_buf) - utf8_delta(Bot_buf)) / Screen_cols);
       if (Bot_rsvd > maxRSVD) Bot_rsvd = maxRSVD;
       // somewhere down call chain fmtmk() may be used, so we'll old school it
-      snprintf(tmp, sizeof(tmp), "%s%s%-*s", tg2(0, SCREEN_ROWS), Curwin->capclr_hdr, Screen_cols, hdr);
+      snprintf(tmp, sizeof(tmp), "%s%s%-*s"
+         , tg2(0, SCREEN_ROWS)
+         , Curwin->capclr_hdr
+         , Screen_cols + utf8_delta(hdr)
+         , hdr);
       putp(tmp);
    }
    // now fmtmk is safe to use ...
@@ -5181,16 +5185,21 @@ static int bot_focus_strv (const char *hdr, const char **strv) {
       memcpy(Bot_buf, strv[0], n);
       if (!Bot_buf[0] || (!strcmp(Bot_buf, "-") && n <= sizeof(char *)))
          strcpy(Bot_buf, "n/a");
-      for (nsav= 0, p = Bot_buf; strv[nsav] != NULL; nsav++) {
+      for (nsav= 0, p = Bot_buf, x = 0; strv[nsav] != NULL; nsav++) {
          p += strlen(strv[nsav]) + 1;
          if ((p - Bot_buf) >= sizeof(Bot_buf))
             break;
-         n = p - Bot_buf;
+         x += utf8_delta(strv[nsav]);
       }
+      n  = (p - Bot_buf) - (x + 1);
       Bot_rsvd = 1 + BOT_RSVD + (n / Screen_cols);
       if (Bot_rsvd > maxRSVD) Bot_rsvd = maxRSVD;
       // somewhere down call chain fmtmk() may be used, so we'll old school it
-      snprintf(tmp, sizeof(tmp), "%s%s%-*s", tg2(0, SCREEN_ROWS), Curwin->capclr_hdr, Screen_cols, hdr);
+      snprintf(tmp, sizeof(tmp), "%s%s%-*s"
+         , tg2(0, SCREEN_ROWS)
+         , Curwin->capclr_hdr
+         , Screen_cols + utf8_delta(hdr)
+         , hdr);
       putp(tmp);
    }
    // now fmtmk is safe to use ...