Rewrite Read_list_of_files() to make use of For_each_directory_entry()
This commit is contained in:
parent
cb936b24e7
commit
2ef2e04a7e
139
src/filesel.c
139
src/filesel.c
@ -29,16 +29,11 @@
|
|||||||
#if defined(__amigaos4__) || defined(__AROS__) || defined(__MORPHOS__) || defined(__amigaos__)
|
#if defined(__amigaos4__) || defined(__AROS__) || defined(__MORPHOS__) || defined(__amigaos__)
|
||||||
#include <proto/dos.h>
|
#include <proto/dos.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <dirent.h>
|
|
||||||
#elif defined (__MINT__)
|
#elif defined (__MINT__)
|
||||||
#include <mint/sysbind.h>
|
#include <mint/sysbind.h>
|
||||||
#include <dirent.h>
|
|
||||||
#elif defined(__WIN32__)
|
#elif defined(__WIN32__)
|
||||||
#include <dirent.h>
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <commdlg.h>
|
#include <commdlg.h>
|
||||||
#else
|
|
||||||
#include <dirent.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -49,7 +44,6 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "const.h"
|
#include "const.h"
|
||||||
@ -372,15 +366,76 @@ int Check_extension(const char *filename, const char * filter)
|
|||||||
|
|
||||||
|
|
||||||
// -- Lecture d'une liste de fichiers ---------------------------------------
|
// -- 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)
|
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
|
// Cette procédure charge dans la liste chainée les fichiers dont l'extension
|
||||||
// correspond au format demandé.
|
// correspond au format demandé.
|
||||||
{
|
{
|
||||||
DIR* current_directory; //Répertoire courant
|
struct Read_dir_pdata callback_data;
|
||||||
struct dirent* entry; // Structure de lecture des éléments
|
const char * current_path = NULL;
|
||||||
char * filter = "*"; // Extension demandée
|
|
||||||
struct stat Infos_enreg;
|
|
||||||
char * current_path = NULL;
|
|
||||||
char curdir[MAX_PATH_CHARACTERS];
|
char curdir[MAX_PATH_CHARACTERS];
|
||||||
#if defined (__MINT__)
|
#if defined (__MINT__)
|
||||||
char path[1024]={0};
|
char path[1024]={0};
|
||||||
@ -392,8 +447,9 @@ void Read_list_of_files(T_Fileselector *list, byte selected_format)
|
|||||||
path2[0]='\0';
|
path2[0]='\0';
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
callback_data.list = list;
|
||||||
// Tout d'abord, on déduit du format demandé un filtre à utiliser:
|
// 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:
|
// Ensuite, on vide la liste actuelle:
|
||||||
Free_fileselector_list(list);
|
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);
|
sprintf(path2,"%c:\%s",currentDrive,path);
|
||||||
|
|
||||||
strcat(path2,PATH_SEPARATOR);
|
strcat(path2,PATH_SEPARATOR);
|
||||||
current_directory=opendir(path2);
|
current_path=path2;
|
||||||
#else
|
#else
|
||||||
current_path=getcwd(curdir,MAX_PATH_CHARACTERS);
|
current_path=getcwd(curdir,MAX_PATH_CHARACTERS);
|
||||||
current_directory=opendir(current_path);
|
|
||||||
#endif
|
#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
|
For_each_directory_entry(current_path, &callback_data, Read_dir_callback);
|
||||||
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++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now here's OS-specific code to determine if "parent directory" entry
|
// Now here's OS-specific code to determine if "parent directory" entry
|
||||||
// should appear.
|
// should appear.
|
||||||
@ -517,7 +519,6 @@ void Read_list_of_files(T_Fileselector *list, byte selected_format)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
closedir(current_directory);
|
|
||||||
current_path = NULL;
|
current_path = NULL;
|
||||||
|
|
||||||
if (list->Nb_files==0 && list->Nb_directories==0)
|
if (list->Nb_files==0 && list->Nb_directories==0)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user