svn commit: r336028 - head/usr.bin/top
Daichi GOTO
daichi at FreeBSD.org
Fri Jul 6 12:07:08 UTC 2018
Author: daichi
Date: Fri Jul 6 12:07:06 2018
New Revision: 336028
URL: https://svnweb.freebsd.org/changeset/base/336028
Log:
Changed to eliminate the upper limit of command length displayed
by "-a" and expand to match terminal width
Reviewed by: eadler
Approved by: gnn (mentor)
Differential Revision: https://reviews.freebsd.org/D16083
Modified:
head/usr.bin/top/display.c
head/usr.bin/top/machine.c
head/usr.bin/top/screen.c
head/usr.bin/top/top.h
Modified: head/usr.bin/top/display.c
==============================================================================
--- head/usr.bin/top/display.c Fri Jul 6 11:50:59 2018 (r336027)
+++ head/usr.bin/top/display.c Fri Jul 6 12:07:06 2018 (r336028)
@@ -57,9 +57,8 @@ FILE *debug;
static int lmpid = 0;
static int last_hi = 0; /* used in u_process and u_endscreen */
static int lastline = 0;
-static int display_width = MAX_COLS;
-#define lineindex(l) ((l)*display_width)
+#define lineindex(l) ((l)*screen_width)
/* things initialized by display_init and used thruout */
@@ -94,6 +93,9 @@ static enum { OFF, ON, ERASE } header_status = ON;
static void summary_format(char *, int *, const char * const *);
static void line_update(char *, char *, int, int);
+static int setup_buffer_bufsiz = 0;
+static char * setup_buffer(char *, int);
+
int x_lastpid = 10;
int y_lastpid = 0;
int x_loadave = 33;
@@ -138,17 +140,9 @@ display_resize(void)
if (lines < 0)
lines = 0;
- /* we don't want more than MAX_COLS columns, since the machine-dependent
- modules make static allocations based on MAX_COLS and we don't want
- to run off the end of their buffers */
- display_width = screen_width;
- if (display_width >= MAX_COLS)
- {
- display_width = MAX_COLS - 1;
- }
/* now, allocate space for the screen buffer */
- screenbuf = calloc(lines, display_width);
+ screenbuf = calloc(lines, screen_width);
if (screenbuf == NULL)
{
/* oops! */
@@ -336,7 +330,7 @@ i_timeofday(time_t *tod)
}
static int ltotal = 0;
-static char procstates_buffer[MAX_COLS];
+static char *procstates_buffer = NULL;
/*
* *_procstates(total, brkdn, names) - print the process summary line
@@ -350,6 +344,8 @@ i_procstates(int total, int *brkdn)
{
int i;
+ procstates_buffer = setup_buffer(procstates_buffer, 0);
+
/* write current number of processes and remember the value */
printf("%d %s:", total, (ps.thread) ? "threads" :"processes");
ltotal = total;
@@ -372,9 +368,11 @@ i_procstates(int total, int *brkdn)
void
u_procstates(int total, int *brkdn)
{
- static char new[MAX_COLS];
+ static char *new = NULL;
int i;
+ new = setup_buffer(new, 0);
+
/* update number of processes only if it has changed */
if (ltotal != total)
{
@@ -551,11 +549,13 @@ z_cpustates(void)
* for i_memory ONLY: cursor is on the previous line
*/
-static char memory_buffer[MAX_COLS];
+static char *memory_buffer = NULL;
void
i_memory(int *stats)
{
+ memory_buffer = setup_buffer(memory_buffer, 0);
+
fputs("\nMem: ", stdout);
lastline++;
@@ -567,8 +567,10 @@ i_memory(int *stats)
void
u_memory(int *stats)
{
- static char new[MAX_COLS];
+ static char *new = NULL;
+ new = setup_buffer(new, 0);
+
/* format the new line */
summary_format(new, stats, memory_names);
line_update(memory_buffer, new, x_mem, y_mem);
@@ -580,11 +582,13 @@ u_memory(int *stats)
* Assumptions: cursor is on "lastline"
* for i_arc ONLY: cursor is on the previous line
*/
-static char arc_buffer[MAX_COLS];
+static char *arc_buffer = NULL;
void
i_arc(int *stats)
{
+ arc_buffer = setup_buffer(arc_buffer, 0);
+
if (arc_names == NULL)
return;
@@ -599,8 +603,10 @@ i_arc(int *stats)
void
u_arc(int *stats)
{
- static char new[MAX_COLS];
+ static char *new = NULL;
+ new = setup_buffer(new, 0);
+
if (arc_names == NULL)
return;
@@ -616,11 +622,13 @@ u_arc(int *stats)
* Assumptions: cursor is on "lastline"
* for i_carc ONLY: cursor is on the previous line
*/
-static char carc_buffer[MAX_COLS];
+static char *carc_buffer = NULL;
void
i_carc(int *stats)
{
+ carc_buffer = setup_buffer(carc_buffer, 0);
+
if (carc_names == NULL)
return;
@@ -635,8 +643,10 @@ i_carc(int *stats)
void
u_carc(int *stats)
{
- static char new[MAX_COLS];
+ static char *new = NULL;
+ new = setup_buffer(new, 0);
+
if (carc_names == NULL)
return;
@@ -652,11 +662,13 @@ u_carc(int *stats)
* for i_swap ONLY: cursor is on the previous line
*/
-static char swap_buffer[MAX_COLS];
+static char *swap_buffer = NULL;
void
i_swap(int *stats)
{
+ swap_buffer = setup_buffer(swap_buffer, 0);
+
fputs("\nSwap: ", stdout);
lastline++;
@@ -668,8 +680,10 @@ i_swap(int *stats)
void
u_swap(int *stats)
{
- static char new[MAX_COLS];
+ static char *new = NULL;
+ new = setup_buffer(new, 0);
+
/* format the new line */
summary_format(new, stats, swap_names);
line_update(swap_buffer, new, x_swap, y_swap);
@@ -689,7 +703,7 @@ u_swap(int *stats)
* respect to screen updates).
*/
-static char next_msg[MAX_COLS + 5];
+static char *next_msg = NULL;
static int msglen = 0;
/* Invariant: msglen is always the length of the message currently displayed
on the screen (even when next_msg doesn't contain that message). */
@@ -697,6 +711,7 @@ static int msglen = 0;
void
i_message(void)
{
+ next_msg = setup_buffer(next_msg, 5);
while (lastline < y_message)
{
@@ -736,7 +751,7 @@ trim_header(const char *text)
int width;
s = NULL;
- width = display_width;
+ width = screen_width;
header_length = strlen(text);
if (header_length >= width) {
s = strndup(text, width);
@@ -807,7 +822,7 @@ i_process(int line, char *thisline)
}
/* truncate the line to conform to our current screen width */
- thisline[display_width] = '\0';
+ thisline[screen_width] = '\0';
/* write the line out */
fputs(thisline, stdout);
@@ -817,7 +832,7 @@ i_process(int line, char *thisline)
p = stpcpy(base, thisline);
/* zero fill the rest of it */
- memset(p, 0, display_width - (p - base));
+ memset(p, 0, screen_width - (p - base));
}
void
@@ -831,7 +846,7 @@ u_process(int line, char *newline)
bufferline = &screenbuf[lineindex(line)];
/* truncate the line to conform to our current screen width */
- newline[display_width] = '\0';
+ newline[screen_width] = '\0';
/* is line higher than we went on the last display? */
if (line >= last_hi)
@@ -856,7 +871,7 @@ u_process(int line, char *newline)
optr = stpcpy(bufferline, newline);
/* zero fill the rest of it */
- memset(optr, 0, display_width - (optr - bufferline));
+ memset(optr, 0, screen_width - (optr - bufferline));
}
else
{
@@ -1235,7 +1250,7 @@ line_update(char *old, char *new, int start, int line)
} while (ch != '\0');
/* zero out the rest of the line buffer -- MUST BE DONE! */
- diff = display_width - newcol;
+ diff = screen_width - newcol;
if (diff > 0)
{
memset(old, 0, diff);
@@ -1326,4 +1341,32 @@ i_uptime(struct timeval *bt, time_t *tod)
}
printf(" up %d+%02d:%02d:%02d", days, hrs, mins, secs);
}
+}
+
+static char *
+setup_buffer(char *buffer, int addlen)
+{
+ char *b = NULL;
+
+ if (NULL == buffer) {
+ setup_buffer_bufsiz = screen_width;
+ b = calloc(setup_buffer_bufsiz + addlen, sizeof(char));
+ } else {
+ if (screen_width > setup_buffer_bufsiz) {
+ setup_buffer_bufsiz = screen_width;
+ free(buffer);
+ b = calloc(setup_buffer_bufsiz + addlen,
+ sizeof(char));
+ } else {
+ b = buffer;
+ }
+ }
+
+ if (NULL == b) {
+ fprintf(stderr, "%s: can't allocate sufficient memory\n",
+ myname);
+ exit(4);
+ }
+
+ return b;
}
Modified: head/usr.bin/top/machine.c
==============================================================================
--- head/usr.bin/top/machine.c Fri Jul 6 11:50:59 2018 (r336027)
+++ head/usr.bin/top/machine.c Fri Jul 6 12:07:06 2018 (r336028)
@@ -870,7 +870,6 @@ format_next_process(struct handle * xhandle, char *(*g
long p_tot, s_tot;
char *cmdbuf = NULL;
char **args;
- const int cmdlen = 256;
static struct sbuf* procbuf = NULL;
/* clean up from last time. */
@@ -935,31 +934,31 @@ format_next_process(struct handle * xhandle, char *(*g
break;
}
- cmdbuf = calloc(cmdlen + 1, 1);
+ cmdbuf = calloc(screen_width + 1, 1);
if (cmdbuf == NULL) {
- warn("calloc(%d)", cmdlen + 1);
+ warn("calloc(%d)", screen_width + 1);
return NULL;
}
if (!(flags & FMT_SHOWARGS)) {
if (ps.thread && pp->ki_flag & P_HADTHREADS &&
pp->ki_tdname[0]) {
- snprintf(cmdbuf, cmdlen, "%s{%s%s}", pp->ki_comm,
+ snprintf(cmdbuf, screen_width, "%s{%s%s}", pp->ki_comm,
pp->ki_tdname, pp->ki_moretdname);
} else {
- snprintf(cmdbuf, cmdlen, "%s", pp->ki_comm);
+ snprintf(cmdbuf, screen_width, "%s", pp->ki_comm);
}
} else {
if (pp->ki_flag & P_SYSTEM ||
- (args = kvm_getargv(kd, pp, cmdlen)) == NULL ||
+ (args = kvm_getargv(kd, pp, screen_width)) == NULL ||
!(*args)) {
if (ps.thread && pp->ki_flag & P_HADTHREADS &&
pp->ki_tdname[0]) {
- snprintf(cmdbuf, cmdlen,
+ snprintf(cmdbuf, screen_width,
"[%s{%s%s}]", pp->ki_comm, pp->ki_tdname,
pp->ki_moretdname);
} else {
- snprintf(cmdbuf, cmdlen,
+ snprintf(cmdbuf, screen_width,
"[%s]", pp->ki_comm);
}
} else {
@@ -969,7 +968,7 @@ format_next_process(struct handle * xhandle, char *(*g
size_t argbuflen;
size_t len;
- argbuflen = cmdlen * 4;
+ argbuflen = screen_width * 4;
argbuf = calloc(argbuflen + 1, 1);
if (argbuf == NULL) {
warn("calloc(%zu)", argbuflen + 1);
@@ -1005,21 +1004,21 @@ format_next_process(struct handle * xhandle, char *(*g
if (strcmp(cmd, pp->ki_comm) != 0) {
if (ps.thread && pp->ki_flag & P_HADTHREADS &&
pp->ki_tdname[0])
- snprintf(cmdbuf, cmdlen,
+ snprintf(cmdbuf, screen_width,
"%s (%s){%s%s}", argbuf,
pp->ki_comm, pp->ki_tdname,
pp->ki_moretdname);
else
- snprintf(cmdbuf, cmdlen,
+ snprintf(cmdbuf, screen_width,
"%s (%s)", argbuf, pp->ki_comm);
} else {
if (ps.thread && pp->ki_flag & P_HADTHREADS &&
pp->ki_tdname[0])
- snprintf(cmdbuf, cmdlen,
+ snprintf(cmdbuf, screen_width,
"%s{%s%s}", argbuf, pp->ki_tdname,
pp->ki_moretdname);
else
- strlcpy(cmdbuf, argbuf, cmdlen);
+ strlcpy(cmdbuf, argbuf, screen_width);
}
free(argbuf);
}
Modified: head/usr.bin/top/screen.c
==============================================================================
--- head/usr.bin/top/screen.c Fri Jul 6 11:50:59 2018 (r336027)
+++ head/usr.bin/top/screen.c Fri Jul 6 12:07:06 2018 (r336028)
@@ -62,8 +62,7 @@ init_termcap(bool interactive)
char *term_name;
int status;
- /* set defaults in case we aren't smart */
- screen_width = MAX_COLS;
+ screen_width = 0;
screen_length = 0;
if (!interactive)
Modified: head/usr.bin/top/top.h
==============================================================================
--- head/usr.bin/top/top.h Fri Jul 6 11:50:59 2018 (r336027)
+++ head/usr.bin/top/top.h Fri Jul 6 12:07:06 2018 (r336028)
@@ -13,9 +13,6 @@
/* Number of lines of header information on the standard screen */
extern int Header_lines;
-/* Maximum number of columns allowed for display */
-#define MAX_COLS 512
-
/* Special atoi routine returns either a non-negative number or one of: */
#define Infinity -1
#define Invalid -2
More information about the svn-src-all
mailing list