pmswl@dcatla.UUCP (Scott W. Leonard) (02/04/89)
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@dcatla.com or gatech!dcatla!pmswl