Apple AZTEC wc.c (smaller, faster)
John E. Duncan III
jed at mb2c.UUCP
Fri Dec 16 10:23:08 AEST 1983
/* wc - word count */
/* Apple II AZTEC C System version. Wherin we do big blocking on input
* since the system won't do it for us, and we avoid STDIO so that the
* program can be re-'run'.
*/
#define TRUE 1
#define FALSE 0
#define BLANK ' '
#define TAB '\t'
#define NULL 0
#define READ 0
#define STDIN 0
#define STDOUT 1
#define STDERR 2
#define BUFSIZ 30000
long int tl, tw, tc;
int lines, words, chars;
char unknown[] = "wc: Unknown option, x\n";
main(argc, argv)
int argc;
char *argv[];
{
char *s;
register int input; /* file number */
int fcount;
tl = tw = tc = 0;
lines = words = chars = FALSE;
fcount = 0;
while( --argc>0 && **++argv == '-' )
for( s=&argv[0][1]; *s != NULL; s++ )
switch( *s ) {
case 'l':
lines = TRUE;
break;
case 'w':
words = TRUE;
break;
case 'c':
chars = TRUE;
break;
default:
unknown[20] = *s;
emsg( unknown );
argc = -1;
break;
}
if( argc < 0 ) {
emsg( "usage: wc -lwc files\n" );
exit(1);
}
if( !words && !lines && !chars )
lines = words = chars = TRUE;
if( argc == 0 )
wc( STDIN, "" );
else
for( ; argc>0; argc--,argv++)
if( (input=open(*argv, READ)) < 0 ) {
emsg( "wc: Can't open " );
emsg( *argv );
emsg( "\n" );
}
else {
wc( input, *argv );
fcount++;
close( input );
}
if( fcount > 1 ) {
if( lines ) {
dwrite( tl );
mesg( "\t" );
}
if( words ) {
dwrite( tw );
mesg( "\t" );
}
if( chars ) {
dwrite( tc );
mesg( "\t" );
}
mesg( "total\n" );
}
exit(0);
} /* end main */
/* wc - count lines, words & chars */
wc( in, fname )
int *in;
char *fname;
{
char buf[BUFSIZ];
register char *ptr, *endbuf;
register char c, inword;
register long int nl, nw, nc;
static unsigned int incnt;
inword = FALSE;
nl = nw = nc = 0;
while( incnt = read( in, buf, BUFSIZ )) {
endbuf = buf + incnt;
ptr = buf - 1;
while( ++ptr < endbuf ) {
c = *ptr;
++nc;
if( c == '\r' || c == '\n' ) {
++nl;
inword = FALSE;
continue;
}
if( c == BLANK || c == TAB ) {
inword = FALSE;
continue;
}
if( ! inword ) {
inword = TRUE;
++nw;
}
}
}
if( incnt < 0 ) {
emsg( "wc: Input error, file '" );
emsg( fname );
emsg( "'\n" );
exit( 3 );
}
tl += nl ; tw += nw ; tc += nc ;
if( lines ) {
dwrite( nl );
mesg( "\t" );
}
if( words ) {
dwrite( nw );
mesg( "\t" );
}
if( chars ) {
dwrite( nc );
mesg( "\t" );
}
mesg( fname );
mesg( "\n" );
} /* end wc */
emsg( str )
char *str;
{
write( STDERR, str, strlen( str ));
}
mesg( str )
char *str;
{
write( STDOUT, str, strlen( str ));
}
/* dwrite
* Print out the ascii representation of a long integer and avoid
* dragging in 'printf' in the process.
*/
dwrite( num )
register long num;
{
register long int i;
int digit;
if( (i = num/10) != 0)
dwrite( i );
digit = num%10 + '0';
write( STDOUT, &digit, 1 );
}
More information about the Comp.sources.unix
mailing list