Annotation of 43BSD/usr.bin/troff/n9.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)n9.c       4.1 6/7/82";
                      3: #endif lint
                      4: 
                      5: #include "tdef.h"
                      6: extern
                      7: #include "d.h"
                      8: extern
                      9: #include "v.h"
                     10: #ifdef NROFF
                     11: extern
                     12: #include "tw.h"
                     13: #endif
                     14: /*
                     15: troff9.c
                     16: 
                     17: misc functions
                     18: */
                     19: 
                     20: extern int cbuf[];
                     21: extern int *cp;
                     22: extern int ch;
                     23: extern int chbits;
                     24: extern int dfact;
                     25: extern int vflag;
                     26: extern int pts;
                     27: extern int fc;
                     28: extern int padc;
                     29: extern int tabtab[];
                     30: extern int nlflg;
                     31: extern int lss;
                     32: extern int tabch, ldrch;
                     33: extern int tabc, dotc;
                     34: extern int nchar, rchar;
                     35: extern int xxx;
                     36: 
                     37: setz(){
                     38:        register i;
                     39: 
                     40:        if(!((i = getch()) & MOT))i |= ZBIT;
                     41:        return(i);
                     42: }
                     43: setline(){
                     44:        register *i, length, c;
                     45:        int w, cnt, delim, rem, temp;
                     46: 
                     47:        if((delim = getch()) & MOT)return;
                     48:                else delim &= CMASK;
                     49:        vflag = 0;
                     50:        dfact = EM;
                     51:        length = quant(atoi(),HOR);
                     52:        dfact = 1;
                     53:        if(!length){
                     54:                eat(delim);
                     55:                return;
                     56:        }
                     57: s0:
                     58:        if(((c = getch()) & CMASK) == delim){
                     59:                ch = c;
                     60:                c = 0204 | chbits;
                     61:        }else if((c & CMASK) == FILLER)goto s0;
                     62:        w = width(c);
                     63:        i = cbuf;
                     64:        if(length < 0){
                     65:                *i++ = makem(length);
                     66:                length = -length;
                     67:        }
                     68:        if(!(cnt = length/w)){
                     69:                *i++ = makem(-(temp = ((w-length)/2)));
                     70:                *i++ = c;
                     71:                *i++ = makem(-(w - length - temp));
                     72:                goto s1;
                     73:        }
                     74:        if(rem = length%w){
                     75:                switch(c & CMASK){
                     76:                        case 0204: /*rule*/
                     77:                        case 0224: /*underrule*/
                     78:                        case 0276: /*root en*/
                     79:                                *i++ = c | ZBIT;
                     80:                        default:
                     81:                                *i++ = makem(rem);
                     82:                }
                     83:        }
                     84:        if(cnt){
                     85:                *i++ = RPT;
                     86:                *i++ = cnt;
                     87:                *i++ = c;
                     88:        }
                     89: s1:
                     90:        *i++ = 0;
                     91:        eat(delim);
                     92:        cp = cbuf;
                     93: }
                     94: eat(c)
                     95: int c;
                     96: {
                     97:        register i;
                     98: 
                     99:        while(((i = getch() & CMASK) != c) &&
                    100:                (i != '\n'));
                    101:        return(i);
                    102: }
                    103: setov(){
                    104:        register i, j, k;
                    105:        int *p, delim, o[NOV], w[NOV];
                    106: 
                    107:        if((delim = getch()) & MOT)return;
                    108:                else delim &= CMASK;
                    109:        for(k=0; (k<NOV) && ((j=(i = getch()) & CMASK) != delim) &&
                    110:                (j != '\n'); k++){
                    111:                        o[k] = i;
                    112:                        w[k] = width(i);
                    113:        }
                    114:        o[k] = w[k] = 0;
                    115:        if(o[0])for(j=1; j;){
                    116:                j = 0;
                    117:                for(k=1; o[k] ; k++){
                    118:                        if(w[k-1] < w[k]){
                    119:                                j++;
                    120:                                i = w[k];
                    121:                                w[k] = w[k-1];
                    122:                                w[k-1] = i;
                    123:                                i = o[k];
                    124:                                o[k] = o[k-1];
                    125:                                o[k-1] = i;
                    126:                        }
                    127:                }
                    128:        }else return;
                    129:        p = cbuf;
                    130:        for(k=0; o[k]; k++){
                    131:                *p++ = o[k];
                    132:                *p++ = makem(-((w[k]+w[k+1])/2));
                    133:        }
                    134:        *p++ = makem(w[0]/2);
                    135:        *p = 0;
                    136:        cp = cbuf;
                    137: }
                    138: setbra(){
                    139:        register i, *j, k;
                    140:        int cnt, delim, dwn;
                    141: 
                    142:        if((delim = getch()) & MOT)return;
                    143:                else delim &= CMASK;
                    144:        j = cbuf + 1;
                    145:        cnt = 0;
                    146: #ifdef NROFF
                    147:        dwn = (2*t.Halfline) | MOT | VMOT;
                    148: #endif
                    149: #ifndef NROFF
                    150:        dwn = EM | MOT | VMOT;
                    151: #endif
                    152:        while(((k = (i = getch()) & CMASK) != delim) && (k != '\n') &&
                    153:                (j <= (cbuf+NC-4))){
                    154:                *j++ = i | ZBIT;
                    155:                *j++ = dwn;
                    156:                cnt++;
                    157:        }
                    158:        if(--cnt < 0)return;
                    159:                else if (!cnt){
                    160:                        ch = *(j-2);
                    161:                        return;
                    162:        }
                    163:        *j = 0;
                    164: #ifdef NROFF
                    165:        *--j = *cbuf = (cnt*t.Halfline) | MOT | NMOT | VMOT;
                    166: #endif
                    167: #ifndef NROFF
                    168:        *--j = *cbuf = (cnt*EM)/2 | MOT | NMOT | VMOT;
                    169: #endif
                    170:        *--j &= ~ZBIT;
                    171:        cp = cbuf;
                    172: }
                    173: setvline(){
                    174:        register i, c, *k;
                    175:        int cnt, neg, rem, ver, delim;
                    176: 
                    177:        if((delim = getch()) & MOT)return;
                    178:                else delim &= CMASK;
                    179:        dfact = lss;
                    180:        vflag++;
                    181:        i = quant(atoi(),VERT);
                    182:        dfact = 1;
                    183:        if(!i){
                    184:                eat(delim);
                    185:                vflag = 0;
                    186:                return;
                    187:        }
                    188:        if(((c = getch()) & CMASK) == delim){
                    189:                c = 0337 | chbits;      /*default box rule*/
                    190:        }else getch();
                    191:        c |= ZBIT;
                    192:        neg = 0;
                    193:        if(i < 0){
                    194:                i = -i;
                    195:                neg = NMOT;
                    196:        }
                    197: #ifdef NROFF
                    198:        ver = 2*t.Halfline;
                    199: #endif
                    200: #ifndef NROFF
                    201:        ver = EM;
                    202: #endif
                    203:        cnt = i/ver;
                    204:        rem = makem(i%ver) | neg;
                    205:        ver = makem(ver) | neg;
                    206:        k = cbuf;
                    207:        if(!neg)*k++ = ver;
                    208:        if(rem & ~MOTV){
                    209:                *k++ = c;
                    210:                *k++ = rem;
                    211:        }
                    212:        while((k < (cbuf+NC-3)) && cnt--){
                    213:                *k++ = c;
                    214:                *k++ = ver;
                    215:        }
                    216:        *(k-2) &= ~ZBIT;
                    217:        if(!neg)k--;
                    218:        *k = 0;
                    219:        cp = cbuf;
                    220:        vflag = 0;
                    221: }
                    222: casefc(){
                    223:        register i;
                    224: 
                    225:        fc = IMP;
                    226:        padc = ' ';
                    227:        if(skip() ||
                    228:           ((i = getch()) & MOT) ||
                    229:           ((i &= CMASK) == '\n'))return;
                    230:        fc = i;
                    231:        if(skip() || (ch & MOT) || ((ch &= CMASK) == fc))return;
                    232:        padc = ch;
                    233: }
                    234: setfield(x)
                    235: int x;
                    236: {
                    237:        register i, j, *fp;
                    238:        int length, ws, npad, temp, type;
                    239:        int **pp, *padptr[NPP];
                    240:        static int fbuf[FBUFSZ];
                    241:        int savfc, savtc, savlc;
                    242: 
                    243:        if(x == tabch) rchar = tabc | chbits;
                    244:        else if(x ==  ldrch) rchar = dotc | chbits;
                    245:        temp = npad = ws = 0;
                    246:        savfc = fc; savtc = tabch; savlc = ldrch;
                    247:        tabch = ldrch = fc = IMP;
                    248:        for(j=0;;j++){
                    249:                if((tabtab[j] & TMASK)== 0){
                    250:                        if(x==savfc)prstr("Zero field width.\n");
                    251:                        j = 0;
                    252:                        goto rtn;
                    253:                }
                    254:                v.hp = sumhp(); /* XXX */
                    255:                if((length = ((tabtab[j] & TMASK) - v.hp)) > 0 )break;
                    256:        }
                    257:        type = tabtab[j] & (~TMASK);
                    258:        fp = fbuf;
                    259:        pp = padptr;
                    260:        if(x == savfc){while(1){
                    261:                if(((j = (i = getch()) & CMASK)) == padc){
                    262:                        npad++;
                    263:                        *pp++ = fp;
                    264:                        if(pp > (padptr + NPP - 1))break;
                    265:                        goto s1;
                    266:                }else if(j == savfc) break;
                    267:                        else if(j == '\n'){
                    268:                                temp = j;
                    269:                                nlflg = 0;
                    270:                                break;
                    271:                        }
                    272:                ws += width(i);
                    273:        s1:
                    274:                *fp++ = i;
                    275:                if(fp > (fbuf + FBUFSZ -3))break;
                    276:        }
                    277:        if(!npad){
                    278:                npad++;
                    279:                *pp++ = fp;
                    280:                *fp++ = 0;
                    281:        }
                    282:        *fp++ = temp;
                    283:        *fp++ = 0;
                    284:        temp = i = (j = length-ws)/npad;
                    285:        i = (i/HOR)*HOR;
                    286:        if((j -= i*npad) <0)j = -j;
                    287:        i = makem(i);
                    288:        if(temp <0)i |= NMOT;
                    289:        for(;npad > 0; npad--){
                    290:                *(*--pp) = i;
                    291:                if(j){
                    292:                        j -= HOR;
                    293:                        (*(*pp)) += HOR;
                    294:                }
                    295:        }
                    296:        cp = fbuf;
                    297:        j = 0;
                    298:        }else if(type == 0){
                    299:        /*plain tab or leader*/
                    300:                if((j = width(rchar)) == 0)nchar = 0;
                    301:                else{
                    302:                        nchar = length /j;
                    303:                        length %= j;
                    304:                }
                    305:                if(length)j = length | MOT;
                    306:                else j = getch0();
                    307:        }else{
                    308:        /*center tab*/
                    309:        /*right tab*/
                    310:                while(((j = (i = getch()) & CMASK) != savtc) &&
                    311:                        (j != '\n') && (j != savlc)){
                    312:                        ws += width(i);
                    313:                        *fp++ = i;
                    314:                        if(fp > (fbuf +FBUFSZ - 3)) break;
                    315:                }
                    316:                *fp++ = i;
                    317:                *fp++ = 0;
                    318:                if(type == RTAB)length -= ws;
                    319:                else length -= ws/2; /*CTAB*/
                    320:                if(((j = width(rchar)) == 0) || (length <= 0))nchar = 0;
                    321:                else{
                    322:                        nchar = length/j;
                    323:                        length %= j;
                    324:                }
                    325:                length = (length/HOR)*HOR;
                    326:                j = makem(length);
                    327:                cp = fbuf;
                    328:                nlflg = 0;
                    329:        }
                    330: rtn:
                    331:        fc = savfc; tabch = savtc; ldrch = savlc;
                    332:        return(j);
                    333: }

unix.superglobalmegacorp.com

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