1: static char *sccsid = "@(#)tr.c 4.2 (Berkeley) 4/22/85";
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: clearerr(stdout);
81: while((c=getc(stdin)) != EOF ) {
82: if(c == 0) continue;
83: if(c = code[c&0377]&0377)
84: if(!sflag || c!=save || !squeez[c&0377]) {
85: putchar(save = c);
86: if(ferror(stdout))
87: exit(1);
88: }
89: }
90: exit(0);
91: }
92:
93: next(s)
94: struct string *s;
95: {
96:
97: again:
98: if(s->max) {
99: if(s->last++ < s->max)
100: return(s->last);
101: s->max = s->last = 0;
102: }
103: if(s->last && *s->p=='-') {
104: nextc(s);
105: s->max = nextc(s);
106: if(s->max==0) {
107: s->p--;
108: return('-');
109: }
110: if(s->max < s->last) {
111: s->last = s->max-1;
112: return('-');
113: }
114: goto again;
115: }
116: return(s->last = nextc(s));
117: }
118:
119: nextc(s)
120: struct string *s;
121: {
122: register c, i, n;
123:
124: c = *s->p++;
125: if(c=='\\') {
126: i = n = 0;
127: while(i<3 && (c = *s->p)>='0' && c<='7') {
128: n = n*8 + c - '0';
129: i++;
130: s->p++;
131: }
132: if(i>0) c = n;
133: else c = *s->p++;
134: }
135: if(c==0) *--s->p = 0;
136: return(c&0377);
137: }
Defined functions
main
defined in line
14;
never used
next
defined in line
93; used 4 times
Defined variables
cflag
defined in line
7; used 3 times
code
defined in line
9; used 6 times
dflag
defined in line
5; used 3 times
save
defined in line
8; used 2 times
sccsid
defined in line
1;
never used
sflag
defined in line
6; used 2 times
vect
defined in line
11; used 6 times
Defined struct's