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