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: }
Defined functions
main
defined in line
13;
never used
next
defined in line
88; used 4 times
Defined variables
cflag
defined in line
6; used 3 times
code
defined in line
8; used 6 times
dflag
defined in line
4; used 3 times
save
defined in line
7; used 2 times
sflag
defined in line
5; used 2 times
squeez
defined in line
9; used 5 times
vect
defined in line
10; used 6 times
Defined struct's