AUSAM/source/S/tr.c
int dflag 0;
int sflag 0;
int cflag 0;
int save 0;
char code[256];
char squeez[256];
char vect[256];
struct string
{
int last, max, rep;
char *p;
} string1, string2;
int inbuf[259];
main(argc, argv)
char **argv;
{
register int i, j, c, d;
char *compl;
extern fout;
string1.last = string2.last = 0;
string1.max = string2.max = 0;
string1.rep = string2.rep = 0;
string1.p = string2.p = "";
if(--argc > 0)
{
argv++;
if(*argv[0] == '-' && argv[0][1] != 0)
{
while(*++argv[0])
switch(*argv[0])
{
case 'c':
cflag++;
continue;
case 'd':
dflag++;
continue;
case 's':
sflag++;
continue;
}
argc--;
argv++;
}
}
if(argc > 0)
string1.p = argv[0];
if(argc > 1)
string2.p = argv[1];
if(cflag)
{
while(c = next(&string1))
vect[c&0377] = 1;
j = 0;
for(i = 1; i < 256; i++)
if(vect[i] == 0)
vect[j++] = i;
vect[j] = 0;
compl = vect;
}
for(;;)
{
if(cflag)
c = *compl++;
else
c = next(&string1);
if(c == 0)
break;
d = next(&string2);
if(d == 0)
d = c;
code[c&0377] = d;
squeez[d&0377] = 1;
}
while(d = next(&string2))
squeez[d&0377] = 1;
squeez[0] = 1;
for(i = 0; i < 256; i++)
{
if(code[i] == 0)
code[i] = i;
else if(dflag)
code[i] = 0;
}
inbuf[0] = 0;
fout = dup(1);
close(1);
while((c = getc(inbuf)) >= 0)
{
if(c == 0)
continue;
if(c = code[c&0377]&0377)
if(!sflag || c != save || !squeez[c&0377])
putchar(save = c);
}
flush();
}
next(s)
register struct string *s;
{
register int a, b, c, n, base;
if(--s->rep > 0)
return(s->last);
if(s->last < s->max)
return(++s->last);
if(*s->p == '[')
{
nextc(s);
s->last = a = nextc(s);
s->max = 0;
switch(nextc(s))
{
case '-':
b = nextc(s);
if(b < a || *s->p++ != ']')
goto error;
s->max = b;
return(a);
case '*':
base = (*s->p == '0')?8:10;
n = 0;
while((c = *s->p) >= '0' && c < '0'+base)
{
n = base*n+c-'0';
s->p++;
}
if(*s->p++ != ']')
goto error;
if(n == 0)
n = 1000;
s->rep = n;
return(a);
default:
error:
write(1, "Bad string\n", 11);
exit();
}
}
return(nextc(s));
}
nextc(s)
register struct string *s;
{
register int c, i, n;
c = *s->p++;
if(c == '\\')
{
i = n = 0;
while(i < 3 && (c = *s->p) >= '0' && c <= '7')
{
n = n*8+c-'0';
i++;
s->p++;
}
if(i > 0)
c = n;
else
c = *s->p++;
}
if(c == 0)
*--s->p = 0;
return(c&0377);
}