Turbo C & qsort()

Scott W. Leonard pmswl at dcatla.UUCP
Mon Jan 30 22:44:55 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