xref: /csrg-svn/old/roff/nroff/n6.c (revision 9352)
17070Srrh #ifndef lint
2*9352Sshannon static char sccsid[] = "@(#)n6.c	4.2 11/26/82";
37070Srrh #endif lint
47070Srrh 
57070Srrh #include "tdef.h"
67070Srrh extern
77070Srrh #include "d.h"
87070Srrh extern
97070Srrh #include "v.h"
107070Srrh #ifdef NROFF
117070Srrh extern
127070Srrh #include "tw.h"
137070Srrh #endif
147070Srrh 
157070Srrh /*
167070Srrh troff6.c
177070Srrh 
187070Srrh width functions, sizes and fonts
197070Srrh */
207070Srrh 
217070Srrh extern  int     inchar[LNSIZE], *pinchar;       /* XXX */
227070Srrh extern int eschar;
237070Srrh extern int widthp;
247070Srrh extern int ohc;
257070Srrh extern int xfont;
267070Srrh extern int smnt;
277070Srrh extern int setwdf;
287070Srrh extern char trtab[];
297070Srrh extern int chbits;
307070Srrh extern int nonumb;
317070Srrh extern int noscale;
327070Srrh extern int font;
337070Srrh extern int font1;
347070Srrh extern int pts;
357070Srrh extern int sps;
367070Srrh extern int nlflg;
377070Srrh extern int nform;
387070Srrh extern int dfact;
397070Srrh extern int dfactd;
407070Srrh extern int lss;
417070Srrh extern int lss1;
427070Srrh extern int vflag;
437070Srrh extern int ch0;
447070Srrh extern int level;
457070Srrh extern int ch;
467070Srrh extern int res;
477070Srrh extern int xxx;
487070Srrh int fontlab[] = {'R','I','B','S',0};
497070Srrh 
507070Srrh width(c)
517070Srrh int c;
527070Srrh {
537070Srrh 	register i,j,k;
547070Srrh 
557070Srrh 	j = c;
567070Srrh 	k = 0;
577070Srrh 	if(j & MOT){
587070Srrh 		if(j & VMOT)goto rtn;
597070Srrh 		k = j & ~MOTV;
607070Srrh 		if(j & NMOT)k = -k;
617070Srrh 		goto rtn;
627070Srrh 	}
637070Srrh 	if((i = (j & CMASK)) == 010){
647070Srrh 		k = -widthp;
657070Srrh 		goto rtn;
667070Srrh 	}
677070Srrh 	if(i == PRESC)i = eschar;
687070Srrh 	if((i == ohc) ||
697070Srrh 	   (i >= 0370))goto rtn;
707070Srrh 	if(j & ZBIT)goto rtn;
717070Srrh 	i = trtab[i] & BMASK;
727070Srrh 	if(i < 040)goto rtn;
73*9352Sshannon 	if (t.codetab[i-32])
74*9352Sshannon 		k = (*(t.codetab[i-32]) & 0177) * t.Char;
75*9352Sshannon 	else
76*9352Sshannon 		k = 0;
777070Srrh 	widthp = k;
787070Srrh rtn:
797070Srrh 	return(k);
807070Srrh }
817070Srrh setch(){
827070Srrh 	register i,*j,k;
837070Srrh 	extern int chtab[];
847070Srrh 
857070Srrh 	if((i = getrq()) == 0)return(0);
867070Srrh 	for(j=chtab;*j != i;j++)if(*(j++) == 0)return(0);
877070Srrh 	k = *(++j) | chbits;
887070Srrh 	return(k);
897070Srrh }
907070Srrh find(i,j)
917070Srrh int i,j[];
927070Srrh {
937070Srrh 	register k;
947070Srrh 
957070Srrh 	if(((k = i-'0') >= 1) && (k <= 4) && (k != smnt))return(--k);
967070Srrh 	for(k=0; j[k] != i; k++)if(j[k] == 0)return(-1);
977070Srrh 	return(k);
987070Srrh }
997070Srrh mchbits(){
1007070Srrh 	chbits = (((pts)<<2) | font) << (BYTE + 1);
1017070Srrh 	sps = width(' ' | chbits);
1027070Srrh }
1037070Srrh setps(){
1047070Srrh 	register i,j;
1057070Srrh 
1067070Srrh 	if((((i=getch() & CMASK) == '+')  || (i == '-')) &&
1077070Srrh 	  (((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9))){
1087070Srrh 		ch = 0;
1097070Srrh 		return;
1107070Srrh 	}
1117070Srrh 	if((i -= '0') == 0){
1127070Srrh 		return;
1137070Srrh 	}
1147070Srrh 	if((i > 0) && (i <= 9)){
1157070Srrh 		if((i <= 3) &&
1167070Srrh 		  ((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9)){
1177070Srrh 			i = 10*i +j;
1187070Srrh 			ch = 0;
1197070Srrh 		}
1207070Srrh 	}
1217070Srrh }
1227070Srrh caseft(){
1237070Srrh 	skip();
1247070Srrh 	setfont(1);
1257070Srrh }
1267070Srrh setfont(a)
1277070Srrh int a;
1287070Srrh {
1297070Srrh 	register i,j;
1307070Srrh 
1317070Srrh 	if(a)i = getrq();
1327070Srrh 		else i = getsn();
1337070Srrh 	if(!i || (i == 'P')){
1347070Srrh 		j = font1;
1357070Srrh 		goto s0;
1367070Srrh 	}
1377070Srrh 	if(i == 'S')return;
1387070Srrh 	if((j = find(i,fontlab))  == -1)return;
1397070Srrh s0:
1407070Srrh 	font1 = font;
1417070Srrh 	font = j;
1427070Srrh 	mchbits();
1437070Srrh }
1447070Srrh setwd(){
1457070Srrh 	register i, base, wid;
1467070Srrh 	int delim, em, k;
1477070Srrh 	int savlevel, savhp, savfont, savfont1;
1487070Srrh 	int *savpinchar, *p, *q, tempinchar[LNSIZE];	/* XXX */
1497070Srrh 
1507070Srrh 	base = v.st = v.sb = wid = v.ct = 0;
1517070Srrh 	if((delim = getch() & CMASK) & MOT)return;
1527070Srrh 	savhp = v.hp;
1537070Srrh 	savpinchar = pinchar;	/* XXX */
1547070Srrh 	for (p=inchar, q=tempinchar; p < pinchar; )	/* XXX */
1557070Srrh 		*q++ = *p++;	/* XXX */
1567070Srrh 	pinchar = inchar;	/* XXX */
1577070Srrh 	savlevel = level;
1587070Srrh 	v.hp = level = 0;
1597070Srrh 	savfont = font;
1607070Srrh 	savfont1 = font1;
1617070Srrh 	setwdf++;
1627070Srrh 	while((((i = getch()) & CMASK) != delim) && !nlflg){
1637070Srrh 		wid += width(i);
1647070Srrh 		if(!(i & MOT)){
1657070Srrh 			em = 2*t.Halfline;
1667070Srrh 		}else if(i & VMOT){
1677070Srrh 			k = i & ~MOTV;
1687070Srrh 			if(i & NMOT)k = -k;
1697070Srrh 			base -= k;
1707070Srrh 			em = 0;
1717070Srrh 		}else continue;
1727070Srrh 		if(base < v.sb)v.sb = base;
1737070Srrh 		if((k=base + em) > v.st)v.st = k;
1747070Srrh 	}
1757070Srrh 	nform = 0;
1767070Srrh 	setn1(wid);
1777070Srrh 	v.hp = savhp;
1787070Srrh 	pinchar = savpinchar;	/* XXX */
1797070Srrh 	for (p=inchar, q=tempinchar; p < pinchar; )	/* XXX */
1807070Srrh 		*p++ = *q++;	/* XXX */
1817070Srrh 	level = savlevel;
1827070Srrh 	font = savfont;
1837070Srrh 	font1 = savfont1;
1847070Srrh 	mchbits();
1857070Srrh 	setwdf = 0;
1867070Srrh }
1877070Srrh vmot(){
1887070Srrh 	dfact = lss;
1897070Srrh 	vflag++;
1907070Srrh 	return(mot());
1917070Srrh }
1927070Srrh hmot(){
1937070Srrh 	dfact = EM;
1947070Srrh 	return(mot());
1957070Srrh }
1967070Srrh mot(){
1977070Srrh 	register i, j;
1987070Srrh 
1997070Srrh 	j = HOR;
2007070Srrh 	getch(); /*eat delim*/
2017070Srrh 	if(i = atoi()){
2027070Srrh 		if(vflag)j = VERT;
2037070Srrh 		i = makem(quant(i,j));
2047070Srrh 	}
2057070Srrh 	getch();
2067070Srrh 	vflag = 0;
2077070Srrh 	dfact = 1;
2087070Srrh 	return(i);
2097070Srrh }
2107070Srrh sethl(k)
2117070Srrh int k;
2127070Srrh {
2137070Srrh 	register i;
2147070Srrh 
2157070Srrh 	i = t.Halfline;
2167070Srrh 	if(k == 'u')i = -i;
2177070Srrh 	else if(k == 'r')i = -2*i;
2187070Srrh 	vflag++;
2197070Srrh 	i = makem(i);
2207070Srrh 	vflag = 0;
2217070Srrh 	return(i);
2227070Srrh }
2237070Srrh makem(i)
2247070Srrh int i;
2257070Srrh {
2267070Srrh 	register j;
2277070Srrh 
2287070Srrh 	if((j = i) < 0)j = -j;
2297070Srrh 	j = (j & ~MOTV) | MOT;
2307070Srrh 	if(i < 0)j |= NMOT;
2317070Srrh 	if(vflag)j |= VMOT;
2327070Srrh 	return(j);
2337070Srrh }
2347070Srrh casefp(){
2357070Srrh 	register i, j;
2367070Srrh 
2377070Srrh 	skip();
2387070Srrh 	if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3))return;
2397070Srrh 	if(skip() || !(j = getrq()))return;
2407070Srrh 	fontlab[i] = j;
2417070Srrh }
2427070Srrh casevs(){
2437070Srrh 	register i;
2447070Srrh 
2457070Srrh 	skip();
2467070Srrh 	vflag++;
2477070Srrh 	dfact = INCH; /*default scaling is points!*/
2487070Srrh 	dfactd = 72;
2497070Srrh 	res = VERT;
2507070Srrh 	i = inumb(&lss);
2517070Srrh 	if(nonumb)i = lss1;
2527070Srrh 	if(i < VERT)i = VERT;
2537070Srrh 	lss1 = lss;
2547070Srrh 	lss = i;
2557070Srrh }
2567070Srrh xlss(){
2577070Srrh 	register i, j;
2587070Srrh 
2597070Srrh 	getch();
2607070Srrh 	dfact = lss;
2617070Srrh 	i = quant(atoi(),VERT);
2627070Srrh 	dfact = 1;
2637070Srrh 	getch();
2647070Srrh 	if((j = i) < 0)j = -j;
2657070Srrh 	ch0 = ((j & 03700)<<3) | HX;
2667070Srrh 	if(i < 0)ch0 |= 040000;
2677070Srrh 	return(((j & 077)<<9) | LX);
2687070Srrh }
2697070Srrh casefz(){}
2707070Srrh caseps(){}
2717070Srrh caselg(){}
2727070Srrh casecs(){}
2737070Srrh casebd(){}
2747070Srrh casess(){}
2757070Srrh getlg(i)
2767070Srrh int i;
2777070Srrh {
2787070Srrh 	return(i);
2797070Srrh }
280