Annotation of researchv10no/cmd/troff/ancient.nroff/n10.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.