Rewrite Read_list_of_files() to make use of For_each_directory_entry()
This commit is contained in:
		
							parent
							
								
									cb936b24e7
								
							
						
					
					
						commit
						2ef2e04a7e
					
				
							
								
								
									
										141
									
								
								src/filesel.c
									
									
									
									
									
								
							
							
						
						
									
										141
									
								
								src/filesel.c
									
									
									
									
									
								
							@ -29,16 +29,11 @@
 | 
			
		||||
#if defined(__amigaos4__) || defined(__AROS__) || defined(__MORPHOS__) || defined(__amigaos__)
 | 
			
		||||
    #include <proto/dos.h>
 | 
			
		||||
    #include <sys/types.h>
 | 
			
		||||
    #include <dirent.h>
 | 
			
		||||
#elif defined (__MINT__)
 | 
			
		||||
    #include <mint/sysbind.h>
 | 
			
		||||
    #include <dirent.h>
 | 
			
		||||
#elif defined(__WIN32__)
 | 
			
		||||
    #include <dirent.h>
 | 
			
		||||
    #include <windows.h>
 | 
			
		||||
    #include <commdlg.h>
 | 
			
		||||
#else
 | 
			
		||||
    #include <dirent.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@ -49,7 +44,6 @@
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#include "const.h"
 | 
			
		||||
@ -372,15 +366,76 @@ int Check_extension(const char *filename, const char * filter)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// -- Lecture d'une liste de fichiers ---------------------------------------
 | 
			
		||||
