Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1exp 11/4/83; site ihuxl.UUCP Path: utzoo!linus!decvax!harpo!floyd!clyde!ihnp4!ihuxl!dcn From: dcn@ihuxl.UUCP (Dave Newkirk) Newsgroups: net.sources Subject: Aztec C source - sort.c Message-ID: <740@ihuxl.UUCP> Date: Mon, 14-Nov-83 09:30:13 EST Article-I.D.: ihuxl.740 Posted: Mon Nov 14 09:30:13 1983 Date-Received: Tue, 15-Nov-83 06:35:45 EST Organization: AT&T Bell Labs, Naperville, Il Lines: 174 /* 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 */