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