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