#include <sys/types.h>
#include <sys/dir.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <com_err.h>
#include "q.h"

#define Q_DIR_BLK 50

static char whoami[] = "Q";

static int
dir_comp (s1, s2)
     const void* s1;
     const void* s2;
{
  if ((*(char**) s1)[0] == '.') {
    if ((*(char**) s2)[0] == '.')
      return strcmp ( *(char**)s1, *(char**)s2 );
    else
      return -1;
  }
  else {
    if ((*(char**) s2)[0] == '.')
      return 1;
    else
      return strcmp ( *(char**)s1, *(char**)s2 );
  }
}

int
Q_get_directory(dir, flist)
     char* dir;
     Files* flist;
{
  DIR *curr;
  Q_DIR_ENTRY *entry;
  Files files;
  int entries = Q_DIR_BLK;
  int fnum = 0;

  curr = opendir(dir);

  if (curr == NULL) {
    com_err(whoami, errno, "while trying to open directory '%s'\n", dir);
    exit (1);
  }

  files = (Files) Q_malloc (entries * sizeof(char*));

  while ((entry = readdir(curr)) != NULL)
    {
      if (fnum > (entries-2)) {          /* counting the terminating NULL */
	entries += Q_DIR_BLK;
	files = (Files) Q_realloc (files, entries * sizeof(char*));
      }

      files[fnum] = (char*) Q_malloc ((strlen(entry->d_name)+1)
				      * sizeof(char));
      strcpy(files[fnum], entry->d_name);

      fnum++;
    }

  files[fnum] = NULL;

  files = (Files) Q_realloc (files, (fnum+1) * sizeof(char*));

  closedir(curr);

  qsort( (void*) files, fnum, sizeof(char*), &dir_comp );

  *flist = files;      /* return value */
  return(fnum);
}

void
Q_free_directory(files)
char** files;
{
  int freeme;

  for(freeme = 0; files[freeme] != NULL; freeme++ ) {
    Q_free (files[freeme]);
  }
  Q_free (files);
}
