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

📄 tc.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
static	char	*sccsid = "@(#)tc.c	4.1	(ULTRIX)	7/17/90";/* * Simulate typesetter on 4014*/#include <signal.h>#include <stdio.h>#define	oput(c) if (pgskip==0) putchar(c); else (c);#define MAXY 3071#define US 037#define GS 035#define ESC 033#define FF 014#define DBL 0200int pl = 11*144;int mpy = 1;int div = 1;char *ap;int ch;int nonumb;int psize = 10;int dfact = 1;int esc;int escd;int verd;int esct;int osize = 02;int size = 02;int rx;int xx;int yy = MAXY+62+48;int leadtot = -31;int ohy = -1;int ohx = -1;int oxb = -1;int oly = -1;int olx = -1;int tflag;int railmag;int lead;int skip;int pgskip;int ksize = ';';int mcase;int stab[] = {010,0,01,07,02,03,04,05,0211,06,0212,0213,0214,0215,0216,0217};int rtab[] = {6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, 36, 18};int ktab[] = {';',';',';',';',';',';',':',':','9','9','9','9','8','8','8','9'};int first = 1;int alpha;extern char *asctab[128];extern char *spectab[128];int erase = 1;void	(*sigint)();void	(*sigquit)();main(argc,argv)int argc;char **argv;{	register i, j;	register char *k;	extern ex();	while((--argc > 0) && ((++argv)[0][0]=='-')){		switch(argv[0][1]){			case 'p':				ap = &argv[0][2];				dfact = 72;				if(i = atoi())pl = i/3;				continue;			case 't':				tflag++;				continue;			case 's':				ap = &argv[0][2];				dfact = 1;				pgskip = atoi();				continue;			default:				dfact = 1;				ap = &argv[0][1];				if(i = atoi())mpy = i;				if(i = atoi())div = i;				continue;		}	}	if(argc){		if (freopen(argv[0], "r", stdin) == NULL) {			fprintf(stderr, "tc: cannot open %s\n", argv[0]);			exit(1);		}	}	sigint = signal(SIGINT, ex);	sigquit = signal(SIGQUIT, SIG_IGN);	while((i = getchar()) != EOF){		if(!i)continue;		if(i & 0200){			esc += (~i) & 0177;			continue;		}		if(esc){			if(escd)esc = -esc;			esct += esc;			xx += (esc*mpy + rx)/div;			rx = (esc*mpy + rx)%div;			sendpt();			esc = 0;		}		switch(i){			case 0100:	/*init*/				escd = verd = mcase = railmag = xx = 0;				yy = MAXY + 48;				leadtot = -31;				ohy = oxb = oly = ohx = olx = -1;				oput(US);				fflush(stdout);				if(!first && !tflag)kwait();				if(first){					first = 0;					yy += 62;				}				init();				continue;			case 0101:	/*lower rail*/				railmag &= ~01;				continue;			case 0102:	/*upper rail*/				railmag |= 01;				continue;			case 0103:	/*upper mag*/				railmag |= 02;				continue;			case 0104:	/*lower mag*/				railmag &= ~02;				continue;			case 0105:	/*lower case*/				mcase = 0;				continue;			case 0106:	/*upper case*/				mcase = 0100;				continue;			case 0107:	/*escape forward*/				escd = 0;				continue;			case 0110:	/*escape backward*/				escd = 1;				continue;			case 0111:	/*stop*/				continue;			case 0112:	/*lead forward*/				verd = 0;				continue;			case 0113:	/*undefined*/				continue;			case 0114:	/*lead backward*/				verd = 1;				continue;			case 0115:	/*undefined*/			case 0116:			case 0117:				continue;		}		if((i & 0340) == 0140){	/*leading*/			lead = (~i) & 037;			if(verd)lead = -lead;			if((leadtot += lead) > pl){				leadtot = lead;				oput(US);				fflush(stdout);				if(!tflag)kwait();				yy = MAXY;				if(pgskip)--pgskip;				init();				continue;			}			if(skip)continue;			if((yy -= (lead<<1)) < 0){				skip++;				yy = 0;			}else sendpt();			continue;		}		if((i & 0360) == 0120){	/*size change*/			i &= 017;			for(j = 0; i != (stab[j] & 017); j++);			osize = size;			size = stab[j];			psize = rtab[j];			ksize = ktab[j];			oput(ESC);			oput(ksize);			i = 0;			if(!(osize & DBL) && (size & DBL))i = -55;			else if((osize & DBL) && !(size & DBL))i = 55;			if(escd)i = -i;			esc += i;			continue;		}		if(i & 0300)continue;		i = (i & 077) | mcase;		if(railmag != 03)k = asctab[i];		else k = spectab[i];		if(alpha)sendpt();		if(*k!='\0'){			oput(US);			while(*k & 0377)oput(*k++);			alpha++;			continue;		}else{			if(railmag != 03){				switch(i){				case 0124: lig("fi"); break;				case 0125: lig("fl"); break;				case 0126: lig("ff"); break;				case 0130: lig("ffl"); break;				case 0131: lig("ffi"); break;				default: continue;				}			}			continue;		}	}	ex();}lig(x)char *x;{	register i, j;	register char *k;	j = 0;	k = x;	oput(US);	oput(*k++);	i = psize * 8 * mpy / (div * 6); /* 8/36 em */	while(*k){		xx += i;		j += i;		sendpt();		oput(US);		oput(*k++);	}	xx -= j;	sendpt();}init(){	fflush(stdout);	if(erase){		oput(ESC);		oput(FF);	}else erase = 1;	oput(ESC);	oput(ksize);	/*delay about a second*//* let the system do it...	for(i = 960; i > 0; i--)oput(GS);*/	skip = 0;	sendpt();}ex(){	yy = MAXY;	xx = 0;	sendpt();	oput(ESC);	oput(';');	oput(US);	fflush(stdout);	exit(0);}kwait(){	char buf[128]; char *bptr; char c;	if(pgskip) return;next:	bptr=buf;	while((c=readch())&&(c!='\n')) *bptr++=c;	*bptr=0;	if(bptr!=buf){		bptr = buf;		if(*bptr == '!'){callunix(&buf[1]); fputs("!\n", stderr); goto next;}		else switch(*bptr++){			case 'e':				erase = 0;				goto next;			case 's':				ap = &buf[1];				dfact = 1;				pgskip = atoi() + 1;				goto next;			default:				fputs("?\n", stderr);				goto next;		}	}	else if (c==0) ex();	else	return;}callunix(line)char line[];{	int rc, status, unixpid;	if( (unixpid=fork())==0 ) {		signal(SIGINT,sigint); signal(SIGQUIT,sigquit);		close(0); dup(2);		execl("/bin/sh", "-sh", "-c", line, 0);		exit(255);	}	else if(unixpid == -1)		return;	else{	signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN);		while( (rc = wait(&status)) != unixpid && rc != -1 ) ;		signal(SIGINT,ex); signal(SIGQUIT,sigquit);	}}readch(){	char c;	if (read(2,&c,1)<1) c=0;	return(c);}sendpt(){	int hy,xb,ly,hx,lx;	oput(GS);	hy = ((yy>>7) & 037);	xb = ((xx & 03) + ((yy<<2) & 014) & 017);	ly = ((yy>>2) & 037);	hx = ((xx>>7) & 037);	lx = ((xx>>2) & 037);	if(hy != ohy)oput(hy | 040);	if(xb != oxb)oput(xb | 0140);	if((ly != oly) || (hx != ohx) || (xb != oxb))		oput(ly | 0140);	if(hx != ohx)oput(hx | 040);	oput(lx | 0100);	ohy = hy;	oxb = xb;	oly = ly;	ohx = hx;	olx = lx;	alpha = 0;	return;}atoi(){	register i, j, acc;	int field, digits;	long dd;	long tscale();	field = digits = acc = 0;a1:	while(((j = (i = getch()) - '0') >= 0) && (j <= 9)){		field++;		digits++;		acc = 10*acc + j;	}	if(i == '.'){		field++;		digits = 0;		goto a1;	}	if(!(ch = i))ch = 'x';	dd = tscale(acc);	acc = dd;	if((field != digits) && (digits > 0)){		j = 1;		while(digits--)j *= 10;		acc = dd/j;	}	nonumb = !field;	ch = 0;	return(acc);}long tscale(n)int n;{	register i, j;	switch(i = getch()){		case 'u':			j = 1;			break;		case 'p':	/*Points*/			j = 6;			break;		case 'i':	/*Inches*/			j = 432;			break;		case 'c':	/*Centimeters; should be 170.0787*/			j = 170;			break;		case 'P':	/*Picas*/			j = 72;			break;		default:			j = dfact;			ch = i;	}	return((long)n*j);}getch(){	register i;	if(ch){		i = ch;		ch = 0;		return(i);	}	return(*ap++);}char *asctab[128] = {"\0",	/*blank*/"h",	/*h*/"t",	/*t*/"n",	/*n*/"m",	/*m*/"l",	/*l*/"i",	/*i*/"z",	/*z*/"s",	/*s*/"d",	/*d*/"b",	/*b*/"x",	/*x*/"f",	/*f*/"j",	/*j*/"u",	/*u*/"k",	/*k*/"\0",	/*blank*/"p",	/*p*/"-",	/*_ 3/4 em dash*/";",	/*;*/"\0",	/*blank*/"a",	/*a*/"_",	/*rule*/"c",	/*c*/"`",	/*` open*/"e",	/*e*/"\'",	/*' close*/"o",	/*o*/"\0",	/*1/4*/"r",	/*r*/"\0",	/*1/2*/"v",	/*v*/"-",	/*- hyphen*/"w",	/*w*/"q",	/*q*/"/",	/*/*/".",	/*.*/"g",	/*g*/"\0",	/*3/4*/",",	/*,*/"&",	/*&*/"y",	/*y*/"\0",	/*blank*/"%",	/*%*/"\0",	/*blank*/"Q",	/*Q*/"T",	/*T*/"O",	/*O*/"H",	/*H*/"N",	/*N*/"M",	/*M*/"L",	/*L*/"R",	/*R*/"G",	/*G*/"I",	/*I*/"P",	/*P*/"C",	/*C*/"V",	/*V*/"E",	/*E*/"Z",	/*Z*/"D",	/*D*/"B",	/*B*/"S",	/*S*/"Y",	/*Y*/"\0",	/*blank*/"F",	/*F*/"X",	/*X*/"A",	/*A*/"W",	/*W*/"J",	/*J*/"U",	/*U*/"K",	/*K*/"0",	/*0*/"1",	/*1*/"2",	/*2*/"3",	/*3*/"4",	/*4*/"5",	/*5*/"6",	/*6*/"7",	/*7*/"8",	/*8*/"9",	/*9*/"*",	/***/"-",	/*minus*/"",	/*fi*/"",	/*fl*/"",	/*ff*/"\033\016Z\bM\033\017",	/*cent sign*/"",	/*ffl*/"",	/*ffi*/"(",	/*(*/")",	/*)*/"[",	/*[*/"]",	/*]*/"\033\016J\033\017",	/*degree*/"\033\016M\b_\033\017",	/*dagger*/"=",	/*=*/"\033\016O\b&\033\017",	/*registered*/":",	/*:*/"+",	/*+*/"\0",	/*blank*/"!",	/*!*/"\033\016O\b~\033\017",	/*bullet*/"?",	/*?*/"\'",	/*foot mark*/"|",	/*|*/"\0",	/*blank*/"\033\016O\b#\033\017",	/*copyright*/"\033\016L\033\017",	/*square*/"$" };	/*$*/char *spectab[128] = {"\0",	/*blank*/"\033\016(\bM\033\017",	/*psi*/"\033\016o\b_\033\017",	/*theta*/"v\b)",	/*nu*/"\033\016V\b,\033\017",	/*mu*/"\033\016)\b?\033\017",	/*lambda*/"\033\016I\033\017",	/*iota*/"S\b\033\016Z\033\017",	/*zeta*/"o\b\'",	/*sigma*/"o\b\033\0165\033\017",	/*delta*/"\033\016b\033\017",	/*beta*/"\033\016e\bc\033\017",	/*xi*/"j\b\033\016C\033\017",	/*eta*/"\033\016O\bM\033\017",	/*phi*/"\033\016(\033\017",	/*upsilon*/"\033\016k\033\017",	/*kappa*/"\0",	/*blank*/"T\b\033\016S\033\017",	/*pi*/"@",	/*at-sign*/"\033\016U\033\017",	/*down arrow*/"\0",	/*blank*/"\033\016A\033\017",	/*alpha*/"|",	/*or*/"l\b/",	/*chi*/"\"",	/*"*/"\033\016E\033\017",	/*epsilon*/"=",	/*=*/"\033\016O\033\017",	/*omicron*/"\033\016[\033\017",	/*left arrow*/"\033\016R\033\017",	/*rho*/"\033\016Y\033\017",	/*up arrow*/"\033\016N\033\017",	/*tau*/"_",	/*underrule*/"\\",	/*\*/"I\b\033\016(\033\017",	/*Psi*/"\033\016O\bJ\033\017",	/*bell system sign*/"\033\016W\bX\033\017",	/*infinity*/"`\b/",	/*gamma*/"\033\016X\bF\033\017",	/*improper superset*/"\033\016A\033\017",	/*proportional to*/"\033\016\\\b]\033\017",	/*right hand*/"\033\016W\033\017",	/*omega*/"\0",	/*blank*/"\033\016G\033\017",	/*gradient*/"\0",	/*blank*/"I\033\016\bO\033\017",	/*Phi*/"O\b=",	/*Theta*/"O\b_",	/*Omega*/"\033\016V\033\017",	/*cup (union)*/"\033\016@\033\017",	/*root en*/"s",	/*terminal sigma*/"\033\016)\bK\033\017",	/*Lambda*/"-",	/*minus*/"\033\016S\bK\033\017",	/*Gamma*/"\033\016i\033\017",	/*integral sign*/"\033\016t\b'\033\017",	/*Pi*/"\033\016Z\033\017",	/*subset of*/"\033\016X\033\017",	/*superset of*/"\033\016T\033\017",	/*approximates*/"o\b`",	/*partial derivative*/"\033\016H\033\017",	/*Delta*/"\033\016I\b'\033\017",	/*square root*/">\b\033\016F\b@\033\017",	/*Sigma*/"\033\016T\bF\033\017",	/*approx =*/"\0",	/*blank*/">",	/*>*/"\033\016_\bF\b@\033\017",	/*Xi*/"<",	/*<*/"/",	/*slash (longer)*/"\033\016C\033\017",	/*cap (intersection)*/"\033\016y\033\017",	/*Upsilon*/"\033\016|\033\017",	/*not*/"|",	/*right ceiling (rt of ")*/"|",	/*left top (of big curly)*/"|",	/*bold vertical*/"|",	/*left center of big curly bracket*/"|",	/*left bottom*/"|",	/*right top*/"|",	/*right center of big curly bracket*/"|",	/*right bot*/"|",	/*right floor (rb of ")*/"|",	/*left floor (left bot of big sq bract)*/"|",	/*left ceiling (lt of ")*/"\033\016=\033\017",	/*multiply*/"\033\016+\033\017",	/*divide*/"+\b_",	/*plus-minus*/"\033\016$\033\017",	/*<=*/"\033\016^\033\017",	/*>=*/"=\b_",	/*identically equal*/"\033\016*\033\017",	/*not equal*/"{",	/*{*/"}",	/*}*/"\'",	/*' acute accent*/"`",	/*` grave accent*/"^",	/*^*/"#",	/*sharp*/"\033\016|\b[\033\017",	/*left hand*/"\033\016c\b_\033\017",	/*member of*/"~",	/*~*/"\033\016O\b/\033\017",	/*empty set*/"\0",	/*blank*/"\033\016%\bM\033\017",	/*dbl dagger*/"|",	/*box rule*/"*",	/*asterisk*/"\033\016Z\bF\033\017",	/*improper subset*/"\033\016O\033\017",	/*circle*/"\0",	/*blank*/"+",	/*eqn plus*/"\033\016]\033\017",	/*right arrow*/"g\b\033\016C\033\017" };	/*section mark*/

⌨️ 快捷键说明

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