diff options
Diffstat (limited to 'usr.bin/top/screen.c')
-rw-r--r-- | usr.bin/top/screen.c | 465 |
1 files changed, 207 insertions, 258 deletions
diff --git a/usr.bin/top/screen.c b/usr.bin/top/screen.c index c1f33f09d4f..027896e98d9 100644 --- a/usr.bin/top/screen.c +++ b/usr.bin/top/screen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: screen.c,v 1.9 2003/06/12 22:30:23 pvalchev Exp $ */ +/* $OpenBSD: screen.c,v 1.10 2003/06/12 23:09:30 deraadt Exp $ */ /* * Top users/processes display for Unix @@ -28,13 +28,14 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* This file contains the routines that interface to termcap and stty/gtty. - * - * Paul Vixie, February 1987: converted to use ioctl() instead of stty/gtty. - * - * I put in code to turn on the TOSTOP bit while top was running, but I - * didn't really like the results. If you desire it, turn on the - * preprocessor variable "TOStop". --wnl +/* + * This file contains the routines that interface to termcap and stty/gtty. + * + * Paul Vixie, February 1987: converted to use ioctl() instead of stty/gtty. + * + * I put in code to turn on the TOSTOP bit while top was running, but I didn't + * really like the results. If you desire it, turn on the preprocessor + * variable "TOStop". --wnl */ #include <sys/types.h> @@ -50,313 +51,261 @@ #include "screen.h" #include "boolean.h" -extern char *myname; - -int overstrike; -int screen_length; -int screen_width; -char ch_erase; -char ch_kill; -char smart_terminal; -char PC; -char string_buffer[1024]; -char home[15]; -char lower_left[15]; -char *clear_line; -char *clear_scr; -char *clear_to_end; -char *cursor_motion; -char *start_standout; -char *end_standout; -char *terminal_init; -char *terminal_end; -short ospeed; +extern char *myname; + +int overstrike; +int screen_length; +int screen_width; +char ch_erase; +char ch_kill; +char smart_terminal; +char PC; +char string_buffer[1024]; +char home[15]; +char lower_left[15]; +char *clear_line; +char *clear_scr; +char *clear_to_end; +char *cursor_motion; +char *start_standout; +char *end_standout; +char *terminal_init; +char *terminal_end; +short ospeed; static struct termios old_settings; static struct termios new_settings; -static char is_a_terminal = No; +static char is_a_terminal = No; void init_termcap(int interactive) { - char *bufptr; - char *PCptr; - char *term_name; - int status; - - /* set defaults in case we aren't smart */ - screen_width = MAX_COLS; - screen_length = 0; - - if (!interactive) - { - /* pretend we have a dumb terminal */ - smart_terminal = No; - return; - } - - /* assume we have a smart terminal until proven otherwise */ - smart_terminal = Yes; - - /* get the terminal name */ - term_name = getenv("TERM"); - - /* if there is no TERM, assume it's a dumb terminal */ - /* patch courtesy of Sam Horrocks at telegraph.ics.uci.edu */ - if (term_name == NULL) - { - smart_terminal = No; - return; - } - - /* now get the termcap entry */ - if ((status = tgetent(NULL, term_name)) != 1) - { - if (status == -1) - { - fprintf(stderr, "%s: can't open termcap file\n", myname); + char *bufptr, *PCptr, *term_name; + int status; + + /* set defaults in case we aren't smart */ + screen_width = MAX_COLS; + screen_length = 0; + + if (!interactive) { + /* pretend we have a dumb terminal */ + smart_terminal = No; + return; } - else - { - fprintf(stderr, "%s: no termcap entry for a `%s' terminal\n", - myname, term_name); + /* assume we have a smart terminal until proven otherwise */ + smart_terminal = Yes; + + /* get the terminal name */ + term_name = getenv("TERM"); + + /* if there is no TERM, assume it's a dumb terminal */ + /* patch courtesy of Sam Horrocks at telegraph.ics.uci.edu */ + if (term_name == NULL) { + smart_terminal = No; + return; } - /* pretend it's dumb and proceed */ - smart_terminal = No; - return; - } - - /* "hardcopy" immediately indicates a very stupid terminal */ - if (tgetflag("hc")) - { - smart_terminal = No; - return; - } - - /* set up common terminal capabilities */ - if ((screen_length = tgetnum("li")) <= Header_lines) - { - screen_length = smart_terminal = 0; - return; - } - - /* screen_width is a little different */ - if ((screen_width = tgetnum("co")) == -1) - { - screen_width = 79; - } - else - { - screen_width -= 1; - } - - /* terminals that overstrike need special attention */ - overstrike = tgetflag("os"); - - /* initialize the pointer into the termcap string buffer */ - bufptr = string_buffer; - - /* get "ce", clear to end */ - if (!overstrike) - { - clear_line = tgetstr("ce", &bufptr); - } - - /* get necessary capabilities */ - if ((clear_scr = tgetstr("cl", &bufptr)) == NULL || - (cursor_motion = tgetstr("cm", &bufptr)) == NULL) - { - smart_terminal = No; - return; - } - - /* get some more sophisticated stuff -- these are optional */ - clear_to_end = tgetstr("cd", &bufptr); - terminal_init = tgetstr("ti", &bufptr); - terminal_end = tgetstr("te", &bufptr); - start_standout = tgetstr("so", &bufptr); - end_standout = tgetstr("se", &bufptr); - - /* pad character */ - PC = (PCptr = tgetstr("pc", &bufptr)) ? *PCptr : 0; - - /* set convenience strings */ - (void) strncpy(home, tgoto(cursor_motion, 0, 0), sizeof (home) -1); - home[sizeof (home) -1] = 0; - /* (lower_left is set in get_screensize) */ - - /* get the actual screen size with an ioctl, if needed */ - /* This may change screen_width and screen_length, and it always - sets lower_left. */ - get_screensize(); - - /* if stdout is not a terminal, pretend we are a dumb terminal */ - if (tcgetattr(STDOUT_FILENO, &old_settings) == -1) - { - smart_terminal = No; - } + /* now get the termcap entry */ + if ((status = tgetent(NULL, term_name)) != 1) { + if (status == -1) + fprintf(stderr, "%s: can't open termcap file\n", myname); + else + fprintf(stderr, "%s: no termcap entry for a `%s' terminal\n", + myname, term_name); + + /* pretend it's dumb and proceed */ + smart_terminal = No; + return; + } + + /* "hardcopy" immediately indicates a very stupid terminal */ + if (tgetflag("hc")) { + smart_terminal = No; + return; + } + /* set up common terminal capabilities */ + if ((screen_length = tgetnum("li")) <= Header_lines) { + screen_length = smart_terminal = 0; + return; + } + + /* screen_width is a little different */ + if ((screen_width = tgetnum("co")) == -1) + screen_width = 79; + else + screen_width -= 1; + + /* terminals that overstrike need special attention */ + overstrike = tgetflag("os"); + + /* initialize the pointer into the termcap string buffer */ + bufptr = string_buffer; + + /* get "ce", clear to end */ + if (!overstrike) { + clear_line = tgetstr("ce", &bufptr); + } + /* get necessary capabilities */ + if ((clear_scr = tgetstr("cl", &bufptr)) == NULL || + (cursor_motion = tgetstr("cm", &bufptr)) == NULL) { + smart_terminal = No; + return; + } + /* get some more sophisticated stuff -- these are optional */ + clear_to_end = tgetstr("cd", &bufptr); + terminal_init = tgetstr("ti", &bufptr); + terminal_end = tgetstr("te", &bufptr); + start_standout = tgetstr("so", &bufptr); + end_standout = tgetstr("se", &bufptr); + + /* pad character */ + PC = (PCptr = tgetstr("pc", &bufptr)) ? *PCptr : 0; + + /* set convenience strings */ + (void) strlcpy(home, tgoto(cursor_motion, 0, 0), sizeof(home)); + /* (lower_left is set in get_screensize) */ + + /* get the actual screen size with an ioctl, if needed */ + /* + * This may change screen_width and screen_length, and it always sets + * lower_left. + */ + get_screensize(); + + /* if stdout is not a terminal, pretend we are a dumb terminal */ + if (tcgetattr(STDOUT_FILENO, &old_settings) == -1) + smart_terminal = No; } void init_screen(void) { - /* get the old settings for safe keeping */ - if (tcgetattr(STDOUT_FILENO, &old_settings) != -1) - { - /* copy the settings so we can modify them */ - new_settings = old_settings; - - /* turn off ICANON, character echo and tab expansion */ - new_settings.c_lflag &= ~(ICANON|ECHO); - new_settings.c_oflag &= ~(OXTABS); - new_settings.c_cc[VMIN] = 1; - new_settings.c_cc[VTIME] = 0; - (void) tcsetattr(STDOUT_FILENO, TCSADRAIN, &new_settings); - - /* remember the erase and kill characters */ - ch_erase = old_settings.c_cc[VERASE]; - ch_kill = old_settings.c_cc[VKILL]; - - /* remember that it really is a terminal */ - is_a_terminal = Yes; - - /* send the termcap initialization string */ - putcap(terminal_init); - } - - if (!is_a_terminal) - { - /* not a terminal at all---consider it dumb */ - smart_terminal = No; - } + /* get the old settings for safe keeping */ + if (tcgetattr(STDOUT_FILENO, &old_settings) != -1) { + /* copy the settings so we can modify them */ + new_settings = old_settings; + + /* turn off ICANON, character echo and tab expansion */ + new_settings.c_lflag &= ~(ICANON | ECHO); + new_settings.c_oflag &= ~(OXTABS); + new_settings.c_cc[VMIN] = 1; + new_settings.c_cc[VTIME] = 0; + (void) tcsetattr(STDOUT_FILENO, TCSADRAIN, &new_settings); + + /* remember the erase and kill characters */ + ch_erase = old_settings.c_cc[VERASE]; + ch_kill = old_settings.c_cc[VKILL]; + + /* remember that it really is a terminal */ + is_a_terminal = Yes; + + /* send the termcap initialization string */ + putcap(terminal_init); + } + if (!is_a_terminal) { + /* not a terminal at all---consider it dumb */ + smart_terminal = No; + } } void end_screen(void) { - /* move to the lower left, clear the line and send "te" */ - if (smart_terminal) - { - putcap(lower_left); - putcap(clear_line); - fflush(stdout); - putcap(terminal_end); - } - - /* if we have settings to reset, then do so */ - if (is_a_terminal) - { - (void) tcsetattr(STDOUT_FILENO, TCSADRAIN, &old_settings); - } + /* move to the lower left, clear the line and send "te" */ + if (smart_terminal) { + putcap(lower_left); + putcap(clear_line); + fflush(stdout); + putcap(terminal_end); + } + + /* if we have settings to reset, then do so */ + if (is_a_terminal) + (void) tcsetattr(STDOUT_FILENO, TCSADRAIN, &old_settings); } void reinit_screen(void) { - /* install our settings if it is a terminal */ - if (is_a_terminal) - { - (void) tcsetattr(STDOUT_FILENO, TCSADRAIN, &new_settings); - } - - /* send init string */ - if (smart_terminal) - { - putcap(terminal_init); - } + /* install our settings if it is a terminal */ + if (is_a_terminal) + (void) tcsetattr(STDOUT_FILENO, TCSADRAIN, &new_settings); + + /* send init string */ + if (smart_terminal) + putcap(terminal_init); } void get_screensize(void) { - struct winsize ws; + struct winsize ws; - if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &ws) != -1) - { - if (ws.ws_row != 0) - { - screen_length = ws.ws_row; + if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1) { + if (ws.ws_row != 0) + screen_length = ws.ws_row; + if (ws.ws_col != 0) + screen_width = ws.ws_col - 1; } - if (ws.ws_col != 0) - { - screen_width = ws.ws_col - 1; - } - } - - (void) strncpy(lower_left, tgoto(cursor_motion, 0, screen_length - 1), - sizeof (lower_left) -1); - lower_left[sizeof(lower_left) -1] = 0; + (void) strlcpy(lower_left, tgoto(cursor_motion, 0, screen_length - 1), + sizeof(lower_left)); } void standout(char *msg) { - if (smart_terminal) - { - putcap(start_standout); - if (fputs(msg, stdout) == EOF) - exit(1); - putcap(end_standout); - } - else - { - if (fputs(msg, stdout) == EOF) - exit(1); - } + if (smart_terminal) { + putcap(start_standout); + if (fputs(msg, stdout) == EOF) + exit(1); + putcap(end_standout); + } else { + if (fputs(msg, stdout) == EOF) + exit(1); + } } -void clear() - +void +clear() { - if (smart_terminal) - { - putcap(clear_scr); - } + if (smart_terminal) + putcap(clear_scr); } int clear_eol(int len) { - if (smart_terminal && !overstrike && len > 0) - { - if (clear_line) - { - putcap(clear_line); - return(0); + if (smart_terminal && !overstrike && len > 0) { + if (clear_line) { + putcap(clear_line); + return (0); + } else { + while (len-- > 0) { + if (putchar(' ') == EOF) + exit(1); + } + return (1); + } } - else - { - while (len-- > 0) - { - if (putchar(' ') == EOF) - exit(1); - } - return(1); - } - } - return(-1); + return (-1); } void go_home(void) { - if (smart_terminal) - { - putcap(home); - } + if (smart_terminal) + putcap(home); } /* This has to be defined as a subroutine for tputs (instead of a macro) */ - int putstdout(int ch) { - int ret; + int ret; - ret = putchar(ch); - if (ret == EOF) - exit(1); - return (ret); + ret = putchar(ch); + if (ret == EOF) + exit(1); + return (ret); } |