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

📄 update.c

📁 操作系统源代码
💻 C
字号:
#include <curses.h>#include "curspriv.h"#include <termcap.h>static WINDOW *twin;		/* used by many routines *//****************************************************************//* Gotoxy() moves the physical cursor to the desired address on *//* The screen. We don't optimize here - on a PC, it takes more  *//* Time to optimize than to do things directly.                 *//****************************************************************/_PROTOTYPE(static void gotoxy, (int row, int col ));_PROTOTYPE(static void newattr, (int ch ));_PROTOTYPE(static void Putchar, (int ch ));_PROTOTYPE(static void clrupdate, (WINDOW *scr ));_PROTOTYPE(static void transformline, (int lineno ));static void gotoxy(row, col)int row, col;{  poscur(row, col);  _cursvar.cursrow = row;  _cursvar.curscol = col;}/* Update attributes */static void newattr(ch)int ch;{  extern char *me, *as, *ae, *mb, *md, *mr, *so, *us;  static int lastattr = 0;  if (lastattr != (ch &= ATR_MSK)) {	lastattr = ch;	tputs(me, 1, outc);	if (ae) tputs(ae, 1, outc);	if (ch & A_ALTCHARSET)		if (as) tputs(as, 1, outc);	if (ch & A_BLINK) tputs(mb, 1, outc);	if (ch & A_BOLD) tputs(md, 1, outc);	if (ch & A_REVERSE) tputs(mr, 1, outc);	if (ch & A_STANDOUT) tputs(so, 1, outc);	if (ch & A_UNDERLINE) tputs(us, 1, outc);  }}/* Putchar() writes a character, with attributes, to the physical   screen, but avoids writing to the lower right screen position.   Should it care about am?*//* Output char with attribute */static void Putchar(ch)int ch;{  if ((_cursvar.cursrow < LINES) || (_cursvar.curscol < COLS)) {	newattr(ch);	putchar(ch);  }}/****************************************************************//* Clrupdate(scr) updates the screen by clearing it and then    *//* Redraw it in it's entirety.					*//****************************************************************/static void clrupdate(scr)WINDOW *scr;{  register int *src;  register int *dst;  register int i;  register int j;  WINDOW *w;  w = curscr;  if (scr != w) {		/* copy scr to curscr */	for (i = 0; i < LINES; i++) {		src = scr->_line[i];		dst = w->_line[i];		for (j = 0; j < COLS; j++) *dst++ = *src++;	}			/* for */  }				/* if */  newattr(scr->_attrs);  clrscr();  scr->_clear = FALSE;  for (i = 0; i < LINES; i++) {	/* update physical screen */	src = w->_line[i];	j = 0;	while (j < COLS) {		if (*src != (' ' | ATR_NRM)) {			gotoxy(i, j);			while (j < COLS && (*src != (' ' | ATR_NRM))) {				Putchar(*src++);				j++;			}		} else {			src++;			j++;		}	}			/* for */  }				/* for */  fflush(stdout);}				/* clrupdate *//****************************************************************//* Transformline() updates the given physical line to look      *//* Like the corresponding line in _cursvar.tmpwin.		*//****************************************************************/static void transformline(lineno)register int lineno;{  register int *dstp;  register int *srcp;  register int dstc;  register int srcc;  int x;  int endx;  x = twin->_minchng[lineno];  endx = twin->_maxchng[lineno];  dstp = curscr->_line[lineno] + x;  srcp = twin->_line[lineno] + x;  while (x <= endx) {	if ((*dstp != *srcp) || (dstc != srcc)) {		gotoxy(lineno, x);		while (x <= endx && ((*dstp != *srcp) || (dstc != srcc))) {			Putchar(*srcp);			*dstp++ = *srcp++;			x++;		}	} else {		*dstp++ = *srcp++;		x++;	}  }				/* for */  twin->_minchng[lineno] = _NO_CHANGE;  twin->_maxchng[lineno] = _NO_CHANGE;}				/* transformline *//****************************************************************//* Doupdate() updates the physical screen to look like _curs-   *//* Var.tmpwin if curscr is not 'Clear-marked'. Otherwise it     *//* Updates the screen to look like curscr.                      *//****************************************************************/void doupdate(){  int i;  twin = _cursvar.tmpwin;  if (curscr->_clear)	clrupdate(curscr);  else {	if (twin->_clear)		clrupdate(twin);	else {		for (i = 0; i < LINES; i++)			if (twin->_minchng[i] != _NO_CHANGE)				transformline(i);	}  }  curscr->_curx = twin->_curx;  curscr->_cury = twin->_cury;  gotoxy(curscr->_cury, curscr->_curx);  fflush(stdout);}				/* doupdate */

⌨️ 快捷键说明

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