|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.