#if defined(WIN32) || defined(WIN64)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <direct.h>

#include "ListeFichiers.h"

//static char currentdir[500] ;
//static int currentdrv ;
//static char listeVide[1][3] = {{ "" }};

ListeFichiers::ListeFichiers(void) {
  l = 0;
  liste = NULL;
  typeItem = NULL;
}

int repertoire(_finddata_t *fileinfo) {
  if ( !(fileinfo->attrib&_A_SUBDIR) )
    return(0) ;
  if ( ( fileinfo->name[0] == '.' ) && ( fileinfo->name[1] == 0x00 ) )
    return(0) ;
  if ( ( fileinfo->name[0] == '.' ) && ( fileinfo->name[1] == '.' ) && ( fileinfo->name[2] == 0x00 ) )
    return(0) ;
  return(1) ;
}

ListeFichiers::ListeFichiers(const char *filtre,const char *dir) {
  l = 0;
  liste = NULL;
  typeItem = NULL;
  char rep[512];
  strcpy(rep,dir);
  { int len =(int) strlen(rep)-1;
    while ( ( len >= 0 ) && ( rep[len] == ' ' ) ) {
      rep[len] = 0x00;
      len--; } }
  int cp = 0 ;
  /*int *drives = drivesPresents() ;
  cp += nombreDrives() ;
  int cdrv = _getdrive() ;
  _chdrive(unit) ;*/
  char cdir[500] ;
  if ( _getcwd(cdir,499) )
    printf("Erreur getcwd\n");
  if ( _chdir(dir) == -1 )
    printf("Erreur chdir\n");
  _finddata_t fileinfo ;
  long h ;
  if ( ( h=(long) _findfirst(filtre,&fileinfo)) != -1 ) {
    cp++ ;
    while ( _findnext(h,&fileinfo) != -1 )
      cp++ ;
    _findclose(h) ; }
 /* if ( ( h=(long) _findfirst("*.*",&fileinfo)) != -1 ) {
    if ( repertoire(&fileinfo) )
      cp++ ;
    while ( _findnext(h,&fileinfo) != -1 )
      if ( repertoire(&fileinfo) )
        cp++ ;
    _findclose(h) ; }*/
  if ( cp == 0 ) {
    liste = NULL;
    if ( _chdir(cdir) == -1 )
      printf("Erreur chdir\n");
    return ; }
  int np = cp ;
  liste =(char **) calloc(cp,sizeof(char *)) ;
  typeItem =(int *) calloc(cp,sizeof(int)) ;
  if ( liste && typeItem ) {
    for ( int i = np ; i < cp ; i++ )
      liste[i] = (char *) calloc(1,sizeof(char)) ;
    cp = 0 ;
    if ( ( h=(long) _findfirst(filtre,&fileinfo)) != -1 ) {
      liste[cp] =(char *) calloc(strlen(rep)+strlen(fileinfo.name)+2,sizeof(char)) ;
      if ( liste[cp] ) {
        sprintf(liste[cp],"%s/%s",rep,fileinfo.name) ; }
      typeItem[cp] = 2 ;
      cp++ ;
      while ( _findnext(h,&fileinfo) != -1 ) {
        liste[cp] =(char *) calloc(strlen(rep)+strlen(fileinfo.name)+2,sizeof(char)) ;
        if ( liste[cp] ) {
          sprintf(liste[cp],"%s/%s",rep,fileinfo.name) ; }
        typeItem[cp] = 2 ;
        cp++ ; }
      _findclose(h) ; }
  /*  if ( ( h=(long) _findfirst("*.*",&fileinfo)) != -1 ) {
      if ( repertoire(&fileinfo) ) {
        liste[cp] =(char *) calloc(strlen(fileinfo.name)+1,sizeof(char)) ;
        strcpy(liste[cp],fileinfo.name) ;
        typeItem[cp] = 3 ;
        cp++ ; }
      while ( _findnext(h,&fileinfo) != -1 )
        if ( repertoire(&fileinfo) ) {
          liste[cp] =(char *) calloc(strlen(fileinfo.name)+1,sizeof(char)) ;
          strcpy(liste[cp],fileinfo.name) ;
          typeItem[cp] = 3 ;
          cp++ ; }
      _findclose(h) ; }*/
    if ( _chdir(cdir) == -1 )
      printf("Erreur chdir\n");
  //  _chdrive(cdrv) ;
    l = cp; }
}

