Mercurial > geeqie
changeset 779:8b21337bc47b
filelist_read_real(): optimize and clean up.
author | zas_ |
---|---|
date | Tue, 03 Jun 2008 09:41:00 +0000 |
parents | 21ec5e6d3ddf |
children | 44128da39e13 |
files | src/filedata.c |
diffstat | 1 files changed, 43 insertions(+), 36 deletions(-) [+] |
line wrap: on
line diff
--- a/src/filedata.c Tue Jun 03 09:03:33 2008 +0000 +++ b/src/filedata.c Tue Jun 03 09:41:00 2008 +0000 @@ -620,65 +620,72 @@ { DIR *dp; struct dirent *dir; - struct stat ent_sbuf; gchar *pathl; - GList *dlist; - GList *flist; + GList *dlist = NULL; + GList *flist = NULL; + int (*stat_func)(const char *path, struct stat *buf); - dlist = NULL; - flist = NULL; + g_assert(files || dirs); + + if (files) *files = NULL; + if (dirs) *dirs = NULL; pathl = path_from_utf8(path); - if (!pathl || (dp = opendir(pathl)) == NULL) + if (!pathl) return FALSE; + + dp = opendir(pathl); + if (dp == NULL) { g_free(pathl); - if (files) *files = NULL; - if (dirs) *dirs = NULL; return FALSE; } + if (follow_symlinks) + stat_func = stat; + else + stat_func = lstat; + while ((dir = readdir(dp)) != NULL) { - gchar *name = dir->d_name; - if (options->file_filter.show_hidden_files || !ishidden(name)) + struct stat ent_sbuf; + const gchar *name = dir->d_name; + gchar *filepath; + + if (!options->file_filter.show_hidden_files && ishidden(name)) + continue; + + filepath = g_build_filename(pathl, name, NULL); + if (stat_func(filepath, &ent_sbuf) >= 0) { - gchar *filepath = g_build_filename(pathl, name, NULL); - if ((follow_symlinks ? - stat(filepath, &ent_sbuf) : - lstat(filepath, &ent_sbuf)) >= 0) + if (S_ISDIR(ent_sbuf.st_mode)) { - if (S_ISDIR(ent_sbuf.st_mode)) + /* we ignore the .thumbnails dir for cleanliness */ + if (dirs && + !(name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) && + strcmp(name, GQ_CACHE_LOCAL_THUMB) != 0 && + strcmp(name, GQ_CACHE_LOCAL_METADATA) != 0 && + strcmp(name, THUMB_FOLDER_LOCAL) != 0) { - /* we ignore the .thumbnails dir for cleanliness */ - if ((dirs) && - !(name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) && - strcmp(name, GQ_CACHE_LOCAL_THUMB) != 0 && - strcmp(name, GQ_CACHE_LOCAL_METADATA) != 0 && - strcmp(name, THUMB_FOLDER_LOCAL) != 0) - { - dlist = g_list_prepend(dlist, file_data_new_local(filepath, &ent_sbuf, FALSE)); - } - } - else - { - if ((files) && filter_name_exists(name)) - { - flist = g_list_prepend(flist, file_data_new_local(filepath, &ent_sbuf, TRUE)); - } + dlist = g_list_prepend(dlist, file_data_new_local(filepath, &ent_sbuf, FALSE)); } } - g_free(filepath); + else + { + if (files && filter_name_exists(name)) + { + flist = g_list_prepend(flist, file_data_new_local(filepath, &ent_sbuf, TRUE)); + } + } } + g_free(filepath); } closedir(dp); - + g_free(pathl); - flist = filelist_filter_out_sidecars(flist); - if (dirs) *dirs = dlist; - if (files) *files = flist; + if (files) *files = filelist_filter_out_sidecars(flist); return TRUE; }