|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)n10.c 4.5 5/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.