|
|
1.1 root 1: #include "tdef.hd"
2: #ifdef unix
3: #include <sgtty.h>
4: #endif
5: #include "strs.hd"
6: #include "tw.hd"
7: extern struct ttable t;
8: /*
9: nroff10.c
10:
11: Device interfaces
12: */
13:
14: extern struct d d[NDI], *dip;
15: #ifndef INCORE
16: extern struct envblock eblock;
17: #else
18: extern struct envblock eblock[NEV];
19: extern int ev;
20: #endif
21:
22: #ifdef ebcdic
23: extern char *fname();
24: #endif
25: extern int stop;
26: extern int bdtab[];
27: extern char obuf[];
28: extern char *obufp;
29: extern int xfont;
30: extern int esc;
31: extern int lead;
32: extern int oline[];
33: extern int *olinep;
34: extern int ulfont;
35: extern int esct;
36: extern int ttysave;
37: extern struct sgttyb ttys;
38: extern char termtab[];
39: extern filedes ptid;
40: extern int waitf;
41: #ifndef SMALL
42: extern int pipeflg;
43: #endif
44: extern int eqflg;
45: extern int hflg;
46: extern int ascii;
47: int dtab;
48: int bdmode;
49: int itmode;
50: int plotmode;
51: ptinit(){
52: register i;
53: register char **p;
54: char *q;
55: int strsize;
56: #ifndef INCORE
57: extern char *setbrk();
58: #else
59: static char termstbuf[TSTBUF]; /* terminal strings buffer */
60: #endif
61: #ifdef tso
62: filedes j;
63: #endif
64:
65: #ifdef unix
66: if((i = open(termtab,0)) < 0){
67: #endif
68: #ifdef tso
69: if ((j=fopen(fname(termtab),"r,BINARY")) == NULL) {
70: #endif
71: prstr("Non-existent terminal type\n");
72: exit(-1);
73: }
74: #ifdef unix
75: read(i, &strsize, sizeof(strsize));
76: read(i,(char *)&t.bset, sizeof(struct ttable));
77: #endif
78: #ifdef tso
79: fread((char *)&strsize,sizeof(strsize),1,j);
80: fread((char *)&t.bset,sizeof(struct ttable),1,j);
81: #endif
82: #ifndef INCORE
83: q = setbrk(strsize);
84: #else
85: if (TSTBUF < strsize) {
86: prstr("terminal table too big");
87: exit(-1); }
88: q = termstbuf; /* terminal table */
89: #endif
90: #ifdef unix
91: read(i,q,strsize);
92: #endif
93: #ifdef tso
94: fread(q,strsize,1,j);
95: #endif
96: for(p = &t.twinit; p < &t.zzz; p++)
97: *p = q + ((int) *p); /* relocate pointers */
98:
99: sps = EM;
100: ics = EM*2;
101: dtab = 8 * t.Em;
102: for(i=0; i<16; i++)tabtab[i] = dtab * (i+1);
103: if(eqflg)t.Adj = t.Hor;
104: }
105: twdone(){
106: obufp = obuf;
107: oputs(t.twrest);
108: flusho();
109: #ifndef SMALL
110: if(pipeflg){
111: close(ptid);
112: wait(&waitf);
113: }
114: #endif
115: #ifdef tso
116: fclose(ptid);
117: #endif
118: #ifdef unix
119: if(ttysave != -1) {
120: ttys.sg_flags = ttysave;
121: stty(1, &ttys);
122: }
123: #endif
124: }
125: ptout(i)
126: int i;
127: {
128: *olinep++ = i;
129: if(olinep >= &oline[LNSIZE])olinep--;
130: if((i&CMASK) != '\n')return;
131: olinep--;
132: lead += dip->blss + lss - t.Newline;
133: dip->blss = 0;
134: esct = esc = 0;
135: if(olinep>oline){
136: move();
137: ptout1();
138: oputs(t.twnl);
139: }else{
140: lead += t.Newline;
141: move();
142: }
143: lead += dip->alss;
144: dip->alss = 0;
145: olinep = oline;
146: }
147: ptout1()
148: {
149: register i, k;
150: register char *codep;
151: extern char *plot();
152: int *q, w, j, phyw;
153:
154: for(q=oline; q<olinep; q++){
155: if((i = *q) & MOT){
156: j = i & ~MOTV;
157: if(i & NMOT)j = -j;
158: if(i & VMOT)lead += j;
159: else esc += j;
160: continue;
161: }
162: if((k = (i & CMASK)) <= 040){
163: if (k == ' ') { /* space */
164: esc += t.Char;
165: continue; }
166: switch (k) {
167: case 033: codep = "\000\033"; /* ascii esc */
168: break;
169: case 007: codep = "\000\007"; /* ascii bel */
170: break;
171: case 016: codep = "\000\016"; /* shift out of ASCII */
172: break;
173: case 017: codep = "\000\017"; /* shift into ASCII */
174: break;
175: case COLON: codep = "\000\013"; /* lem's character */
176: break;
177: default: codep = (char *)0;
178: break; }}
179: else codep = t.codetab[k-32];
180: if (codep == (char *)0) continue;
181: w = t.Char * (*codep++ & 0177);
182: phyw = w;
183: if(i&ZBIT)w = 0;
184: if(*codep && (esc || lead))move();
185: esct += w;
186: if(i&074000)xfont = (i>>9) & 03;
187: if((*t.bdon) & 0377){
188: if(!bdmode && (xfont == 2)){
189: oputs(t.bdon);
190: itmode = 0; /* now in roman not italic */
191: bdmode++;
192: }
193: if(bdmode && (xfont != 2)){
194: oputs(t.bdoff);
195: bdmode = 0;
196: }
197: }
198: if ((*t.iton) & 0377) {
199: if (!itmode && (xfont == 1)) { /* enter italic */
200: oputs(t.iton);
201: itmode++; }
202: else if (itmode && (xfont != 1)) { /* leave italic */
203: oputs(t.itoff);
204: itmode = 0; }}
205:
206: if((xfont == ulfont) && !(*t.iton & 0377)) {
207: for(k=w/t.Char;k>0;k--)oput('_');
208: for(k=w/t.Char;k>0;k--)oput('\b');
209: }
210: if (!(*t.bdon & 0377) && ((k = bdtab[xfont]) || xfont == 2))
211: k++;
212: else k = 1;
213: while(*codep != 0){
214: i = k;
215: if(*codep & 0200){
216: codep = plot(codep);
217: oputs(t.plotoff);
218: oput(' ');
219: } else {
220: if(plotmode)oputs(t.plotoff);
221: if (*codep != '\b') {
222: while (i--) {
223: oput(*codep);
224: if (i) oput('\b'); }}
225: else oput(*codep);
226: codep++;
227: }
228: }
229: if(!w)for(k=phyw/t.Char;k>0;k--)oput('\b');
230: }
231: }
232: char *plot(x)
233: char *x;
234: {
235: register int i;
236: register char *j, *k;
237:
238: if(!plotmode)oputs(t.ploton);
239: k = x;
240: if((*k & 0377) == 0200)k++;
241: for(; *k; k++){
242: if(*k & 0200){
243: if(*k & 0100){
244: if(*k & 040)j = t.up; else j = t.down;
245: }else{
246: if(*k & 040)j = t.left; else j = t.right;
247: }
248: if(!(i = *k & 037))return(++k);
249: while(i--)oputs(j);
250: }else oput(*k);
251: }
252: return(k);
253: }
254: move(){
255: register k;
256: register char *i, *j;
257: char *p, *q;
258: int iesct, dt;
259:
260: iesct = esct;
261: if(esct += esc)i = "\0"; else i = "\012\0" /*\n*/;
262: j = t.hlf;
263: p = t.right;
264: q = t.down;
265: if(lead){
266: if(lead < 0){
267: lead = -lead;
268: i = t.flr;
269: /* if(!esct)i = t.flr; else i = "\0";*/
270: j = t.hlr;
271: q = t.up;
272: }
273: if(*i & 0377){
274: k = lead/t.Newline;
275: lead = lead%t.Newline;
276: while((k--)>0)oputs(i);
277: }
278: if(*j & 0377){
279: k = lead/t.Halfline;
280: lead = lead%t.Halfline;
281: while((k--)>0)oputs(j);
282: }
283: else { /* no half-line forward, not at line begining */
284: k = lead/t.Newline;
285: lead = lead%t.Newline;
286: if (k>0) esc=esct;
287: i = "\012" /*\n*/;
288: while ((k--)>0) oputs(i);
289: }
290: }
291: if(esc){
292: if(esc < 0){
293: esc = -esc;
294: j = "\010" /*\b*/;
295: p = t.left;
296: }else{
297: j = "\040"/*space*/;
298: if(hflg) while (((dt = dtab - (iesct%dtab)) <= esc) &&
299: (!(dt%t.Em))) {
300: oput(TAB);
301: esc -= dt;
302: iesct += dt;
303: }
304: }
305: k = esc/t.Em;
306: esc = esc%t.Em;
307: while((k--)>0)oputs(j);
308: }
309: if((*t.ploton & 0377) && (esc || lead)){
310: if(!plotmode)oputs(t.ploton);
311: esc /= t.Adj;
312: lead /= t.Vert;
313: while((esc--)>0)oputs(p);
314: while((lead--)>0)oputs(q);
315: oputs(t.plotoff);
316: }
317: esc = lead = 0;
318: }
319: ptlead(){move();}
320: dostop(){
321: char junk;
322:
323: flusho();
324: aprstr("\007");
325: #ifdef unix
326: while ((read(2,&junk,1) != -1) && (junk != '\n')) ;
327: #endif
328: #ifdef tso
329: while ((fread((char *)&junk,1,1,stderr)!=EOF) && (junk!='\n'));
330: #endif
331: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.