home *** CD-ROM | disk | FTP | other *** search
- Path: wuarchive!usc!cs.utexas.edu!uwm.edu!rutgers!aramis.rutgers.edu!paul.rutgers.edu!yoko.rutgers.edu!jac
- From: jac@yoko.rutgers.edu (Jonathan A. Chandross)
- Newsgroups: comp.sources.apple2
- Subject: v001SRC017: sort -- Sort Text Files In Memory
- Message-ID: <Dec.1.16.57.50.1990.24860@yoko.rutgers.edu>
- Date: 1 Dec 90 21:57:51 GMT
- Organization: Rutgers Univ., New Brunswick, N.J.
- Lines: 210
- Approved: jac@paul.rutgers.edu
-
-
- 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
-