Annotation of researchv10no/cmd/troff/ancient.nroff/n10.c, revision 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.