top: correct an insidious occasional truncation buglet
With the help of our Swedish translator, hopefully the final buglet has now been vanquished in the multi-byte translation support. This one was a real nasty bugger. Although it didn't occur with every terminal emulator, occasionally random text lines were being chopped off. As it turns out, those terminals were blameless. There were two separate places in top's show_special routine where potential multi-byte sequences were inadequately addressed. Solution: exploit existing utf-8 functions. [ it also became apparent that the translation hints ] [ in the top_nls module were deficient. so a special ] [ caution was added regarding the final line of txt. ] Reference(s): https://gitlab.com/procps-ng/procps/issues/68 Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
@ -932,7 +932,7 @@ static void show_special (int interact, const char *glob) {
|
||||
case 5: case 6: case 7: case 8:
|
||||
*sub_end = '\0';
|
||||
snprintf(tmp, sizeof(tmp), "%s%.*s%s"
|
||||
, Curwin->captab[ch], room, sub_beg, Caps_off);
|
||||
, Curwin->captab[ch], utf8_embody(sub_beg, room), sub_beg, Caps_off);
|
||||
rp = scat(rp, tmp);
|
||||
room -= (sub_end - sub_beg);
|
||||
room += utf8_delta(sub_beg);
|
||||
@ -955,7 +955,7 @@ static void show_special (int interact, const char *glob) {
|
||||
it probably means caller wants to retain cursor position on this final
|
||||
line. That, in turn, means we're interactive and so we'll just do our
|
||||
'fit-to-screen' thingy while also leaving room for the cursor... */
|
||||
if (*glob) PUTT("%.*s", Screen_cols -1, glob);
|
||||
if (*glob) PUTT("%.*s", utf8_embody(glob, Screen_cols - 1), glob);
|
||||
} // end: show_special
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user