Annotation of researchv10no/cmd/tr.c, revision 1.1.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.