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