1 #ifndef lint 2 static char sccsid[] = "@(#)n10.c 4.5 05/11/89"; 3 #endif lint 4 5 #include "tdef.h" 6 #include <sgtty.h> 7 extern 8 #include "d.h" 9 extern 10 #include "v.h" 11 extern 12 #include "tw.h" 13 #include "pathnames.h" 14 /* 15 nroff10.c 16 17 Device interfaces 18 */ 19 20 extern int lss; 21 extern char obuf[]; 22 extern char *obufp; 23 extern int xfont; 24 extern int esc; 25 extern int lead; 26 extern int oline[]; 27 extern int *olinep; 28 extern int ulfont; 29 extern int esct; 30 extern int sps; 31 extern int ics; 32 extern int ttysave; 33 extern struct sgttyb ttys; 34 extern char termtab[]; 35 extern int ptid; 36 extern int waitf; 37 extern int pipeflg; 38 extern int eqflg; 39 extern int hflg; 40 extern int tabtab[]; 41 extern int ascii; 42 extern int xxx; 43 int dtab; 44 int bdmode; 45 int plotmode; 46 47 ptinit(){ 48 register i, j; 49 register char **p; 50 char *q; 51 int x[8]; 52 extern char *setbrk(); 53 54 if(((i=open(termtab,0)) < 0) && (i=open(_PATH_TERM,0)) < 0){ 55 prstr("Cannot open "); 56 prstr(termtab); 57 prstr("\n"); 58 exit(-1); 59 } 60 read(i,(char *)x,8*sizeof(int)); 61 /* Calc size of table, not counting zzz */ 62 j = ((int) &t.zzz - (int) &t.bset); 63 read(i, (char *)&t.bset, j); 64 x[2] -= j; 65 q = setbrk(x[2]); 66 lseek(i,(long)t.twinit+8*sizeof(int),0); 67 i = read(i,q,x[2]); 68 j = q - t.twinit; 69 for(p = &t.twinit; p < &t.zzz; p++){ 70 if(*p)*p += j;else *p = ""; 71 } 72 sps = EM; 73 ics = EM*2; 74 dtab = 8 * t.Em; 75 for(i=0; i<16; i++)tabtab[i] = dtab * (i+1); 76 if(eqflg)t.Adj = t.Hor; 77 } 78 twdone(){ 79 obufp = obuf; 80 oputs(t.twrest); 81 flusho(); 82 if(pipeflg){ 83 close(ptid); 84 wait(&waitf); 85 } 86 if(ttysave != -1) { 87 ttys.sg_flags = ttysave; 88 stty(1, &ttys); 89 } 90 } 91 ptout(i) 92 int i; 93 { 94 *olinep++ = i; 95 if(olinep >= &oline[LNSIZE])olinep--; 96 if((i&CMASK) != '\n')return; 97 olinep--; 98 lead += dip->blss + lss - t.Newline; 99 dip->blss = 0; 100 esct = esc = 0; 101 if(olinep>oline){ 102 move(); 103 ptout1(); 104 oputs(t.twnl); 105 }else{ 106 lead += t.Newline; 107 move(); 108 } 109 lead += dip->alss; 110 dip->alss = 0; 111 olinep = oline; 112 } 113 ptout1() 114 { 115 register i, k; 116 register char *codep; 117 extern char *plot(); 118 int *q, w, j, phyw; 119 120 for(q=oline; q<olinep; q++){ 121 if((i = *q) & MOT){ 122 j = i & ~MOTV; 123 if(i & NMOT)j = -j; 124 if(i & VMOT)lead += j; 125 else esc += j; 126 continue; 127 } 128 if((k = (i & CMASK)) <= 040){ 129 switch(k){ 130 case ' ': /*space*/ 131 esc += t.Char; 132 break; 133 } 134 continue; 135 } 136 codep = t.codetab[k-32]; 137 w = t.Char * (*codep++ & 0177); 138 phyw = w; 139 if(i&ZBIT)w = 0; 140 if(*codep && (esc || lead))move(); 141 esct += w; 142 if(i&074000)xfont = (i>>9) & 03; 143 if(*t.bdon & 0377){ 144 if(!bdmode && (xfont == 2)){ 145 oputs(t.bdon); 146 bdmode++; 147 } 148 if(bdmode && (xfont != 2)){ 149 oputs(t.bdoff); 150 bdmode = 0; 151 } 152 } 153 154 if(xfont == ulfont){ 155 for(k=w/t.Char;k>0;k--)oput('_'); 156 for(k=w/t.Char;k>0;k--)oput('\b'); 157 } 158 while(*codep != 0){ 159 if(*codep & 0200){ 160 codep = plot(codep); 161 oputs(t.plotoff); 162 oput(' '); 163 }else{ 164 if(plotmode)oputs(t.plotoff); 165 /* 166 * simulate bold font as overstrike if no t.bdon 167 */ 168 if (xfont == 2 && !(*t.bdon & 0377)) { 169 oput(*codep); 170 oput('\b'); 171 } 172 *obufp++ = *codep++; 173 if(obufp == (obuf + OBUFSZ + ascii - 1))flusho(); 174 /* oput(*codep++);*/ 175 } 176 } 177 if(!w)for(k=phyw/t.Char;k>0;k--)oput('\b'); 178 } 179 } 180 char *plot(x) 181 char *x; 182 { 183 register int i; 184 register char *j, *k; 185 186 if(!plotmode)oputs(t.ploton); 187 k = x; 188 if((*k & 0377) == 0200)k++; 189 for(; *k; k++){ 190 if(*k & 0200){ 191 if(*k & 0100){ 192 if(*k & 040)j = t.up; else j = t.down; 193 }else{ 194 if(*k & 040)j = t.left; else j = t.right; 195 } 196 if(!(i = *k & 037))return(++k); 197 while(i--)oputs(j); 198 }else oput(*k); 199 } 200 return(k); 201 } 202 move(){ 203 register k; 204 register char *i, *j; 205 char *p, *q; 206 int iesct, dt; 207 208 iesct = esct; 209 if(esct += esc)i = "\0"; else i = "\n\0"; 210 j = t.hlf; 211 p = t.right; 212 q = t.down; 213 if(lead){ 214 if(lead < 0){ 215 lead = -lead; 216 i = t.flr; 217 /* if(!esct)i = t.flr; else i = "\0";*/ 218 j = t.hlr; 219 q = t.up; 220 } 221 if(*i & 0377){ 222 k = lead/t.Newline; 223 lead = lead%t.Newline; 224 while(k--)oputs(i); 225 } 226 if(*j & 0377){ 227 k = lead/t.Halfline; 228 lead = lead%t.Halfline; 229 while(k--)oputs(j); 230 } 231 else { /* no half-line forward, not at line begining */ 232 k = lead/t.Newline; 233 lead = lead%t.Newline; 234 if (k>0) esc=esct; 235 i = "\n"; 236 while (k--) oputs(i); 237 } 238 } 239 if(esc){ 240 if(esc < 0){ 241 esc = -esc; 242 j = "\b"; 243 p = t.left; 244 }else{ 245 j = " "; 246 if(hflg)while((dt = dtab - (iesct%dtab)) <= esc){ 247 if(dt%t.Em || dt==t.Em)break; 248 oput(TAB); 249 esc -= dt; 250 iesct += dt; 251 } 252 } 253 k = esc/t.Em; 254 esc = esc%t.Em; 255 while(k--)oputs(j); 256 } 257 if((*t.ploton & 0377) && (esc || lead)){ 258 if(!plotmode)oputs(t.ploton); 259 esc /= t.Hor; 260 lead /= t.Vert; 261 while(esc--)oputs(p); 262 while(lead--)oputs(q); 263 oputs(t.plotoff); 264 } 265 esc = lead = 0; 266 } 267 ptlead(){move();} 268 dostop(){ 269 char junk; 270 271 flusho(); 272 read(2,&junk,1); 273 } 274