Aztec C source - sort.c
Dave Newkirk
dcn at ihuxl.UUCP
Tue Nov 15 00:30:13 AEST 1983
/* sort - sort text files in memory */
#include "stdio.h"
#define MAXTEXT 16384
#define MAXPTR 1024
char linebuf[MAXTEXT] ;
char *lineptr[MAXPTR] ;
int reverse ;
main(argc, argv)
int argc ;
char *argv[] ;
{
char *s ;
FILE *input ;
reverse = FALSE ;
while( --argc>0 && **++argv == '-' )
for( s=&argv[0][1] ; *s != EOS ; s++ )
switch( *s ) {
case 'r':
reverse = TRUE ;
break ;
default:
fprintf(stderr, "sort: unknown option %c\n", *s ) ;
argc = -1 ;
break ;
}
if( argc < 0 ) {
fprintf(stderr, "usage: sort files\n");
exit(1) ;
}
if( argc == 0 )
sort( stdin, "stdin" ) ;
else
for( ; argc>0 ; argc--,argv++)
if( (input=fopen(*argv,"r")) == NULL ) {
fprintf(stderr, "sort: can't open %s\n", *argv) ;
exit(1) ;
}
else {
sort( input, *argv ) ;
fclose( input ) ;
}
exit(0) ;
} /* end main */
/* sort - sort text files in memory */
sort( in, fname )
FILE *in ;
char *fname ;
{
int nlines ;
if( (nlines=readlines(in)) > 0 ) {
sortlines( 0, nlines-1 ) ;
printlines( stdout, nlines ) ;
}
else if( nlines < 0 )
fprintf(stderr, "sort: file is too large: %s\n", fname ) ;
} /* end sort */
/* readlines - store text in linebuf */
readlines( in )
FILE *in ;
{
int nlines, len ;
char *lbptr, *endbuffer ;
nlines = 0 ;
lbptr = &linebuf[0] ;
endbuffer = &linebuf[MAXTEXT-1] ;
do {
if( (len = getline(lbptr, in)) == EOF )
return nlines ;
lineptr[ nlines ] = lbptr ;
nlines++ ;
lbptr += len + 1 ; /* 1 for EOS */
} while( lbptr < endbuffer && nlines < MAXPTR ) ;
return EOF ;
} /* end readlines */
/* sortlines - quicksort on pointers */
sortlines( left, right )
int left, right ;
{
int l, r, middle ;
char *pivot, *temp ;
l = left ; r = right ;
middle = (l + r) / 2 ;
pivot = lineptr[ middle ] ;
do {
while( strcmp(lineptr[l],pivot) < 0 )
l++ ;
while( strcmp(pivot,lineptr[r]) < 0 )
r-- ;
if( l <= r ) {
temp = lineptr[l] ;
lineptr[l] = lineptr[r] ;
lineptr[r] = temp ;
l++ ;
r-- ;
}
} while( l <= r ) ;
if( left < r )
sortlines( left, r ) ;
if( l < right )
sortlines( l, right ) ;
} /* end sortlines */
/* printlines */
printlines( out, nlines )
FILE *out ;
int nlines ;
{
int i ;
if( reverse )
for( i=nlines-1 ; i >= 0 ; i-- )
fprintf( out, "%s", lineptr[i] ) ;
else
for( i=0 ; i < nlines ; i++ )
fprintf( out, "%s", lineptr[i] ) ;
} /* end printlines */
/* getline - read input line */
getline( ptr, input )
char *ptr ;
FILE *input ;
{
int c ;
char *bufptr ;
bufptr = ptr ;
while( (c=agetc(input)) != NL ) {
if( c == EOF )
return EOF ;
*bufptr++ = c ;
}
*bufptr++ = NL ;
*bufptr++ = EOS ;
return bufptr - ptr ;
} /* end getline */
More information about the Comp.sources.unix
mailing list