ListeFichiers::~ListeFichiers(void) {
  if ( liste ) {
    for ( int i = 0 ; i < l ; i++ ) {
      if ( liste[i] )
        free(liste[i]); }
    free(liste); }
  if ( typeItem ) 
    free(typeItem);
}

char **ListeFichiers::listeFichiers(void) {
  return(liste);
}
 
int ListeFichiers::size(void) {
  return(l);
}

#else

#include <stdio.h>
#include <stdlib.h>

#include "ListeFichiers.h"

ListeFichiers::ListeFichiers(const char *filtre,const char *dir) {
}

ListeFichiers::~ListeFichiers(void) {
  for ( int i = 0 ; i < l ; i++ ) {
    free(liste[i]) ; }
  free(liste) ;
  free(typeItem) ;
}

char **ListeFichiers::listeFichiers(void) {
  return(liste);
}
 
int ListeFichiers::size(void) {
  return(l);
}

#endif

/*#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>

static char **liste ;
static int *typeItem ;
static int fmin ;
static int fmax ;
static char currentdir[500] ;
static int currentdrv ;
static char *filtre ;
static int lliste ;
static char listeVide[1][3] = {{ "" }};

char *trouveJoker(char *joker) {
  char *jk;
  int i;
  for ( i = strlen(joker)-1 ; ( i > 0 ) && ( joker[i] != '.' ) ; i-- );
  jk = &joker[i+1];
  return(jk);
}

int bonJoker(char *jk,char *st) {
  int l = strlen(jk);
  int lst = strlen(st);
  printf("%s %s\n",jk,st);
  for ( int i = 0 ; i < l ; i++ )
    if ( jk[l-1-i] != st[lst-1-i] )
      return(0);
  return(1);
}

int bonRepertoire(dirent *s) {
  if ( s->d_type == DT_DIR ) {
    if ( ( s->d_name[0] == '.' ) && ( s->d_name[1] == 0x00 ) )
      return(0) ;
    if ( ( s->d_name[0] == '.' ) && ( s->d_name[1] == '.' ) && ( s->d_name[2] == 0x00 ) )
      return(0) ;
    return(1) ; }
  return(0);
}

void liberationListeFichiers(void) {
  for ( int i = 0 ; i < lliste ; i++ ) {
    free(liste[i]) ; }
  free(liste) ;
  free(typeItem) ;
}

char **listeFichiers(char *filtre,char *dir,int unit,int *nl) {
  char st[300];
  strcpy(st,dir);
  strcat(st,"/");
  int cp = 0 ;
  char *jk = trouveJoker(filtre);
  printf("%s\n",jk);
  dirent *dp;
  DIR *dirp = opendir(st);
  while ( (dp = readdir(dirp)) != NULL )
    if ( bonRepertoire(dp) || bonJoker(jk,dp->d_name) )
      cp++;
  closedir(dirp);
  if ( cp == 0 )
    return(NULL) ;
  int np = cp ;
  if ( cp < 9 )
    cp = 9 ;
  *nl = lliste = cp ;
  char **strs =(char **) calloc(cp,sizeof(char *)) ;
  typeItem =(int *) calloc(cp,sizeof(int)) ;
  for ( int i = np ; i < cp ; i++ )
    strs[i] = (char *) calloc(1,sizeof(char)) ;
  cp = 0 ;
  fmin = cp ;
  dirp = opendir(st);
  while ( (dp = readdir(dirp)) != NULL )
    if ( bonRepertoire(dp) || bonJoker(jk,dp->d_name) ) {
      strs[cp] =(char *) calloc(strlen(dp->d_name)+1,sizeof(char)) ;
      strcpy(strs[cp],dp->d_name) ;
      switch ( dp->d_type ) {
        case DT_DIR : typeItem[cp] = 3 ;
                      break;
        case DT_REG : typeItem[cp] = 2 ;
                      break; }
        cp++ ; }
  closedir(dirp);
  fmax = cp-1 ;
  return(strs) ;
}
*/
