Annotation of 3BSD/cmd/tr.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: 
                      3: /* tr - transliterate data stream */
                      4: int    dflag   = 0;
                      5: int    sflag   = 0;
                      6: int    cflag = 0;
                      7: int    save    = 0;
                      8: char   code[256];
                      9: char   squeez[256];
                     10: char   vect[256];
                     11: struct string { int last, max; char *p; } string1, string2;
                     12: 
                     13: main(argc,argv)
                     14: char **argv;
                     15: {
                     16:        register i;
                     17:        int j;
                     18:        register c, d;
                     19:        char *compl;
                     20:        int lastd;
                     21: 
                     22:        string1.last = string2.last = 0;
                     23:        string1.max = string2.max = 0;
                     24:        string1.p = string2.p = "";
                     25: 
                     26:        if(--argc>0) {
                     27:                argv++;
                     28:                if(*argv[0]=='-'&&argv[0][1]!=0) {
                     29:                        while(*++argv[0])
                     30:                                switch(*argv[0]) {
                     31:                                case 'c':
                     32:                                        cflag++;
                     33:                                        continue;
                     34:                                case 'd':
                     35:                                        dflag++;
                     36:                                        continue;
                     37:                                case 's':
                     38:                                        sflag++;
                     39:                                        continue;
                     40:                                }
                     41:                        argc--;
                     42:                        argv++;
                     43:                }
                     44:        }
                     45:        if(argc>0) string1.p = argv[0];
                     46:        if(argc>1) string2.p = argv[1];
                     47:        for(i=0; i<256; i++)
                     48:                code[i] = vect[i] = 0;
                     49:        if(cflag) {
                     50:                while(c = next(&string1))
                     51:                        vect[c&0377] = 1;
                     52:                j = 0;
                     53:                for(i=1; i<256; i++)
                     54:                        if(vect[i]==0) vect[j++] = i;
                     55:                vect[j] = 0;
                     56:                compl = vect;
                     57:        }
                     58:        for(i=0; i<256; i++)
                     59:                squeez[i] = 0;
                     60:        lastd = 0;
                     61:        for(;;){
                     62:                if(cflag) c = *compl++;
                     63:                else c = next(&string1);
                     64:                if(c==0) break;
                     65:                d = next(&string2);
                     66:                if(d==0) d = lastd;
                     67:                else lastd = d;
                     68:                squeez[d&0377] = 1;
                     69:                code[c&0377] = dflag?1:d;
                     70:        }
                     71:        while(d = next(&string2))
                     72:                squeez[d&0377] = 1;
                     73:        squeez[0] = 1;
                     74:        for(i=0;i<256;i++) {
                     75:                if(code[i]==0) code[i] = i;
                     76:                else if(dflag) code[i] = 0;
                     77:        }
                     78: 
                     79:        while((c=getc(stdin)) != EOF ) {
                     80:                if(c == 0) continue;
                     81:                if(c = code[c&0377]&0377)
                     82:                        if(!sflag || c!=save || !squeez[c&0377])
                     83:                                putchar(save = c);
                     84:        }
                     85:        exit(0);
                     86: }
                     87: 
                     88: next(s)
                     89: struct string *s;
                     90: {
                     91: 
                     92: again:
                     93:        if(s->max) {
                     94:                if(s->last++ < s->max)
                     95:                        return(s->last);
                     96:                s->max = s->last = 0;
                     97:        }
                     98:        if(s->last && *s->p=='-') {
                     99:                nextc(s);
                    100:                s->max = nextc(s);
                    101:                if(s->max==0) {
                    102:                        s->p--;
                    103:                        return('-');
                    104:                }
                    105:                if(s->max < s->last)  {
                    106:                        s->last = s->max-1;
                    107:                        return('-');
                    108:                }
                    109:                goto again;
                    110:        }
                    111:        return(s->last = nextc(s));
                    112: }
                    113: 
                    114: nextc(s)
                    115: struct string *s;
                    116: {
                    117:        register c, i, n;
                    118: 
                    119:        c = *s->p++;
                    120:        if(c=='\\') {
                    121:                i = n = 0;
                    122:                while(i<3 && (c = *s->p)>='0' && c<='7') {
                    123:                        n = n*8 + c - '0';
                    124:                        i++;
                    125:                        s->p++;
                    126:                }
                    127:                if(i>0) c = n;
                    128:                else c = *s->p++;
                    129:        }
                    130:        if(c==0) *--s->p = 0;
                    131:        return(c&0377);
                    132: }

unix.superglobalmegacorp.com

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