struct Read_dir_pdata
 | 
			
		||||
{
 | 
			
		||||
  T_Fileselector *list;
 | 
			
		||||
  const char * filter;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void Read_dir_callback(void * pdata, const char *file_name, const word *unicode_name, byte is_file, byte is_directory, byte is_hidden)
 | 
			
		||||
{
 | 
			
		||||
  struct Read_dir_pdata * p = (struct Read_dir_pdata *)pdata;
 | 
			
		||||
  (void)unicode_name;
 | 
			
		||||
 | 
			
		||||
  if (p == NULL) // error !
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  // Ignore 'current directory' entry
 | 
			
		||||
  if ( !strcmp(file_name, "."))
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  // entries tagged "directory" :
 | 
			
		||||
  if (is_directory)
 | 
			
		||||
  {
 | 
			
		||||
    // On Windows, the presence of a "parent directory" entry has proven
 | 
			
		||||
    // unreliable on non-physical drives :
 | 
			
		||||
    // Sometimes it's missing, sometimes it's present even at root...
 | 
			
		||||
    // We skip it here and add a specific check after the loop
 | 
			
		||||
#if defined(__WIN32__)
 | 
			
		||||
    if (!strcmp(file_name, PARENT_DIR))
 | 
			
		||||
      return;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // Don't display hidden file, unless requested by options
 | 
			
		||||
    if (!Config.Show_hidden_directories && is_hidden)
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
    // Add to list
 | 
			
		||||
    Add_element_to_list(p->list, file_name, Format_filename(file_name, 19, 1), 1, ICON_NONE);
 | 
			
		||||
    p->list->Nb_directories++;
 | 
			
		||||
  }
 | 
			
		||||
  else if (is_file && // It's a file
 | 
			
		||||
          (Config.Show_hidden_files || !is_hidden))
 | 
			
		||||
  {
 | 
			
		||||
    const char * ext = p->filter;
 | 
			
		||||
    while (ext!=NULL)
 | 
			
		||||
    {
 | 
			
		||||
      if (Check_extension(file_name, ext))
 | 
			
		||||
      {
 | 
			
		||||
        // Add to list
 | 
			
		||||
        Add_element_to_list(p->list, file_name, Format_filename(file_name, 19, 0), 0, ICON_NONE);
 | 
			
		||||
        p->list->Nb_files++;
 | 
			
		||||
        // Stop searching
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
        ext = strchr(ext, ';');
 | 
			
		||||
        if (ext)
 | 
			
		||||
          ext++;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void Read_list_of_files(T_Fileselector *list, byte selected_format)
 | 
			
		||||
//  Cette procédure charge dans la liste chainée les fichiers dont l'extension
 | 
			
		||||
// correspond au format demandé.
 | 
			
		||||
{
 | 
			
		||||
  DIR*  current_directory; //Répertoire courant
 | 
			
		||||
  struct dirent* entry; // Structure de lecture des éléments
 | 
			
		||||
  char * filter = "*"; // Extension demandée
 | 
			
		||||
  struct stat Infos_enreg;
 | 
			
		||||
  char * current_path = NULL;
 | 
			
		||||
  struct Read_dir_pdata callback_data;
 | 
			
		||||
  const char * current_path = NULL;
 | 
			
		||||
  char curdir[MAX_PATH_CHARACTERS];
 | 
			
		||||
#if defined (__MINT__)
 | 
			
		||||
  char path[1024]={0};
 | 
			
		||||
@ -391,9 +446,10 @@ void Read_list_of_files(T_Fileselector *list, byte selected_format)
 | 
			
		||||
  path[0]='\0';
 | 
			
		||||
  path2[0]='\0';  
 | 
			
		||||
#endif
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  callback_data.list = list;
 | 
			
		||||
  // Tout d'abord, on déduit du format demandé un filtre à utiliser:
 | 
			
		||||
  filter = Get_fileformat(selected_format)->Extensions;
 | 
			
		||||
  callback_data.filter = Get_fileformat(selected_format)->Extensions;
 | 
			
		||||
 | 
			
		||||
  // Ensuite, on vide la liste actuelle:
 | 
			
		||||
  Free_fileselector_list(list);
 | 
			
		||||
@ -409,66 +465,12 @@ void Read_list_of_files(T_Fileselector *list, byte selected_format)
 | 
			
		||||
  sprintf(path2,"%c:\%s",currentDrive,path);
 | 
			
		||||
 
 | 
			
		||||
  strcat(path2,PATH_SEPARATOR);
 | 
			
		||||
  current_directory=opendir(path2);
 | 
			
		||||
  current_path=path2;
 | 
			
		||||
#else  
 | 
			
		||||
  current_path=getcwd(curdir,MAX_PATH_CHARACTERS);
 | 
			
		||||
  current_directory=opendir(current_path);
 | 
			
		||||
#endif
 | 
			
		||||
  while ((entry=readdir(current_directory)))
 | 
			
		||||
  {
 | 
			
		||||
    // Ignore 'current directory' entry
 | 
			
		||||
    if ( !strcmp(entry->d_name, "."))
 | 
			
		||||
    {
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
    stat(entry->d_name,&Infos_enreg);
 | 
			
		||||
    // entries tagged "directory" :
 | 
			
		||||
    if( S_ISDIR(Infos_enreg.st_mode))
 | 
			
		||||
    {
 | 
			
		||||
      // On Windows, the presence of a "parent directory" entry has proven
 | 
			
		||||
      // unreliable on non-physical drives :
 | 
			
		||||
      // Sometimes it's missing, sometimes it's present even at root...
 | 
			
		||||
      // We skip it here and add a specific check after the loop
 | 
			
		||||
      #if defined(__WIN32__)
 | 
			
		||||
      if (!strcmp(entry->d_name, PARENT_DIR))
 | 
			
		||||
        continue;
 | 
			
		||||
      #endif
 | 
			
		||||
      
 | 
			
		||||
      // Don't display hidden file, unless requested by options
 | 
			
		||||
      if (!Config.Show_hidden_directories &&
 | 
			
		||||
          File_is_hidden(entry->d_name, entry->d_name))
 | 
			
		||||
      {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Add to list
 | 
			
		||||
      Add_element_to_list(list, entry->d_name, Format_filename(entry->d_name, 19, 1), 1, ICON_NONE);
 | 
			
		||||
      list->Nb_directories++;
 | 
			
		||||
    }
 | 
			
		||||
    else if (S_ISREG(Infos_enreg.st_mode) && // It's a file
 | 
			
		||||
      (Config.Show_hidden_files || // Not hidden
 | 
			
		||||
      !File_is_hidden(entry->d_name, entry->d_name)))
 | 
			
		||||
    {
 | 
			
		||||
      const char * ext = filter;
 | 
			
		||||
      while (ext!=NULL)
 | 
			
		||||
      {      
 | 
			
		||||
        if (Check_extension(entry->d_name, ext))
 | 
			
		||||
        {
 | 
			
		||||
          // Add to list
 | 
			
		||||
          Add_element_to_list(list, entry->d_name, Format_filename(entry->d_name, 19, 0), 0, ICON_NONE);
 | 
			
		||||
          list->Nb_files++;
 | 
			
		||||
          // Stop searching
 | 
			
		||||
          ext=NULL;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
          ext = strchr(ext, ';');
 | 
			
		||||
          if (ext)
 | 
			
		||||
            ext++;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  For_each_directory_entry(current_path, &callback_data, Read_dir_callback);
 | 
			
		||||
  
 | 
			
		||||
  // Now here's OS-specific code to determine if "parent directory" entry
 | 
			
		||||
  // should appear.
 | 
			
		||||
@ -517,7 +519,6 @@ void Read_list_of_files(T_Fileselector *list, byte selected_format)
 | 
			
		||||
  
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  closedir(current_directory);
 | 
			
		||||
  current_path = NULL;
 | 
			
		||||
 | 
			
		||||
  if (list->Nb_files==0 && list->Nb_directories==0)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user