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