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