Annotation of 3BSD/cmd/troff/n9.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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