Bell 32V development
[unix-history] / usr / src / cmd / troff / n10.c
CommitLineData
efc13994
TL
1#include "tdef.h"
2#include <sgtty.h>
3extern
4#include "d.h"
5extern
6#include "v.h"
7extern
8#include "tw.h"
9/*
10nroff10.c
11
12Device interfaces
13*/
14
15extern int lss;
16extern char obuf[];
17extern char *obufp;
18extern int xfont;
19extern int esc;
20extern int lead;
21extern int oline[];
22extern int *olinep;
23extern int ulfont;
24extern int esct;
25extern int sps;
26extern int ics;
27extern int ttysave;
28extern struct sgttyb ttys;
29extern char termtab[];
30extern int ptid;
31extern int waitf;
32extern int pipeflg;
33extern int eqflg;
34extern int hflg;
35extern int tabtab[];
36extern int ascii;
37extern int xxx;
38int dtab;
39int bdmode;
40int plotmode;
41
42ptinit(){
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}
71twdone(){
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}
84ptout(i)
85int 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}
106ptout1()
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}
165char *plot(x)
166char *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}
187move(){
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}
252ptlead(){move();}
253dostop(){
254 char junk;
255
256 flusho();
257 read(2,&junk,1);
258}