From 57bb1dff57ee60eac5aed02043a3903ccce141bc Mon Sep 17 00:00:00 2001 From: daichi Date: Fri, 20 Sep 2019 17:37:23 +0000 Subject: [PATCH] top(1): support multibyte characters in command names (ARGV array) depending on locale. - add setlocale() - remove printable() function - add VIS_OCTAL and VIS_SAFE to the flag of strvisx() to display non-printable characters that do not use C-style backslash sequences in three digit octal sequence, or remove it This change allows multibyte characters to be displayed according to locale. If it is recognized as a non-display character according to the locale, it is displayed in three digit octal sequence. Reference: https://www.mail-archive.com/svn-src-all@freebsd.org/msg165751.html https://www.mail-archive.com/svn-src-all@freebsd.org/msg165766.html https://www.mail-archive.com/svn-src-all@freebsd.org/msg165833.html https://www.mail-archive.com/svn-src-all@freebsd.org/msg165846.html https://www.mail-archive.com/svn-src-all@freebsd.org/msg165891.html Submitted by: hrs Differential Revision: https://reviews.freebsd.org/D16204 --- usr.bin/top/display.c | 25 ------------------------- usr.bin/top/display.h | 1 - usr.bin/top/machine.c | 4 ++-- usr.bin/top/top.1 | 6 +++++- usr.bin/top/top.c | 6 ++++++ 5 files changed, 13 insertions(+), 29 deletions(-) diff --git a/usr.bin/top/display.c b/usr.bin/top/display.c index 00534fd7f411..38e6657401d0 100644 --- a/usr.bin/top/display.c +++ b/usr.bin/top/display.c @@ -1291,31 +1291,6 @@ line_update(char *old, char *new, int start, int line) } } -/* - * printable(str) - make the string pointed to by "str" into one that is - * printable (i.e.: all ascii), by converting all non-printable - * characters into '?'. Replacements are done in place and a pointer - * to the original buffer is returned. - */ - -char * -printable(char str[]) -{ - char *ptr; - char ch; - - ptr = str; - while ((ch = *ptr) != '\0') - { - if (!isprint(ch)) - { - *ptr = '?'; - } - ptr++; - } - return(str); -} - void i_uptime(struct timeval *bt, time_t *tod) { diff --git a/usr.bin/top/display.h b/usr.bin/top/display.h index 546f21ce34b0..ff3ea8d3fe9a 100644 --- a/usr.bin/top/display.h +++ b/usr.bin/top/display.h @@ -11,7 +11,6 @@ int display_updatecpus(struct statics *statics); void clear_message(void); int display_resize(void); void i_header(const char *text); -char *printable(char *string); void display_header(int t); int display_init(struct statics *statics); void i_arc(int *stats); diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c index dd2b7a110419..edfe3e659f13 100644 --- a/usr.bin/top/machine.c +++ b/usr.bin/top/machine.c @@ -1003,7 +1003,7 @@ format_next_process(struct handle * xhandle, char *(*get_userid)(int), int flags len = (argbuflen - (dst - argbuf) - 1) / 4; strvisx(dst, src, MIN(strlen(src), len), - VIS_NL | VIS_CSTYLE); + VIS_NL | VIS_CSTYLE | VIS_OCTAL | VIS_SAFE); while (*dst != '\0') dst++; if ((argbuflen - (dst - argbuf) - 1) / 4 > 0) @@ -1102,7 +1102,7 @@ format_next_process(struct handle * xhandle, char *(*get_userid)(int), int flags sbuf_printf(procbuf, "%6s ", format_time(cputime)); sbuf_printf(procbuf, "%6.2f%% ", ps.wcpu ? 100.0 * weighted_cpu(PCTCPU(pp), pp) : 100.0 * PCTCPU(pp)); } - sbuf_printf(procbuf, "%s", printable(cmdbuf)); + sbuf_printf(procbuf, "%s", cmdbuf); free(cmdbuf); return (sbuf_data(procbuf)); } diff --git a/usr.bin/top/top.1 b/usr.bin/top/top.1 index a2858003d465..83c2c3440893 100644 --- a/usr.bin/top/top.1 +++ b/usr.bin/top/top.1 @@ -1,5 +1,5 @@ .\" $FreeBSD$ -.Dd October 2, 2018 +.Dd September 20, 2019 .Dt TOP 1 .Os .Sh NAME @@ -192,6 +192,10 @@ or \*(lqall\*(rq. Boolean flags are toggles. A second specification of any of these options will negate the first. +.Pp +The display of command names changes according to the locale. +If command names displayed in the locale settings are recognized as +non-display characters, they are displayed in three digit octal sequence. .Sh "INTERACTIVE MODE" When .Nm diff --git a/usr.bin/top/top.c b/usr.bin/top/top.c index 650789689b6b..01cad421b64c 100644 --- a/usr.bin/top/top.c +++ b/usr.bin/top/top.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -265,6 +266,11 @@ main(int argc, const char *argv[]) setbuffer(stdout, stdoutbuf, Buffersize); #endif + if (setlocale(LC_ALL, "") == NULL) { + fprintf(stderr, "invalid locale.\n"); + exit(1); + } + mypid = getpid(); /* get our name */