[comp.sources.apple2] v001SRC017: sort -- Sort Text Files In Memory

jac@yoko.rutgers.edu (Jonathan A. Chandross) (12/02/90)

Submitted-by: NONE
Posting-number: Volume 1, Source:17
Archive-name: util/sort
Architecture: ANY_2
Version-number: 1.00

This C utility sorts text files in memory.  Both normal and reverse
sorting are supported.

Enjoy.


=sort.c
-/*
- * sort.c
- *
- * Sort text files in memory.
- *
- * Usage:
- * 	sort [-r] [file_1] [file_2] [file_3] [...]
- *
- * 	Options:
- *		-r	sort in reverse order
- *
- *	If no file is specified, sort reads from standard in.
- *
- * Contributed Anonymously.  Written: November 1983
- *
- * Version 1.00
- *
- */
-
-#include "stdio.h"
-
-#define TRUE  1
-#define FALSE 0
-#define NL    '\n'
-#define EOS   '\0'
-#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 */
-
+ END OF ARCHIVE