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

📄 cim_change.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef sccsstatic	char sccsid[] = "@(#)cim_change.c 1.1 92/07/30 Copyr 1983 Sun Micro";#endif#endif/* * Copyright (c) 1983 by Sun Microsystems, Inc. *//* * Character image manipulation (except size change) routines. */#include <sys/types.h>#include <pixrect/pixrect.h>#include <suntool/ttyansi.h>#include <suntool/charimage.h>#include <suntool/charscreen.h>char	boldify;extern	char *  strcpy();#define JFvpos(row, col)	int row, col;{	register unsigned char *line = image[row];	register char *bold = screenmode[row];        unsigned char c;	while (length(line) <= col) {                c = ((unsigned char)(line[-1]));                bold[c] = MODE_CLEAR;                line[c] = ' ';                line[-1] = ((unsigned char)(line[-1])) + 1;	}	setlinelength(line, (length(line)));}bold_mode(){	boldify |= MODE_BOLD;}nobold_mode(){	boldify &= ~MODE_BOLD;}underscore_mode(){	boldify |= MODE_UNDERSCORE;}nounderscore_mode(){	boldify &= ~MODE_UNDERSCORE;}inverse_mode(){	boldify |= MODE_INVERT;}noinverse_mode(){	boldify &= ~MODE_INVERT;}clear_mode(){	boldify = MODE_CLEAR;}writePartialLine(s, curscolStart)	char *s;	register int curscolStart;{	register char *sTmp;	register unsigned char *line = image[cursrow]; 	register char *bold = screenmode[cursrow];	register int curscolTmp = curscolStart;	/*	 * Fix line length if start is past end of line length.	 * This shouldn't happen but does.	 */	if (length(line) < curscolStart )		(void)vpos(cursrow, curscolStart);	/*	 * Stick characters in line.	 */	for (sTmp=s;*sTmp!='\0';sTmp++) {		line[curscolTmp] = *sTmp;		bold[curscolTmp] = boldify;		curscolTmp++;	}	/*	 * Set new line length.	 */	if (length(line) < curscolTmp )		setlinelength(line, curscolTmp);/*if (sTmp>(s+3)) printf("%d\n",sTmp-s);*/	/* Note: curscolTmp should equal curscol here *//*if (curscolTmp!=curscol)	printf("csurscolTmp=%d, curscol=%d\n", curscolTmp,curscol);*/	(void)pstring(s, boldify, curscolStart, cursrow, PIX_SRC);}#ifdef	USE_WRITE_CHARwritechar(c)	char c;{	register char *line = image[cursrow];	char unitstring[2];	unitstring[0] = line[curscol] = c;	unitstring[1] = 0;	if (length(line) <= curscol )		setlinelength(line, curscol+1);	/* Note: if revive this proc then null terminate line */	(void)pstring(unitstring, curscol, cursrow, PIX_SRC);}#endif	USE_WRITE_CHAR#ifdef JFcim_scroll(n)register int n;{	register int	new;#ifdef DEBUG_LINESprintf(" cim_scroll(%d)	\n", n);#endif	if (n>0) {		/*	text moves UP screen	*/		(void)delete_lines(top, n);	} else {	/* (n<0)	text moves DOWN	screen	*/		new = bottom + n;		(void)roll(top, new, bottom);		(void)pcopyscreen(top,top - n, new);		(void)cim_clear(top, top - n);	}}#elsecim_scroll(toy, fromy)	int fromy, toy;{	if (toy < fromy) /* scrolling up */		(void)roll(toy, bottom, fromy);	else		swapregions(fromy, toy, bottom-toy);	if (fromy > toy) {		(void)pcopyscreen(fromy, toy, bottom - fromy);		(void)cim_clear(bottom-(fromy-toy), bottom);	/* move text up */	} else {		(void)pcopyscreen(fromy, toy, bottom - toy);		(void)cim_clear(fromy, bottom-(toy-fromy));	/* down */	}}#endifinsert_lines(where, n)register int where, n;{	register int new = where + n;#ifdef DEBUG_LINESprintf(" insert_lines(%d,%d) bottom=%d	\n", where, n, bottom);#endif	if (new > bottom)		new = bottom;	(void)roll(where, new, bottom);	(void)pcopyscreen(where, new, bottom - new);	(void)cim_clear(where, new);}delete_lines(where, n)register int where, n;{	register int new = where + n;#ifdef DEBUG_LINESprintf(" delete_lines(%d,%d)	\n", where, n);#endif	if (new > bottom) {		n -= new - bottom;		new = bottom;	}	(void)roll(where, bottom - n, bottom);	(void)pcopyscreen(new, where, bottom - new);	(void)cim_clear(bottom-n, bottom);}roll(first, mid, last)	int first, last, mid;{/* printf("first=%d, mid=%d, last=%d\n", first, mid, last); */	reverse(first, last);	reverse(first, mid);	reverse(mid, last);}staticreverse(a, b)	int a, b;{	b--;	while (a < b)		(void)swap(a++, b--);}swapregions(a, b, n)	int a, b, n;{	while (n--)		(void)swap(a++, b++);}swap(a, b)	int a, b;{	unsigned char *tmpline = image[a];	char *tmpbold = screenmode[a];	image[a] = image[b];	image[b] = tmpline;	screenmode[a] = screenmode[b];	screenmode[b] = tmpbold;}cim_clear(a, b)	int a, b;{	register int i;	for (i = a; i < b; i++)		setlinelength(image[i], 0);	(void)pclearscreen(a, b);	if (a == top && b == bottom) {		if (delaypainting)			(void)pdisplayscreen(1);		else			delaypainting = 1;	}}deleteChar(fromcol, tocol, row)	int fromcol, tocol, row;{	register unsigned char *line = image[row];	register char *bold = screenmode[row];	int len = length(line);	if (fromcol >= tocol)		return;	if (tocol < len) {		/*		 * There's a fragment left at the end		 */		int	gap = tocol - fromcol;		{			register unsigned char *a = line+fromcol;			register unsigned char *b = line+tocol;			register char *am = bold + fromcol;			register char *bm = bold + tocol;			while (*a++ = *b++)				*am++ = *bm++;		}		setlinelength(line, len-gap);		(void)pcopyline(fromcol, tocol, len - tocol, row);		(void)pclearline(len - gap, len, row);	} else if (fromcol < len) {		setlinelength(line, fromcol);		(void)pclearline(fromcol, len, row);	}}insertChar(fromcol, tocol, row)	int fromcol;	register int tocol;	int row;{	register unsigned char *line = image[row];	register char *bold = screenmode[row];	int len = length(line);	register int i;	int delta, newlen, slug, rightextent;	if (fromcol >= tocol || fromcol >= len)		return;	delta = tocol - fromcol;	newlen = len+delta;	if (newlen > right)		newlen = right;	if (tocol > right)		tocol = right;	for (i = newlen; i >= tocol; i--) {		line[i] = line[i-delta];		bold[i] = bold[i-delta];	}	for (i = fromcol; i < tocol; i++) {		line[i] = ' ';		bold[i] = MODE_CLEAR;	}	setlinelength(line, newlen);	rightextent = len+(tocol-fromcol);	slug = len - fromcol;	if (rightextent > right)		slug -= rightextent - right;	(void)pcopyline(tocol, fromcol, slug, row);	(void)pclearline(fromcol, tocol, row);}

⌨️ 快捷键说明

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