Annotation of 42BSD/usr.bin/tr.c, revision 1.1

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

unix.superglobalmegacorp.com

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