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