Turbo C & qsort()
Scott W. Leonard
pmswl at dcatla.UUCP
Sat Feb 4 03:35:18 AEST 1989
I hope one of you C wizards can help me. I've written a directory
program using Turbo C 2.0. I'm to the point of cleaning it up a
bit. I currently have a file sort function, but it is a bit bulky
and time consuming. I would really like to use Turbo's 'qsort'
function. I've tried it about every way possible, but nothing
seems to work for me.
I would also like to know if it is possible to directly load my
'files' array from findfirst/next. Right now I'm copying everything
from 'struct ffblk' to my own array which takes a little time.
I've included a sample program that is a simplified version of
the program/problem.
Any help at all will be appreciated.
/* This is the sample. Compiled with Turbo C 2.0 */
#define FA_RDWR 0
#define FA_ALL FA_RDONLY+FA_HIDDEN+FA_SYSTEM+FA_ARCH+FA_RDWR+FA_DIREC
#define FILESMAX 512 /* max. number of files */
#include <alloc.h>
#include <dir.h>
#include <dos.h>
#include <stdio.h>
struct{ /* this is the main structure */
char far *names[FILESMAX]; /* stores file names in far */
int attrs[FILESMAX]; /* file attributes */
unsigned fil_time[FILESMAX]; /* file times */
unsigned fil_date[FILESMAX]; /* file dates */
long f_size[FILESMAX]; /* file sizes */
}files;
main()
{
char name2[ 80 ]; /* dummy var for displaying names */
int ndx; /* pointer to file */
int x; /* return from findfirst/next */
int nfiles; /* total number of files found */
register i; /* dummy for for loop */
struct ffblk r; /* struct used by findfirst/next */
ndx = nfiles = 0; /* init pointers to beginning */
x = findfirst( "*.*", &r, FA_ALL ); /* get first file */
while( !x ){ /* until no more */
/* init. all to zero */
files.attrs[ ndx ] = files.f_size[ ndx ] = 0;
files.fil_time[ ndx ] = files.fil_date[ ndx ] = 0;
/* copy theirs to mine */
files.fil_time[ ndx ] = r.ff_ftime;
files.fil_date[ ndx ] = r.ff_fdate;
files.attrs[ ndx ] = r.ff_attrib;
files.f_size[ ndx ] = r.ff_fsize;
files.names[ ndx ] = farmalloc(strlen(r.ff_name) + 1);
/* only way I can figure to copy to far */
for( i = 0 ; i <= strlen(r.ff_name) ; i++ )
files.names[ndx][i] = r.ff_name[i];
ndx++; /* inc. file pointer */
nfiles++; /* inc. total # of files */
x = findnext( &r ); /* get next file */
}
/* qsort( ?, ?, ?, ? ); */ /* the big question mark */
for( i = 0 ; i < nfiles ; i++ ){ /* just for display */
sprintf( name2, "%Fs", files.names[ i ] ); /* purpose */
printf( "%s\n", name2 );
}
}
--
==========================================================================
Scott W. Leonard
Digital Communications Associates
Alpharetta, Georgia 30201 pmswl at dcatla.com or gatech!dcatla!pmswl
More information about the Comp.lang.c
mailing list