added output width/height override support to top, + misc

This source patch addresses the following:
 Enhancements
  . added -w command line switch, with optional argument
   ( offers complete control over width and height, in  )
   ( combination with env variables COLUMNS= and LINES= )
  . updated man document to reflect the new capability
  . reengineered Fields Management to be more flexible
    thus no longer requiring a normal sized tty
 Buglets fixed
  . forced View_SCROLL off when in 'Batch' mode
  . for narrow xterm, fixed return val in show_pmt
  . for narrow xterm, fixed cursor pos in linein
  . added a window specific end-of-line termcap ptr
   ( so clr_eol does not overwrite last printable char )
 Cosmetic changes
  . eliminated TTYGETENVYES define, incorporated as -w
  . eliminated RESIZE_LIMIT define, no longer needed
  . eliminated FIELD_CURSOR define, no longer possible
  . eliminated extra text on Fields Management screen
  . fixed miscellaneous man document typos/formatting

Signed-off-by: Jan Görig <jgorig@redhat.com>
This commit is contained in:
Jim Warner 2011-05-26 11:33:32 +02:00 committed by Jan Görig
parent c3b7310149
commit c2dcbef482
3 changed files with 176 additions and 151 deletions

47
top.1
View File

@ -99,8 +99,8 @@
.\" ---------------------------------------------------------------------- .\" ----------------------------------------------------------------------
.SH SYNOPSIS .SH SYNOPSIS
.\" ---------------------------------------------------------------------- .\" ----------------------------------------------------------------------
\*(WE \-\fBhv\fR | \-\fBbcHisS\fR \-\fBd\fI delay\fR \-\fBn\fI limit\fR \*(WE \-\fBhv\fR|\-\fBbcHisS\fR \-\fBd\fI delay\fR \-\fBn\fI limit\fR
\-\fBu\fR|\fBU\fI user\fR | \-\fBp\fI pid\fR [,\fIpid\fR ...] \-\fBu\fR|\fBU\fI user\fR \-\fBp\fI pid\fR \-\fBw\fR [\fIcols\fR] \fR
The traditional switches '-' and whitespace are optional. The traditional switches '-' and whitespace are optional.
@ -191,15 +191,14 @@ These areas will be explored in the sections that follow.
There is also an Input/Message line between the Summary Area and Columns There is also an Input/Message line between the Summary Area and Columns
Header which needs no further explanation. Header which needs no further explanation.
.PP
\*(NT the width of \*(We's display will be limited to \*(WX positions. \*(NT the width of \*(We's display will be limited to \*(WX positions.
Displaying all fields requires \*(WF characters. Displaying all fields requires \*(WF characters.
The remaining width is allocated to variable width columns currently being Remaining screen width is usually allocated to any variable width columns
displayed which can expand to show additional information. currently visible.
The variable width columns, such as COMMAND, are noted in topic
An example would be the COMMAND field which could show the program name 3a. DESCRIPTIONS of Fields.
only or a complete command line reflecting path and arguments. Actual output width may also be influenced by the -w switch, which is
Other variable width columns are noted in topic 3a. DESCRIPTIONS of Fields. discussed in topic 1. COMMAND\-LINE Options.
.\" ...................................................................... .\" ......................................................................
.SS Startup Defaults .SS Startup Defaults
@ -243,7 +242,7 @@ All are explained in detail in the sections that follow.
The command-line syntax for \*(We consists of: The command-line syntax for \*(We consists of:
\-\fBhv\fR | \-\fBbcHisS\fR \-\fBd\fI delay\fR \-\fBn\fI limit\fR \-\fBhv\fR | \-\fBbcHisS\fR \-\fBd\fI delay\fR \-\fBn\fI limit\fR
\-\fBu\fR|\fBU\fI user\fR | \-\fBp\fI pid\fR [,\fIpid\fR ...] \-\fBu\fR|\fBU\fI user\fR | \-\fBp\fI pid\fR \-\fBw\fR [\fIcols\fR] \fR
The typically mandatory switches ('-') and even whitespace are completely The typically mandatory switches ('-') and even whitespace are completely
optional. optional.
@ -254,7 +253,7 @@ Show library version and the usage prompt, then quit.
.TP 5 .TP 5
\-\fBb\fR :\fI Batch-mode\fR operation \fR \-\fBb\fR :\fI Batch-mode\fR operation \fR
Starts \*(We in 'Batch mode', which could be useful for sending output Starts \*(We in 'Batch' mode, which could be useful for sending output
from \*(We to other programs or to a file. from \*(We to other programs or to a file.
In this mode, \*(We will not accept input and runs until the iterations In this mode, \*(We will not accept input and runs until the iterations
limit you've set with the '-n' \*(CO or until killed. limit you've set with the '-n' \*(CO or until killed.
@ -323,13 +322,29 @@ time that it and its dead children have used.
\*(XC 'S' \*(CI for additional information regarding this mode. \*(XC 'S' \*(CI for additional information regarding this mode.
.TP 5 .TP 5
\-\fBu\fR | \-\fBU\fR :\fI User-filter-mode\fR as:\ \ -u | -U\fB number\fR or\fB name \fR \-\fBu\fR | \-\fBU\fR :\fI User-filter-mode\fR as:\ \ \fB-u\fR | \fB-U number\fR or\fB name \fR
Display only processes with a user id or user name matching that given. Display only processes with a user id or user name matching that given.
The '-u' option matches on \fB effective\fR user whereas the '-U' option The '-u' option matches on \fI effective\fR user whereas the '-U' option
matches on\fB any\fR user (real, effective, saved, or filesystem). matches on\fI any\fR user (real, effective, saved, or filesystem).
The 'p', 'u' and 'U' \*(COs are mutually exclusive. The 'p', 'u' and 'U' \*(COs are mutually exclusive.
.TP 5
\-\fBw\fR :\fI Output-width-override\fR as:\ \ \fB-w\fR [\fB number\fR ] \fR
In 'Batch' mode, when used without an argument \*(We will format
output using the COLUMNS= and LINES= environment variables, if set.
Otherwise, width will be fixed at the maximum \*(WX columns.
With an argument, output width can be decreased or increased (up to \*(WX)
but the number of rows is considered unlimited.
In normal display mode, when used without an argument \*(We will\fI attempt\fR
to format output using the COLUMNS= and LINES= environment variables, if set.
With an argument, output width can only be decreased, not increased.
Whether using environment variables or an argument with -w, when\fI not\fR
in 'Batch' mode actual terminal dimensions can never be exceeded.
\*(NT Without the use of this \*(CO, output width is always based on the
terminal at which \*(We was invoked whether or not in 'Batch' mode.
.\" ---------------------------------------------------------------------- .\" ----------------------------------------------------------------------
.SH 2. SUMMARY Display .SH 2. SUMMARY Display
@ -480,7 +495,7 @@ The\fI effective\fR group name.
A task's currently used share of available \*(MP. A task's currently used share of available \*(MP.
.TP 4 .TP 4
10.\fB NI \*(Em Nice Value \fR 10.\fB NI \*(Em Nice Value \fR
The nice value of the task. The nice value of the task.
A negative nice value means higher priority, whereas a positive nice value A negative nice value means higher priority, whereas a positive nice value
means lower priority. means lower priority.
@ -1133,7 +1148,7 @@ The following \*(CIs are available.
'q' :abandon current changes and exit 'q' :abandon current changes and exit
.Ed .Ed
If your use 'a' or 'w' to cycle the targeted window, you will If you use 'a' or 'w' to cycle the targeted window, you will
have applied the color scheme that was displayed when you left that window. have applied the color scheme that was displayed when you left that window.
You can, of course, easily return to any window and reapply different You can, of course, easily return to any window and reapply different
colors or turn colors \*F completely with the 'z' toggle. colors or turn colors \*F completely with the 'z' toggle.

222
top.c
View File

@ -104,7 +104,8 @@ static int No_ksyms = -1, // set to '0' if ksym avail, '1' otherwise
Batch = 0, // batch mode, collect no input, dumb output Batch = 0, // batch mode, collect no input, dumb output
Loops = -1, // number of iterations, -1 loops forever Loops = -1, // number of iterations, -1 loops forever
Secure_mode = 0, // set if some functionality restricted Secure_mode = 0, // set if some functionality restricted
Thread_mode = 0; // set w/ 'H' - show threads via readtask() Thread_mode = 0, // set w/ 'H' - show threads via readtask()
Width_mode = 0; // set w/ 'w' - potential output override
/* Unchangeable cap's stuff built just once (if at all) and /* Unchangeable cap's stuff built just once (if at all) and
thus NOT saved in a WIN_t's RCW_t. To accomodate 'Batch' thus NOT saved in a WIN_t's RCW_t. To accomodate 'Batch'
@ -316,7 +317,6 @@ static void bye_bye (const char *str) {
#ifndef RMAN_IGNORED #ifndef RMAN_IGNORED
putp(Cap_smam); putp(Cap_smam);
#endif #endif
putp("\n");
} }
fflush(stdout); fflush(stdout);
@ -468,6 +468,7 @@ static void bye_bye (const char *str) {
fputs(str, stderr); fputs(str, stderr);
exit(1); exit(1);
} }
putp("\n");
exit(0); exit(0);
} // end: bye_bye } // end: bye_bye
@ -646,17 +647,19 @@ static void show_msg (const char *str) {
/* /*
* Show an input prompt + larger cursor (if possible) */ * Show an input prompt + larger cursor (if possible) */
static int show_pmt (const char *str) { static int show_pmt (const char *str) {
int rc;
PUTT("%s%s%.*s: %s%s%s" PUTT("%s%s%.*s: %s%s%s"
, tg2(0, Msg_row) , tg2(0, Msg_row)
, Curwin->capclr_pmt , Curwin->capclr_pmt
, Screen_cols - 2 , Screen_cols - 3
, str , str
, Cap_curs_huge , Cap_curs_huge
, Caps_off , Caps_off
, Cap_clr_eol); , Cap_clr_eol);
fflush(stdout); fflush(stdout);
// +2 for the ': ' characters we added (if anybody cares)... // +2 for the ': ' chars we added or -1 for the cursor...
return (int)strlen(str) + 2; return ((rc = (int)strlen(str)+2) < Screen_cols) ? rc : Screen_cols-1;
} // end: show_pmt } // end: show_pmt
@ -754,8 +757,8 @@ static void show_special (int interact, const char *glob) {
/* If there's anything left in the glob (by virtue of no trailing '\n'), /* If there's anything left in the glob (by virtue of no trailing '\n'),
it probably means caller wants to retain cursor position on this final 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 line. That, in turn, means we're interactive and so we'll just do our
'fit-to-screen' thingy... */ 'fit-to-screen' thingy while also leaving room for the cursor... */
if (*glob) PUTT("%.*s", Screen_cols, glob); if (*glob) PUTT("%.*s", Screen_cols -1, glob);
} // end: show_special } // end: show_special
/*###### Low Level Memory/Keyboard support #############################*/ /*###### Low Level Memory/Keyboard support #############################*/
@ -920,7 +923,7 @@ static char *linein (const char *prompt) {
// thank goodness memmove allows the two strings to overlap // thank goodness memmove allows the two strings to overlap
#define sqzSTR { memmove(&buf[pos], &buf[pos+1], bufMAX-pos); \ #define sqzSTR { memmove(&buf[pos], &buf[pos+1], bufMAX-pos); \
buf[sizeof(buf)-1] = '\0'; } buf[sizeof(buf)-1] = '\0'; }
#define expSTR if (len+1 < bufMAX-1 && len+beg+1 < Screen_cols-1) { \ #define expSTR if (len+1 < bufMAX && len+beg+1 < Screen_cols) { \
memmove(&buf[pos+1], &buf[pos], bufMAX-pos); buf[pos] = ' '; } memmove(&buf[pos+1], &buf[pos], bufMAX-pos); buf[pos] = ' '; }
#define logCOL (pos+1) #define logCOL (pos+1)
#define phyCOL (beg+pos+1) #define phyCOL (beg+pos+1)
@ -963,7 +966,7 @@ static char *linein (const char *prompt) {
pos = len; pos = len;
break; break;
default: // what we REALLY wanted (maybe) default: // what we REALLY wanted (maybe)
if (isprint(key) && logCOL+1 < bufMAX && phyCOL+1 < Screen_cols) if (isprint(key) && logCOL < bufMAX && phyCOL < Screen_cols)
buf[pos++] = key; buf[pos++] = key;
break; break;
} }
@ -1245,6 +1248,7 @@ static FLD_t Fieldstab[] = {
* cached screen geometry and related variables */ * cached screen geometry and related variables */
static void adj_geometry (void) { static void adj_geometry (void) {
static size_t pseudo_max = 0; static size_t pseudo_max = 0;
static int w_set = 0, w_cols = 0, w_rows = 0;
struct winsize wz; struct winsize wz;
Screen_cols = columns; // <term.h> Screen_cols = columns; // <term.h>
@ -1256,27 +1260,6 @@ static void adj_geometry (void) {
Screen_rows = wz.ws_row; Screen_rows = wz.ws_row;
} }
#ifdef TTYGETENVYES
{ char *env_columns = getenv("COLUMNS"); // Unix98 environment vars
char *env_lines = getenv("LINES");
if (env_columns && *env_columns && env_lines && *env_lines) {
long t, tc = 0, tr = 0;
char *endptr;
t = strtol(env_columns, &endptr, 0);
if (!*endptr && (t > 0) && (t <= 0x7fffffffL)) tc = t;
t = strtol(env_lines, &endptr, 0);
if (!*endptr && (t > 0) && (t <= 0x7fffffffL)) tr = t;
// only allow environment vars override if both make sense...
if (0 < tc && 0 < tr) {
Screen_cols = (int)tc;
Screen_rows = (int)tr;
}
}
}
#endif
#ifndef RMAN_IGNORED #ifndef RMAN_IGNORED
// be crudely tolerant of crude tty emulators // be crudely tolerant of crude tty emulators
if (Cap_avoid_eol) Screen_cols--; if (Cap_avoid_eol) Screen_cols--;
@ -1284,9 +1267,33 @@ static void adj_geometry (void) {
// we might disappoint some folks (but they'll deserve it) // we might disappoint some folks (but they'll deserve it)
if (SCREENMAX < Screen_cols) Screen_cols = SCREENMAX; if (SCREENMAX < Screen_cols) Screen_cols = SCREENMAX;
#ifdef RESIZE_LIMIT
if (SCRCOLMIN > Screen_cols || SCRROWMIN > Screen_rows) error_exit("too tiny tty"); if (!w_set) {
#endif if (Width_mode > 0) // -w with arg, we'll try to honor
w_cols = Width_mode;
else
if (Width_mode < 0) { // -w without arg, try environment
char *env_columns = getenv("COLUMNS"),
*env_lines = getenv("LINES"),
*ep;
if (env_columns && *env_columns) {
long t, tc = 0;
t = strtol(env_columns, &ep, 0);
if (!*ep && (t > 0) && (t <= 0x7fffffffL)) tc = t;
if (0 < tc) w_cols = (int)tc;
}
if (env_lines && *env_lines) {
long t, tr = 0;
t = strtol(env_lines, &ep, 0);
if (!*ep && (t > 0) && (t <= 0x7fffffffL)) tr = t;
if (0 < tr) w_rows = (int)tr;
}
if (!w_cols) w_cols = SCREENMAX;
if (w_cols && w_cols < W_MIN_COL) w_cols = W_MIN_COL;
if (w_rows && w_rows < W_MIN_ROW) w_rows = W_MIN_ROW;
}
w_set = 1;
}
/* keep our support for output optimization in sync with current reality /* keep our support for output optimization in sync with current reality
note: when we're in Batch mode, we don't really need a Pseudo_screen note: when we're in Batch mode, we don't really need a Pseudo_screen
@ -1294,17 +1301,21 @@ static void adj_geometry (void) {
Msg_row is never represented -- but it's nice to have some space Msg_row is never represented -- but it's nice to have some space
between us and the great-beyond... */ between us and the great-beyond... */
if (Batch) { if (Batch) {
Screen_rows = MAXINT; if (w_cols) Screen_cols = w_cols;
Screen_rows = w_rows ? w_rows : MAXINT;
Pseudo_size = (sizeof(*Pseudo_screen) * ROWMAXSIZ); Pseudo_size = (sizeof(*Pseudo_screen) * ROWMAXSIZ);
} else } else {
if (w_cols && w_cols < Screen_cols) Screen_cols = w_cols;
if (w_rows && w_rows < Screen_rows) Screen_rows = w_rows;
Pseudo_size = (sizeof(*Pseudo_screen) * ROWMAXSIZ) * Screen_rows; Pseudo_size = (sizeof(*Pseudo_screen) * ROWMAXSIZ) * Screen_rows;
}
// we'll only grow our Pseudo_screen, never shrink it // we'll only grow our Pseudo_screen, never shrink it
if (pseudo_max < Pseudo_size) { if (pseudo_max < Pseudo_size) {
pseudo_max = Pseudo_size; pseudo_max = Pseudo_size;
Pseudo_screen = alloc_r(Pseudo_screen, pseudo_max); Pseudo_screen = alloc_r(Pseudo_screen, pseudo_max);
} }
PSU_CLREOS(0); PSU_CLREOS(0);
if (Frames_resize) putp(Cap_clr_scr);
} // end: adj_geometry } // end: adj_geometry
@ -1428,6 +1439,11 @@ static void calibrate_fields (void) {
#ifdef EQUCOLHDRYES #ifdef EQUCOLHDRYES
// prepare to even out column header lengths... // prepare to even out column header lengths...
if (hdrmax + w->hdrcaplen < (x = strlen(w->columnhdr))) hdrmax = x - w->hdrcaplen; if (hdrmax + w->hdrcaplen < (x = strlen(w->columnhdr))) hdrmax = x - w->hdrcaplen;
if (Screen_cols > x - w->hdrcaplen) w->eolcap = Caps_endline;
else w->eolcap = Caps_off;
#else
if (Screen_cols > strlen(w->columnhdr)) w->eolcap = Caps_endline;
else w->eolcap = Caps_off;
#endif #endif
// we must also accommodate an out of view sort field... // we must also accommodate an out of view sort field...
f = w->rc.sortindx; f = w->rc.sortindx;
@ -1480,59 +1496,81 @@ static void calibrate_fields (void) {
* Special highlighting will be accorded the "focus" field with such * Special highlighting will be accorded the "focus" field with such
* highlighting potentially extended to include the description. * highlighting potentially extended to include the description.
* *
* After all fields have been displayed, some extra explanatory * Below is the current Fieldstab space requirement and how
* text may also be output */ * we apportion it. The xSUFX is considered sacrificial,
static void display_fields (int focus, int extend, const char *xtra) { * something we can reduce or do without.
* 0 1 2 3
* 12345678901234567890123456789012
* * HEADING = Longest Description!
* xPRFX ----------______________________ xSUFX
* ( xPRFX has pos 2 & 10 for 'extending' when at minimums )
*
* The first 4 screen rows are reserved for explanatory text.
* Thus, with our current 36 fields, a maximum of 6 columns and
* 1 space between columns, a tty will still remain useable under
* these extremes:
* rows cols displayed
* ---- ---- ------------------
* 10 66 xPRFX only
* 10 198 full xPRFX + xSUFX
* 22 22 xPRFX only
* 22 66 full xPRFX + xSUFX
* ( if not, the user deserves our most cryptic messages )
*/
static void display_fields (int focus, int extend) {
#define mxCOL 6
#define yRSVD 4 #define yRSVD 4
#define xSUFX 22
#define xPRFX (10 + xadd)
#define xTOTL (xPRFX + xSUFX)
WIN_t *w = Curwin; // avoid gcc bloat with a local copy WIN_t *w = Curwin; // avoid gcc bloat with a local copy
const char *p; int i; // utility int (a row, tot cols, ix)
#ifdef FIELD_CURSOR int smax; // printable width of xSUFX
int savcol = 0, savrow = 0; // make gcc happy (with initialization) int xadd = 0; // spacing between data columns
#endif int cmax = Screen_cols; // total data column width
int i,cmax, rmax; int rmax = Screen_rows - yRSVD; // total useable rows
fflush(stdout); fflush(stdout);
cmax = Screen_cols / 2; i = (P_MAXPFLGS % mxCOL) ? 1 : 0;
rmax = Screen_rows - yRSVD; if (rmax < i + (P_MAXPFLGS / mxCOL)) error_exit("++rows");
i = P_MAXPFLGS / rmax;
if (P_MAXPFLGS % rmax) ++i;
if (i > 1) { cmax = Screen_cols / i; xadd = 1; }
if (cmax > xTOTL) cmax = xTOTL;
smax = cmax - xPRFX;
if (smax < 0) error_exit("++cols");
for (i = 0; i < P_MAXPFLGS; ++i) { for (i = 0; i < P_MAXPFLGS; ++i) {
FLG_t f = FLDget(w, i); char sbuf[xSUFX+1];
int b = FLDviz(w, i); int b = FLDviz(w, i);
FLG_t f = FLDget(w, i);
const char *h, *e = (i == focus && extend) ? w->capclr_msg : "";
// advance past leading spaces, if any // advance past leading header spaces and prep sacrificial suffix
for (p = Fieldstab[f].head; ' ' == *p; ++p) ; for (h = Fieldstab[f].head; ' ' == *h; ++h) ;
PUTT("%s%c %s%s%-10.10s%s%s%s = %-20.20s%s" snprintf(sbuf, sizeof(sbuf), "= %s", Fieldstab[f].desc);
PUTT("%s%c%s%s %s%-7.7s%s%s%s %-*.*s%s"
, tg2((i / rmax) * cmax, (i % rmax) + yRSVD) , tg2((i / rmax) * cmax, (i % rmax) + yRSVD)
, b ? '*' : ' ' , b ? '*' : ' '
, b ? w->cap_bold : Cap_norm , b ? w->cap_bold : Cap_norm
, e
, i == focus ? w->capclr_msg : "" , i == focus ? w->capclr_msg : ""
, p , h
, Cap_norm , Cap_norm
, b ? w->cap_bold : "" , b ? w->cap_bold : ""
, (i == focus && extend) ? w->capclr_msg : "" , e
, Fieldstab[f].desc , smax, smax
, sbuf
, Cap_norm); , Cap_norm);
#ifdef FIELD_CURSOR
if (i == focus) { savcol = (i / rmax) * cmax; savrow = (i % rmax) + yRSVD; }
#endif
}
if (xtra) {
putp(w->capclr_rownorm);
while ((p = strchr(xtra, '\n'))) {
++i;
PUTT("%s%.*s"
, tg2((i / rmax) * cmax, (i % rmax) + yRSVD)
, (int)(p - xtra)
, xtra);
xtra = ++p;
}
} }
#ifdef FIELD_CURSOR
putp(tg2(savcol+1, savrow));
#endif
putp(Caps_off); putp(Caps_off);
#undef mxCOL
#undef yRSVD #undef yRSVD
#undef xSUFX
#undef xPRFX
#undef xTOTL
} // end: display_fields } // end: display_fields
@ -1552,23 +1590,15 @@ static void fields_utility (void) {
FLG_t f; FLG_t f;
putp(Cap_clr_scr); putp(Cap_clr_scr);
#ifdef FIELD_CURSOR
putp(Cap_curs_huge);
#else
putp(Cap_curs_hide);
#endif
spewFI spewFI
do { do {
// advance past leading spaces, if any // advance past leading spaces, if any
if (!h) for (h = Fieldstab[f].head; ' ' == *h; ++h) ; if (!h) for (h = Fieldstab[f].head; ' ' == *h; ++h) ;
#ifdef FIELD_CURSOR display_fields(i, (p != NULL));
show_special(1, fmtmk(FIELDS_heading, Cap_home, w->grpname, h)); putp(Cap_home);
display_fields(i, (p != NULL), FIELDS_notes); show_special(1, fmtmk(FIELDS_heading, w->grpname, h));
#else
display_fields(i, (p != NULL), FIELDS_notes);
show_special(1, fmtmk(FIELDS_heading, Cap_home, w->grpname, h));
#endif
switch (key = keyin(0)) { switch (key = keyin(0)) {
case kbd_UP: case kbd_UP:
if (i > 0) { --i; if (p) swapEM } if (i > 0) { --i; if (p) swapEM }
@ -1609,7 +1639,6 @@ static void fields_utility (void) {
break; break;
} }
} while (key && 'q' != key && kbd_ESC != key); } while (key && 'q' != key && kbd_ESC != key);
putp(Cap_curs_norm);
#undef unSCRL #undef unSCRL
#undef swapEM #undef swapEM
#undef spewFI #undef spewFI
@ -2072,7 +2101,7 @@ static void configs_read (void) {
, Winstk[i].rc.winname, Winstk[i].rc.fieldscur); , Winstk[i].rc.winname, Winstk[i].rc.fieldscur);
#if PFLAGSSIZ > 64 #if PFLAGSSIZ > 64
// too bad fscanf is not as flexible with his format string as snprintf // too bad fscanf is not as flexible with his format string as snprintf
# error "Hey, fix the above fscanf 'PFLAGSSIZ' dependency !" # error Hey, fix the above fscanf 'PFLAGSSIZ' dependency !
#endif #endif
if (strlen(Winstk[i].rc.fieldscur) != sizeof(DEF_FIELDS) - 1) if (strlen(Winstk[i].rc.fieldscur) != sizeof(DEF_FIELDS) - 1)
#ifndef RCFILE_NOERR #ifndef RCFILE_NOERR
@ -2131,7 +2160,7 @@ static void parse_args (char **args) {
. bunched args are actually handled properly and none are ignored . bunched args are actually handled properly and none are ignored
. we tolerate NO whitespace and NO switches -- maybe too tolerant? */ . we tolerate NO whitespace and NO switches -- maybe too tolerant? */
static const char usage_str[] = static const char usage_str[] =
" -hv | -bcHisS -d delay -n iterations -u|U user | -p pid [,pid ...]"; " -hv | -bcHiSs -d delay -n iters -u|U user | -p pid[,pid] -w [cols]";
static const char sel_error[] = "conflicting process selections (U/p/u)"; static const char sel_error[] = "conflicting process selections (U/p/u)";
static const char numbs_str[] = "+,-.0123456789"; static const char numbs_str[] = "+,-.0123456789";
float tmp_delay = MAXFLOAT; float tmp_delay = MAXFLOAT;
@ -2217,8 +2246,23 @@ static void parse_args (char **args) {
else error_exit(fmtmk("-%c missing name", ch)); else error_exit(fmtmk("-%c missing name", ch));
if ((errmsg = user_certify(Curwin, cp, ch))) error_exit(errmsg); if ((errmsg = user_certify(Curwin, cp, ch))) error_exit(errmsg);
cp += strlen(cp); cp += strlen(cp);
}
break; break;
}
case 'w':
{ char *pn = NULL;
int ai = 0, ci = 0;
Width_mode = -1;
if (cp[1]) pn = (char*)&cp[1];
else if (*args) { pn = *args; ai = 1; }
if (pn && !(ci = strspn(pn, "0123456789"))) { ai = 0; pn = NULL; }
if (pn && (1 != sscanf(pn, "%d", &Width_mode)
|| Width_mode < W_MIN_COL))
error_exit(fmtmk("bad width arg '%s', must > %d", pn, W_MIN_COL-1));
cp++;
args += ai;
if (pn) cp = pn + ci;
continue;
}
default : default :
error_exit(fmtmk("unknown option '%c'\nusage:\t%s%s", *cp, Myname, usage_str)); error_exit(fmtmk("unknown option '%c'\nusage:\t%s%s", *cp, Myname, usage_str));
@ -2529,6 +2573,8 @@ static void wins_stage_2 (void) {
win_names(&Winstk[i], Winstk[i].rc.winname); win_names(&Winstk[i], Winstk[i].rc.winname);
capsmk(&Winstk[i]); capsmk(&Winstk[i]);
} }
if (Batch)
OFFw(Curwin, View_SCROLL);
// this guy will build each window's columnhdr // this guy will build each window's columnhdr
calibrate_fields(); calibrate_fields();
} // end: wins_stage_2 } // end: wins_stage_2
@ -3315,7 +3361,7 @@ static void task_show (const WIN_t *q, const proc_t *p) {
PUFF("\n%s%s%s", (CHKw(q, Show_HIROWS) && 'R' == p->state) PUFF("\n%s%s%s", (CHKw(q, Show_HIROWS) && 'R' == p->state)
? q->capclr_rowhigh : q->capclr_rownorm ? q->capclr_rowhigh : q->capclr_rownorm
, rbuf , rbuf
, Caps_endline); , q->eolcap);
#undef makeCOL #undef makeCOL
#undef makeVAR #undef makeVAR
#undef pages2K #undef pages2K
@ -3334,7 +3380,7 @@ static int window_show (proc_t **ppt, WIN_t *q, int wmax) {
int i, lwin; int i, lwin;
// Display Column Headings -- and distract 'em while we sort (maybe) // Display Column Headings -- and distract 'em while we sort (maybe)
PUFF("\n%s%s%s", q->capclr_hdr, q->columnhdr, Caps_endline); PUFF("\n%s%s%s", q->capclr_hdr, q->columnhdr, q->eolcap);
if (CHKw(q, Qsrt_NORMAL)) Frame_srtflg = 1; // this one's always needed! if (CHKw(q, Qsrt_NORMAL)) Frame_srtflg = 1; // this one's always needed!
else Frame_srtflg = -1; else Frame_srtflg = -1;

56
top.h
View File

@ -25,7 +25,6 @@
//#define CASEUP_HEXES /* show any hex values in upper case */ //#define CASEUP_HEXES /* show any hex values in upper case */
//#define CASEUP_SUFIX /* show time/mem/cnts suffix in upper case */ //#define CASEUP_SUFIX /* show time/mem/cnts suffix in upper case */
//#define EQUCOLHDRYES /* yes, do equalize column header lengths */ //#define EQUCOLHDRYES /* yes, do equalize column header lengths */
//#define FIELD_CURSOR /* cursor follows selection w/ fields mgmt */
//#define OFF_HST_HASH /* use BOTH qsort+bsrch vs. hashing scheme */ //#define OFF_HST_HASH /* use BOTH qsort+bsrch vs. hashing scheme */
//#define OFF_STDIOLBF /* disable our own stdout _IOFBF override */ //#define OFF_STDIOLBF /* disable our own stdout _IOFBF override */
//#define OOMEM_ENABLE /* enable the SuSE out-of-memory additions * //#define OOMEM_ENABLE /* enable the SuSE out-of-memory additions *
@ -33,11 +32,9 @@
//#define PRETEND4CPUS /* pretend we're smp with 4 ticsers (sic) */ //#define PRETEND4CPUS /* pretend we're smp with 4 ticsers (sic) */
//#define PRETENDNOCAP /* use a terminal without essential caps */ //#define PRETENDNOCAP /* use a terminal without essential caps */
//#define RCFILE_NOERR /* rcfile errs silently default, vs. fatal */ //#define RCFILE_NOERR /* rcfile errs silently default, vs. fatal */
//#define RESIZE_LIMIT /* enable limits on lower sigwinch bounds */
//#define RMAN_IGNORED /* don't consider auto right margin glitch */ //#define RMAN_IGNORED /* don't consider auto right margin glitch */
//#define STRCMPNOCASE /* use strcasecmp vs. strcmp when sorting */ //#define STRCMPNOCASE /* use strcasecmp vs. strcmp when sorting */
//#define TERMIOS_ONLY /* just limp along with native input only */ //#define TERMIOS_ONLY /* just limp along with native input only */
//#define TTYGETENVYES /* environ vars can override tty col/row */
//#define USE_X_COLHDR /* emphasize header vs. whole col, for 'x' */ //#define USE_X_COLHDR /* emphasize header vs. whole col, for 'x' */
@ -86,12 +83,12 @@
/* Specific process id monitoring support (command line only) */ /* Specific process id monitoring support (command line only) */
#define MONPIDMAX 20 #define MONPIDMAX 20
/* Output override minimums (the -w switch and/or env vars) */
#define W_MIN_COL 3
#define W_MIN_ROW 3
/* Miscellaneous buffers with liberal values and some other defines /* Miscellaneous buffers with liberal values and some other defines
-- mostly just to pinpoint source code usage/dependancies */ -- mostly just to pinpoint source code usage/dependancies */
#ifdef RESIZE_LIMIT
#define SCRCOLMIN 16
#define SCRROWMIN 8
#endif
#define SCREENMAX 512 #define SCREENMAX 512
/* the above might seem pretty stingy, until you consider that with every /* the above might seem pretty stingy, until you consider that with every
one of top's fields displayed it's less than 200 bytes of column header one of top's fields displayed it's less than 200 bytes of column header
@ -314,6 +311,7 @@ typedef struct WIN_t {
#else #else
columnhdr [SCREENMAX], // column headings for procflgs columnhdr [SCREENMAX], // column headings for procflgs
#endif #endif
*eolcap, // window specific eol termcap
*captab [CAPTABMAX]; // captab needed by show_special() *captab [CAPTABMAX]; // captab needed by show_special()
struct WIN_t *next, // next window in window stack struct WIN_t *next, // next window in window stack
*prev; // prior window in window stack *prev; // prior window in window stack
@ -528,48 +526,11 @@ typedef struct WIN_t {
/* Fields Management specially formatted string(s) -- /* Fields Management specially formatted string(s) --
see 'show_special' for syntax details + other cautions */ see 'show_special' for syntax details + other cautions */
#define FIELDS_heading \ #define FIELDS_heading \
"%sFields Management\02 for window \01%s\06, whose current sort field is \01%s\02\n" \ "Fields Management\02 for window \01%s\06, whose current sort field is \01%s\02\n" \
" Navigate with Up/Dn, Right selects for move then <Enter> or Left commits,\n" \ " Navigate with Up/Dn, Right selects for move then <Enter> or Left commits,\n" \
" 'd' or <Space> toggles display, 's' sets sort. Use 'q' or <Esc> to end! " \ " 'd' or <Space> toggles display, 's' sets sort. Use 'q' or <Esc> to end! " \
"" ""
#ifdef OOMEM_ENABLE
/* w/ 2 extra lines, no room for additional text on 24x80 terminal */
#define FIELDS_notes NULL
#else
/* Extra explanatory text which could accompany the Fields display.
note: the newlines cannot actually be used, they just serve as
substring delimiters for the 'display_fields' routine. */
#define FIELDS_notes \
"Note(s):\n" \
" Use the 'a' & 'w' keys to cycle\n" \
" through all available windows.\n" \
""
/* no room in FIELDS_notes, sacrificed w/ 35 fields displayed .... */
/* " If a sort field is not displayed,\n" */
/* " the '<' & '>' keys are inactive.\n" */
#endif
#define FIELDS_flags \
"Flags field:\n" \
" 0x00000001 PF_ALIGNWARN\n" \
" 0x00000002 PF_STARTING\n" \
" 0x00000004 PF_EXITING\n" \
" 0x00000040 PF_FORKNOEXEC\n" \
" 0x00000100 PF_SUPERPRIV\n" \
" 0x00000200 PF_DUMPCORE\n" \
" 0x00000400 PF_SIGNALED\n" \
" 0x00000800 PF_MEMALLOC\n" \
" 0x00002000 PF_FREE_PAGES (2.5)\n" \
" 0x00008000 debug flag (2.5)\n" \
" 0x00024000 special threads (2.5)\n" \
" 0x001D0000 special states (2.5)\n" \
" 0x00100000 PF_USEDFPU (thru 2.4)\n" \
""
/* no room in FIELDS_flags, sacrificed w/ 26 fields displayed .... */
/* ( PF_MEMDIE == 'Killed for out-of-memory' ) */
/* " 0x00001000 PF_MEMDIE (2.5)\n" */
/* Colors Help specially formatted string(s) -- /* Colors Help specially formatted string(s) --
see 'show_special' for syntax details + other cautions. */ see 'show_special' for syntax details + other cautions. */
#define COLOR_help \ #define COLOR_help \
@ -638,6 +599,9 @@ typedef struct WIN_t {
#if defined(PRETEND4CPUS) && defined (OOMEM_ENABLE) #if defined(PRETEND4CPUS) && defined (OOMEM_ENABLE)
# error 'PRETEND4CPUS' conflicts with 'OOMEM_ENABLE' # error 'PRETEND4CPUS' conflicts with 'OOMEM_ENABLE'
#endif #endif
#if (LRGBUFSIZ < SCREENMAX)
# error 'LRGBUFSIZ' must NOT be less than 'SCREENMAX'
#endif
/*###### Some Prototypes (ha!) #########################################*/ /*###### Some Prototypes (ha!) #########################################*/
@ -682,7 +646,7 @@ typedef struct WIN_t {
/*atic FLD_t Fieldstab[] = { ... } */ /*atic FLD_t Fieldstab[] = { ... } */
//atic void adj_geometry (void); //atic void adj_geometry (void);
//atic void calibrate_fields (void); //atic void calibrate_fields (void);
//atic void display_fields (int focus, int extend, const char *xtra); //atic void display_fields (int focus, int extend);
//atic void fields_utility (void); //atic void fields_utility (void);
//atic void zap_fieldstab (void); //atic void zap_fieldstab (void);
/*------ Library Interface ---------------------------------------------*/ /*------ Library Interface ---------------------------------------------*/