1 #ifndef lint 2 static char sccsid[] = "@(#)n6.c 4.2 11/26/82"; 3 #endif lint 4 5 #include "tdef.h" 6 extern 7 #include "d.h" 8 extern 9 #include "v.h" 10 #ifdef NROFF 11 extern 12 #include "tw.h" 13 #endif 14 15 /* 16 troff6.c 17 18 width functions, sizes and fonts 19 */ 20 21 extern int inchar[LNSIZE], *pinchar; /* XXX */ 22 extern int eschar; 23 extern int widthp; 24 extern int ohc; 25 extern int xfont; 26 extern int smnt; 27 extern int setwdf; 28 extern char trtab[]; 29 extern int chbits; 30 extern int nonumb; 31 extern int noscale; 32 extern int font; 33 extern int font1; 34 extern int pts; 35 extern int sps; 36 extern int nlflg; 37 extern int nform; 38 extern int dfact; 39 extern int dfactd; 40 extern int lss; 41 extern int lss1; 42 extern int vflag; 43 extern int ch0; 44 extern int level; 45 extern int ch; 46 extern int res; 47 extern int xxx; 48 int fontlab[] = {'R','I','B','S',0}; 49 50 width(c) 51 int c; 52 { 53 register i,j,k; 54 55 j = c; 56 k = 0; 57 if(j & MOT){ 58 if(j & VMOT)goto rtn; 59 k = j & ~MOTV; 60 if(j & NMOT)k = -k; 61 goto rtn; 62 } 63 if((i = (j & CMASK)) == 010){ 64 k = -widthp; 65 goto rtn; 66 } 67 if(i == PRESC)i = eschar; 68 if((i == ohc) || 69 (i >= 0370))goto rtn; 70 if(j & ZBIT)goto rtn; 71 i = trtab[i] & BMASK; 72 if(i < 040)goto rtn; 73 if (t.codetab[i-32]) 74 k = (*(t.codetab[i-32]) & 0177) * t.Char; 75 else 76 k = 0; 77 widthp = k; 78 rtn: 79 return(k); 80 } 81 setch(){ 82 register i,*j,k; 83 extern int chtab[]; 84 85 if((i = getrq()) == 0)return(0); 86 for(j=chtab;*j != i;j++)if(*(j++) == 0)return(0); 87 k = *(++j) | chbits; 88 return(k); 89 } 90 find(i,j) 91 int i,j[]; 92 { 93 register k; 94 95 if(((k = i-'0') >= 1) && (k <= 4) && (k != smnt))return(--k); 96 for(k=0; j[k] != i; k++)if(j[k] == 0)return(-1); 97 return(k); 98 } 99 mchbits(){ 100 chbits = (((pts)<<2) | font) << (BYTE + 1); 101 sps = width(' ' | chbits); 102 } 103 setps(){ 104 register i,j; 105 106 if((((i=getch() & CMASK) == '+') || (i == '-')) && 107 (((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9))){ 108 ch = 0; 109 return; 110 } 111 if((i -= '0') == 0){ 112 return; 113 } 114 if((i > 0) && (i <= 9)){ 115 if((i <= 3) && 116 ((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9)){ 117 i = 10*i +j; 118 ch = 0; 119 } 120 } 121 } 122 caseft(){ 123 skip(); 124 setfont(1); 125 } 126 setfont(a) 127 int a; 128 { 129 register i,j; 130 131 if(a)i = getrq(); 132 else i = getsn(); 133 if(!i || (i == 'P')){ 134 j = font1; 135 goto s0; 136 } 137 if(i == 'S')return; 138 if((j = find(i,fontlab)) == -1)return; 139 s0: 140 font1 = font; 141 font = j; 142 mchbits(); 143 } 144 setwd(){ 145 register i, base, wid; 146 int delim, em, k; 147 int savlevel, savhp, savfont, savfont1; 148 int *savpinchar, *p, *q, tempinchar[LNSIZE]; /* XXX */ 149 150 base = v.st = v.sb = wid = v.ct = 0; 151 if((delim = getch() & CMASK) & MOT)return; 152 savhp = v.hp; 153 savpinchar = pinchar; /* XXX */ 154 for (p=inchar, q=tempinchar; p < pinchar; ) /* XXX */ 155 *q++ = *p++; /* XXX */ 156 pinchar = inchar; /* XXX */ 157 savlevel = level; 158 v.hp = level = 0; 159 savfont = font; 160 savfont1 = font1; 161 setwdf++; 162 while((((i = getch()) & CMASK) != delim) && !nlflg){ 163 wid += width(i); 164 if(!(i & MOT)){ 165 em = 2*t.Halfline; 166 }else if(i & VMOT){ 167 k = i & ~MOTV; 168 if(i & NMOT)k = -k; 169 base -= k; 170 em = 0; 171 }else continue; 172 if(base < v.sb)v.sb = base; 173 if((k=base + em) > v.st)v.st = k; 174 } 175 nform = 0; 176 setn1(wid); 177 v.hp = savhp; 178 pinchar = savpinchar; /* XXX */ 179 for (p=inchar, q=tempinchar; p < pinchar; ) /* XXX */ 180 *p++ = *q++; /* XXX */ 181 level = savlevel; 182 font = savfont; 183 font1 = savfont1; 184 mchbits(); 185 setwdf = 0; 186 } 187 vmot(){ 188 dfact = lss; 189 vflag++; 190 return(mot()); 191 } 192 hmot(){ 193 dfact = EM; 194 return(mot()); 195 } 196 mot(){ 197 register i, j; 198 199 j = HOR; 200 getch(); /*eat delim*/ 201 if(i = atoi()){ 202 if(vflag)j = VERT; 203 i = makem(quant(i,j)); 204 } 205 getch(); 206 vflag = 0; 207 dfact = 1; 208 return(i); 209 } 210 sethl(k) 211 int k; 212 { 213 register i; 214 215 i = t.Halfline; 216 if(k == 'u')i = -i; 217 else if(k == 'r')i = -2*i; 218 vflag++; 219 i = makem(i); 220 vflag = 0; 221 return(i); 222 } 223 makem(i) 224 int i; 225 { 226 register j; 227 228 if((j = i) < 0)j = -j; 229 j = (j & ~MOTV) | MOT; 230 if(i < 0)j |= NMOT; 231 if(vflag)j |= VMOT; 232 return(j); 233 } 234 casefp(){ 235 register i, j; 236 237 skip(); 238 if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3))return; 239 if(skip() || !(j = getrq()))return; 240 fontlab[i] = j; 241 } 242 casevs(){ 243 register i; 244 245 skip(); 246 vflag++; 247 dfact = INCH; /*default scaling is points!*/ 248 dfactd = 72; 249 res = VERT; 250 i = inumb(&lss); 251 if(nonumb)i = lss1; 252 if(i < VERT)i = VERT; 253 lss1 = lss; 254 lss = i; 255 } 256 xlss(){ 257 register i, j; 258 259 getch(); 260 dfact = lss; 261 i = quant(atoi(),VERT); 262 dfact = 1; 263 getch(); 264 if((j = i) < 0)j = -j; 265 ch0 = ((j & 03700)<<3) | HX; 266 if(i < 0)ch0 |= 040000; 267 return(((j & 077)<<9) | LX); 268 } 269 casefz(){} 270 caseps(){} 271 caselg(){} 272 casecs(){} 273 casebd(){} 274 casess(){} 275 getlg(i) 276 int i; 277 { 278 return(i); 279 } 280