AUSAM/source/S/detab.c
/*
* detab [infile [outfile] ]
* This program replaces all tabs by blanks
* in infile placing result in outfile.
* May be used as a filter.
* also see 'entab'
*/
#define EOF -1
#define EOLN '\n'
#define CR '\r'
#define FF '\f'
#define TAB '\t'
#define BS '\b'
char ibuf[518], obuf[518];
main(argc, argv)
char *argv[];
{
register c, ocol;
if(argc > 3)
{
prints(2, "Usage: detab [ infile [ outfile ] ]\n");
return 1;
}
if(argc > 1)
{
if(fopen(argv[1], ibuf) == -1)
{
perror( argv[1] );
return 1;
}
}
else
{
ibuf[0] = 0; /* use standard input */
}
if(argc > 2)
{
if(fcreat(argv[2], obuf) == -1)
{
perror( argv[2] );
return 1;
}
}
else
{
obuf[0] = 1; /* use standard output */
}
/* here beginneth the program */
ocol = 0;
while((c = getc(ibuf)) != EOF)
{
switch(c)
{
case EOLN:
case CR:
case FF:
put( c );
ocol = 0;
break;
case TAB:
do
{
put( ' ' );
ocol++;
}
while((ocol%8) != 0);
break;
case BS:
put( c );
ocol--;
break;
default:
put( c );
ocol++;
break;
}
}
fflush(obuf);
return 0;
}
put( c )
char c;
{
extern errno;
putc( c , obuf );
if( errno )
{
perror("write");
exit(1);
}
}