Annotation of researchv10no/cmd/tr.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: 
        !             3: #define N 500
        !             4: 
        !             5: unsigned char from[N];
        !             6: int nfrom;
        !             7: unsigned char to[N];
        !             8: int nto;
        !             9: unsigned char trans[256];
        !            10: unsigned char occur[256];
        !            11: 
        !            12: int cflag;
        !            13: int dflag;
        !            14: int sflag;
        !            15: 
        !            16: main(argc, argv)
        !            17: unsigned char **argv;
        !            18: {
        !            19:        int c;
        !            20:        for( ; argc>1 && argv[1][0]=='-'; argc--, argv++) {
        !            21:                while(c = *++argv[1]) {
        !            22:                        switch(c) {
        !            23:                        case 's':
        !            24:                                sflag++;
        !            25:                                continue;
        !            26:                        case 'd':
        !            27:                                dflag++;
        !            28:                                continue;
        !            29:                        case 'c':
        !            30:                                cflag++;
        !            31:                                continue;
        !            32:                        default:
        !            33:                                fprintf(stderr,"tr: bad option\n");
        !            34:                                exit(1);
        !            35:                        }
        !            36:                }
        !            37:        }
        !            38:        if(argc>1)
        !            39:                nfrom = canon(argv[1],from);
        !            40:        if(argc>2)
        !            41:                nto = canon(argv[2],to);
        !            42:        if(cflag)
        !            43:                complement();
        !            44:        if(dflag)
        !            45:                delete();
        !            46:        else
        !            47:                translit();
        !            48:        return 0;
        !            49: }
        !            50: 
        !            51: delete()
        !            52: {
        !            53:        register i, c, last;
        !            54:        for(i=0; i<nfrom; i++)
        !            55:                trans[from[i]] = 1;
        !            56:        if(sflag)
        !            57:                for(i=0; i<nto; i++)
        !            58:                        occur[to[i]] = 1;
        !            59:        last = -1;
        !            60:        while((c=getchar()) != EOF)
        !            61:                if(!trans[c] && (c!=last || !occur[c]))
        !            62:                        putchar(last = c);
        !            63: }
        !            64: 
        !            65: translit()
        !            66: {
        !            67:        register i, c;
        !            68:        if(nfrom>0 && nto==0) {
        !            69:                fprintf(stderr,"tr: arg count\n");
        !            70:                exit(1);
        !            71:        }
        !            72:        for(i=0; i<sizeof trans; i++)
        !            73:                trans[i] = i;
        !            74:        for(i=0; i<nfrom; i++)
        !            75:                trans[from[i]] = to[i<nto? i: nto-1];
        !            76:        if(sflag) 
        !            77:                squeeze();
        !            78:        else
        !            79:                while((c=getchar()) != EOF)
        !            80:                        putchar(trans[c]);
        !            81: }
        !            82: 
        !            83: squeeze()
        !            84: {
        !            85:        register i, c, last;
        !            86:        for(i=0; i<nto; i++)
        !            87:                occur[to[i]] = 1;
        !            88:        last = -1;
        !            89:        while((c=getchar()) != EOF)
        !            90:                if((c=trans[c]) != last || !occur[c])
        !            91:                        putchar(last = c);
        !            92: }
        !            93: 
        !            94: complement()
        !            95: {
        !            96:        register i;
        !            97:        for(i=0; i<nfrom; i++)
        !            98:                occur[from[i]] = 1;
        !            99:        for(i=nfrom=0; i<sizeof occur; i++)
        !           100:                if(!occur[i])
        !           101:                        from[nfrom++] = i;
        !           102:        memset((char*)occur,0,sizeof occur);
        !           103: }
        !           104: 
        !           105: getch(ps)
        !           106: unsigned char **ps;
        !           107: {
        !           108:        unsigned char *s = *ps;
        !           109:        int c = *s++;
        !           110:        int n, i;
        !           111:        if(c=='\\' && *s) {
        !           112:                n = 0;
        !           113:                for(i=0; i<3; i++)
        !           114:                        if(*s>='0' && *s<='7')
        !           115:                                n = 8*n + *s++ - '0';
        !           116:                        else
        !           117:                                break;
        !           118:                if(i == 0)
        !           119:                        c = *s;
        !           120:                else if(n <= 0377)
        !           121:                        c = n;
        !           122:                else {
        !           123:                        fprintf(stderr,"tr: char>0377\n");
        !           124:                        exit(1);
        !           125:                }
        !           126:        }
        !           127:        *ps = s;
        !           128:        return c;
        !           129: }
        !           130: 
        !           131: canon(s, t)
        !           132: unsigned char *s, *t;
        !           133: {
        !           134:        int n = 0;
        !           135:        int i, c;
        !           136:        while(*s && n<N) {
        !           137:                if(*s=='-' && n>0 && s[1]) {
        !           138:                        s++;
        !           139:                        c = getch(&s);
        !           140:                        for(i=t[n-1]; ++i<=c && n<N ; )
        !           141:                                t[n++] = i;
        !           142:                } else
        !           143:                        t[n++] = getch(&s);
        !           144:        }
        !           145:        if(n >= N) {
        !           146:                fprintf(stderr,"tr: arg string too long\n");
        !           147:                exit(1);
        !           148:        }
        !           149:        return n;
        !           150: }
        !           151: 

unix.superglobalmegacorp.com

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