// CS2604 : Data Structures
// Hussein Suleman
// 22 July 1999
// Project 3

// DirectoryReader class definition
// DirectoryReader reads in a directory using a standard interface that can
// be compiled under either VC++ or G++

// ---------------------------------------------------------------------

#include "dir.h"

// constructor - saves old dir, changes to new one and starts reading 
// entries

DirectoryReader::DirectoryReader ( char *dir )
{
   getcwd (OldDir, sizeof (OldDir));
   chdir (dir);
#ifndef WIN32
   aDir = opendir (".");
#endif
   FirstTime = 1;
}

// destructor - stops reading directory entries and changes to old dir

DirectoryReader::~DirectoryReader ()
{
#ifdef WIN32
   _findclose (hfile);
#else
   closedir (aDir);
#endif
   chdir (OldDir);
}

// retrieve a single name from the directory

// parameters :
//  filename = pointer to buffer for filename
//  length   = size of buffer
// returns :
//  0 = no more entries
//  1 = valid filename
//  2 = valid directory name

int DirectoryReader::GetName ( char *filename, unsigned int length )
{
   if (FirstTime)
   {
#ifdef WIN32
      Entry = hfile = _findfirst ("*.*", &c_file);
#else
      Entry = readdir (aDir);
#endif
      FirstTime = 0;
   }
   else
   {
#ifdef WIN32
      Entry = _findnext (hfile, &c_file);
#else
      Entry = readdir(aDir);
#endif
   }
#ifdef WIN32
   if (Entry == -1)
   {
      strcpy (filename, "Done");
      return 0;
   }
   else if (strlen (c_file.name) <= length)
      strcpy (filename, c_file.name);
#else
   if (Entry == NULL)
   {
      strcpy (filename, "Done");
      return 0;
   }
   else if (strlen (Entry->d_name) <= length)
      strcpy (filename, Entry->d_name);
#endif
   
   struct stat Buffer;
   stat (filename, &Buffer);

   return ((Buffer.st_mode & _S_IFDIR)>0)?2:1;
}
