/*
    Program relies on definitions of _MSC_VER or __TURBOC__
    to account for compiler differences between Turbo C and
    Microsoft C. These values are predefined.
*/

#if defined( _MSC_VER )

#include <malloc.h>
#include <direct.h>

        /* Turbo */             /* Microsoft */
/* translate structure name and members */
#define ffblk                   find_t
#define ff_reserved             reserved
#define ff_attrib               attrib
#define ff_ftime                wr_time
#define ff_fdate                wr_date
#define ff_fsize                size
#define ff_name                 name
/* translate attribute mask defines */
#define FA_RDONLY               _A_RDONLY
#define FA_HIDDEN               _A_HIDDEN
#define FA_SYSTEM               _A_SYSTEM
#define FA_LABEL                _A_VOLID
#define FA_DIREC                _A_SUBDIR
#define FA_ARCH                 _A_ARCH
/*
   use macros to substitute functions and
   swap argument order
*/
#define findfirst( a , b , c )  _dos_findfirst((a),(c),(b))
#define findnext( a )           _dos_findnext((a))

/* end of _MSC_VER */
#elif defined( __TURBOC__ )

#include <dir.h>
#include <alloc.h>

#endif /* __TURBOC__ */

#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>


/* defines */
#define VERSION    "NO_DUP Ver 1.0, Jerzy Tomasik (c) 1990"
#define ALL_FILES  0xFFFF      /* flag for _dos_find??? */
#define MAX_LINE   80
#define MAX_PATH   80
#define MAX_FLEN   13
#define MAX_FILES  15000
#define SEPARATOR  "************\n"

/* data definitions and declarations */

typedef enum { False, True } Flag;

/*
    DirEntry structure holds data for all files
*/
typedef struct DirEntry
    {
    char *path;
    char name[13];
    char attrib;
    unsigned time;
    unsigned date;
    long size;
    Flag dir_processed;
    } DirEntry;

/*
    DirList structure holds the listing of all
    subdirectories on a disk
*/
typedef struct DirList
    {
    char pathname[MAX_PATH];
    Flag dir_processed;
    struct DirList *prev;
    struct DirList *next;
    } DirList;

typedef struct
    {
    Flag dir;
    Flag file;
    unsigned int  file_count;
    unsigned long total_file_size;
    } GlobalOpt;

typedef char *PtrList;

/* function prototypes */

DirEntry *get_direntry     ( char * );
DirList  *make_path        ( char *, char *, DirList * );
DirList  *get_path         ( DirList * );
int       name_comp        ( const void *, const void * );
char     *datestr          ( unsigned d, char *buf );
char     *timestr          ( unsigned t, char *buf );
void      fprint_direntry  ( FILE *, DirEntry * );
