diff options
author | Daichi GOTO <daichi@FreeBSD.org> | 2019-09-20 17:37:23 +0000 |
---|---|---|
committer | Daichi GOTO <daichi@FreeBSD.org> | 2019-09-20 17:37:23 +0000 |
commit | b1de37fadd8d5d672065b6a9f9839b021fbeb433 (patch) | |
tree | 25b5020fb5bfddee8a5a49802b68b50ed41c2c38 /usr.bin/top | |
parent | 39404490b742f23c70efc29f6be0d26f6808bd44 (diff) | |
download | src-b1de37fadd8d5d672065b6a9f9839b021fbeb433.tar.gz src-b1de37fadd8d5d672065b6a9f9839b021fbeb433.zip |
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
Notes
Notes:
svn path=/head/; revision=352558
Diffstat (limited to 'usr.bin/top')
-rw-r--r-- | usr.bin/top/display.c | 25 | ||||
-rw-r--r-- | usr.bin/top/display.h | 1 | ||||
-rw-r--r-- | usr.bin/top/machine.c | 4 | ||||
-rw-r--r-- | usr.bin/top/top.1 | 6 | ||||
-rw-r--r-- | 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 <errno.h> #include <getopt.h> #include <jail.h> +#include <locale.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> @@ -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 */ |