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