⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display.c

📁 在Linux/UNIX下
💻 C
📖 第 1 页 / 共 2 页
字号:
    }    else if (msglen > 0)    {	(void) clear_eol(msglen);	msglen = 0;    }}u_message(){    i_message();}static int header_length;/* *  *_header(text) - print the header for the process area * *  Assumptions:  cursor is on the previous line and lastline is consistent */i_header(text)char *text;{    header_length = strlen(text);    if (header_status == ON)    {	putchar('\n');	fputs(text, stdout);	lastline++;    }    else if (header_status == ERASE)    {	header_status = OFF;    }}/*ARGSUSED*/u_header(text)char *text;		/* ignored */{    if (header_status == ERASE)    {	putchar('\n');	lastline++;	clear_eol(header_length);	header_status = OFF;    }}/* *  *_process(line, thisline) - print one process line * *  Assumptions:  lastline is consistent */i_process(line, thisline)int line;char *thisline;{    register char *p;    register char *base;    /* make sure we are on the correct line */    while (lastline < y_procs + line)    {	putchar('\n');	lastline++;    }    /* truncate the line to conform to our current screen width */    thisline[display_width] = '\0';    /* write the line out */    fputs(thisline, stdout);    /* copy it in to our buffer */    base = smart_terminal ? screenbuf + lineindex(line) : screenbuf;    p = strecpy(base, thisline);    /* zero fill the rest of it */    memzero(p, display_width - (p - base));}u_process(line, newline)int line;char *newline;{    register char *optr;    register int screen_line = line + Header_lines;    register char *bufferline;    /* remember a pointer to the current line in the screen buffer */    bufferline = &screenbuf[lineindex(line)];    /* truncate the line to conform to our current screen width */    newline[display_width] = '\0';    /* is line higher than we went on the last display? */    if (line >= last_hi)    {	/* yes, just ignore screenbuf and write it out directly */	/* get positioned on the correct line */	if (screen_line - lastline == 1)	{	    putchar('\n');	    lastline++;	}	else	{	    Move_to(0, screen_line);	    lastline = screen_line;	}	/* now write the line */	fputs(newline, stdout);	/* copy it in to the buffer */	optr = strecpy(bufferline, newline);	/* zero fill the rest of it */	memzero(optr, display_width - (optr - bufferline));    }    else    {	line_update(bufferline, newline, 0, line + Header_lines);    }}u_endscreen(hi)register int hi;{    register int screen_line = hi + Header_lines;    register int i;    if (smart_terminal)    {	if (hi < last_hi)	{	    /* need to blank the remainder of the screen */	    /* but only if there is any screen left below this line */	    if (lastline + 1 < screen_length)	    {		/* efficiently move to the end of currently displayed info */		if (screen_line - lastline < 5)		{		    while (lastline < screen_line)		    {			putchar('\n');			lastline++;		    }		}		else		{		    Move_to(0, screen_line);		    lastline = screen_line;		}		if (clear_to_end)		{		    /* we can do this the easy way */		    putcap(clear_to_end);		}		else		{		    /* use clear_eol on each line */		    i = hi;		    while ((void) clear_eol(strlen(&screenbuf[lineindex(i++)])), i < last_hi)		    {			putchar('\n');		    }		}	    }	}	last_hi = hi;	/* move the cursor to a pleasant place */	Move_to(x_idlecursor, y_idlecursor);	lastline = y_idlecursor;    }    else    {	/* separate this display from the next with some vertical room */	fputs("\n\n", stdout);    }}display_header(t)int t;{    if (t)    {	header_status = ON;    }    else if (header_status == ON)    {	header_status = ERASE;    }}/*VARARGS2*/new_message(type, msgfmt, a1, a2, a3)int type;char *msgfmt;caddr_t a1, a2, a3;{    register int i;    /* first, format the message */    (void) sprintf(next_msg, msgfmt, a1, a2, a3);    if (msglen > 0)    {	/* message there already -- can we clear it? */	if (!overstrike)	{	    /* yes -- write it and clear to end */	    i = strlen(next_msg);	    if ((type & MT_delayed) == 0)	    {		type & MT_standout ? standout(next_msg) :		                     fputs(next_msg, stdout);		(void) clear_eol(msglen - i);		msglen = i;		next_msg[0] = '\0';	    }	}    }    else    {	if ((type & MT_delayed) == 0)	{	    type & MT_standout ? standout(next_msg) : fputs(next_msg, stdout);	    msglen = strlen(next_msg);	    next_msg[0] = '\0';	}    }}clear_message(){    if (clear_eol(msglen) == 1)    {	putchar('\r');    }}readline(buffer, size, numeric)char *buffer;int  size;int  numeric;{    register char *ptr = buffer;    register char ch;    register char cnt = 0;    register char maxcnt = 0;    /* allow room for null terminator */    size -= 1;    /* read loop */    while ((fflush(stdout), read(0, ptr, 1) > 0))    {	/* newline means we are done */	if ((ch = *ptr) == '\n')	{	    break;	}	/* handle special editing characters */	if (ch == ch_kill)	{	    /* kill line -- account for overstriking */	    if (overstrike)	    {		msglen += maxcnt;	    }	    /* return null string */	    *buffer = '\0';	    putchar('\r');	    return(-1);	}	else if (ch == ch_erase)	{	    /* erase previous character */	    if (cnt <= 0)	    {		/* none to erase! */		putchar('\7');	    }	    else	    {		fputs("\b \b", stdout);		ptr--;		cnt--;	    }	}	/* check for character validity and buffer overflow */	else if (cnt == size || (numeric && !isdigit(ch)) ||		!isprint(ch))	{	    /* not legal */	    putchar('\7');	}	else	{	    /* echo it and store it in the buffer */	    putchar(ch);	    ptr++;	    cnt++;	    if (cnt > maxcnt)	    {		maxcnt = cnt;	    }	}    }    /* all done -- null terminate the string */    *ptr = '\0';    /* account for the extra characters in the message area */    /* (if terminal overstrikes, remember the furthest they went) */    msglen += overstrike ? maxcnt : cnt;    /* return either inputted number or string length */    putchar('\r');    return(cnt == 0 ? -1 : numeric ? atoi(buffer) : cnt);}/* internal support routines */static int string_count(pp)register char **pp;{    register int cnt;    cnt = 0;    while (*pp++ != NULL)    {	cnt++;    }    return(cnt);}static void summary_format(str, numbers, names)char *str;int *numbers;register char **names;{    register char *p;    register int num;    register char *thisname;    register int useM = No;    /* format each number followed by its string */    p = str;    while ((thisname = *names++) != NULL)    {	/* get the number to format */	num = *numbers++;	/* display only non-zero numbers */	if (num > 0)	{	    /* is this number in kilobytes? */	    if (thisname[0] == 'K')	    {		/* yes: format it as a memory value */		p = strecpy(p, format_k(num));		/* skip over the K, since it was included by format_k */		p = strecpy(p, thisname+1);	    }	    else	    {		p = strecpy(p, itoa(num));		p = strecpy(p, thisname);	    }	}	/* ignore negative numbers, but display corresponding string */	else if (num < 0)	{	    p = strecpy(p, thisname);	}    }    /* if the last two characters in the string are ", ", delete them */    p -= 2;    if (p >= str && p[0] == ',' && p[1] == ' ')    {	*p = '\0';    }}static void line_update(old, new, start, line)register char *old;register char *new;int start;int line;{    register int ch;    register int diff;    register int newcol = start + 1;    register int lastcol = start;    char cursor_on_line = No;    char *current;    /* compare the two strings and only rewrite what has changed */    current = old;#ifdef DEBUG    fprintf(debug, "line_update, starting at %d\n", start);    fputs(old, debug);    fputc('\n', debug);    fputs(new, debug);    fputs("\n-\n", debug);#endif    /* start things off on the right foot		    */    /* this is to make sure the invariants get set up right */    if ((ch = *new++) != *old)    {	if (line - lastline == 1 && start == 0)	{	    putchar('\n');	}	else	{	    Move_to(start, line);	}	cursor_on_line = Yes;	putchar(ch);	*old = ch;	lastcol = 1;    }    old++;	    /*     *  main loop -- check each character.  If the old and new aren't the     *	same, then update the display.  When the distance from the     *	current cursor position to the new change is small enough,     *	the characters that belong there are written to move the     *	cursor over.     *     *	Invariants:     *	    lastcol is the column where the cursor currently is sitting     *		(always one beyond the end of the last mismatch).     */    do		/* yes, a do...while */    {	if ((ch = *new++) != *old)	{	    /* new character is different from old	  */	    /* make sure the cursor is on top of this character */	    diff = newcol - lastcol;	    if (diff > 0)	    {		/* some motion is required--figure out which is shorter */		if (diff < 6 && cursor_on_line)		{		    /* overwrite old stuff--get it out of the old buffer */		    printf("%.*s", diff, &current[lastcol-start]);		}		else		{		    /* use cursor addressing */		    Move_to(newcol, line);		    cursor_on_line = Yes;		}		/* remember where the cursor is */		lastcol = newcol + 1;	    }	    else	    {		/* already there, update position */		lastcol++;	    }			    /* write what we need to */	    if (ch == '\0')	    {		/* at the end--terminate with a clear-to-end-of-line */		(void) clear_eol(strlen(old));	    }	    else	    {		/* write the new character */		putchar(ch);	    }	    /* put the new character in the screen buffer */	    *old = ch;	}	    	/* update working column and screen buffer pointer */	newcol++;	old++;	        } while (ch != '\0');    /* zero out the rest of the line buffer -- MUST BE DONE! */    diff = display_width - newcol;    if (diff > 0)    {	memzero(old, diff);    }    /* remember where the current line is */    if (cursor_on_line)    {	lastline = 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(str)char *str;{    register char *ptr;    register char ch;    ptr = str;    while ((ch = *ptr) != '\0')    {	if (!isprint(ch))	{	    *ptr = '?';	}	ptr++;    }    return(str);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -