|
|
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.