forked from bartvdbraak/blender
Cleanup: current/parent paths: add helpers in BLI_path_utils.
Also, avoid calling ugly strcmp with '.' or '..', making direct char checks is much cheaper here!
This commit is contained in:
parent
fca515838e
commit
7bc6fbf158
@ -228,7 +228,7 @@ static int findFileRecursive(char *filename_new,
|
|||||||
|
|
||||||
while ((de = readdir(dir)) != NULL) {
|
while ((de = readdir(dir)) != NULL) {
|
||||||
|
|
||||||
if (STREQ(".", de->d_name) || STREQ("..", de->d_name))
|
if (FILENAME_IS_CURRPAR(de->d_name))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
BLI_join_dirfile(path, sizeof(path), dirname, de->d_name);
|
BLI_join_dirfile(path, sizeof(path), dirname, de->d_name);
|
||||||
|
@ -2975,7 +2975,7 @@ void BKE_ptcache_remove(void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
while ((de = readdir(dir)) != NULL) {
|
while ((de = readdir(dir)) != NULL) {
|
||||||
if (STREQ(de->d_name, ".") || STREQ(de->d_name, "..")) {
|
if (FILENAME_IS_CURRPAR(de->d_name)) {
|
||||||
/* do nothing */
|
/* do nothing */
|
||||||
}
|
}
|
||||||
else if (strstr(de->d_name, PTCACHE_EXT)) { /* do we have the right extension?*/
|
else if (strstr(de->d_name, PTCACHE_EXT)) { /* do we have the right extension?*/
|
||||||
|
@ -165,6 +165,15 @@ void BLI_string_to_utf8(char *original, char *utf_8, const char *code);
|
|||||||
# define FILE_MAX 1024
|
# define FILE_MAX 1024
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Parent and current dir helpers. */
|
||||||
|
#define FILENAME_PARENT ".."
|
||||||
|
#define FILENAME_CURRENT "."
|
||||||
|
|
||||||
|
/* Avoid calling strcmp on one or two chars! */
|
||||||
|
#define FILENAME_IS_PARENT(_n) (((_n)[0] == '.') && ((_n)[1] == '.') && ((_n)[2] == '\0'))
|
||||||
|
#define FILENAME_IS_CURRENT(_n) (((_n)[0] == '.') && ((_n)[1] == '\0'))
|
||||||
|
#define FILENAME_IS_CURRPAR(_n) (((_n)[0] == '.') && (((_n)[1] == '\0') || (((_n)[1] == '.') && ((_n)[2] == '\0'))))
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -316,7 +316,7 @@ static bool delete_recursive(const char *dir)
|
|||||||
while (i--) {
|
while (i--) {
|
||||||
char file[8];
|
char file[8];
|
||||||
BLI_split_file_part(fl->path, file, sizeof(file));
|
BLI_split_file_part(fl->path, file, sizeof(file));
|
||||||
if (STREQ(file, ".") || STREQ(file, "..")) {
|
if (FILENAME_IS_CURRPAR(file)) {
|
||||||
/* Skip! */
|
/* Skip! */
|
||||||
}
|
}
|
||||||
else if (S_ISDIR(fl->type)) {
|
else if (S_ISDIR(fl->type)) {
|
||||||
@ -584,7 +584,7 @@ static int recursive_operation(const char *startfrom, const char *startto,
|
|||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
const struct dirent * const dirent = dirlist[i];
|
const struct dirent * const dirent = dirlist[i];
|
||||||
|
|
||||||
if (STREQ(dirent->d_name, ".") || STREQ(dirent->d_name, ".."))
|
if (FILENAME_IS_CURRPAR(dirent->d_name))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
join_dirfile_alloc(&from_path, &from_alloc_len, from, dirent->d_name);
|
join_dirfile_alloc(&from_path, &from_alloc_len, from, dirent->d_name);
|
||||||
|
@ -1116,9 +1116,9 @@ void BLI_make_exist(char *dir)
|
|||||||
|
|
||||||
a = strlen(dir);
|
a = strlen(dir);
|
||||||
|
|
||||||
for (BLI_join_dirfile(par_path, sizeof(par_path), dir, "..");
|
for (BLI_join_dirfile(par_path, sizeof(par_path), dir, FILENAME_PARENT);
|
||||||
!(BLI_is_dir(dir) && BLI_exists(par_path));
|
!(BLI_is_dir(dir) && BLI_exists(par_path));
|
||||||
BLI_join_dirfile(par_path, sizeof(par_path), dir, ".."))
|
BLI_join_dirfile(par_path, sizeof(par_path), dir, FILENAME_PARENT))
|
||||||
{
|
{
|
||||||
a--;
|
a--;
|
||||||
while (dir[a] != SEP) {
|
while (dir[a] != SEP) {
|
||||||
|
@ -135,10 +135,10 @@ static int bli_compare(struct direntry *entry1, struct direntry *entry2)
|
|||||||
|
|
||||||
/* OK, now we know their S_IFMT fields are the same, go on to a name comparison */
|
/* OK, now we know their S_IFMT fields are the same, go on to a name comparison */
|
||||||
/* make sure "." and ".." are always first */
|
/* make sure "." and ".." are always first */
|
||||||
if (STREQ(entry1->relname, ".")) return (-1);
|
if (FILENAME_IS_CURRENT(entry1->relname)) return (-1);
|
||||||
if (STREQ(entry2->relname, ".")) return (1);
|
if (FILENAME_IS_CURRENT(entry2->relname)) return (1);
|
||||||
if (STREQ(entry1->relname, "..")) return (-1);
|
if (FILENAME_IS_PARENT(entry1->relname)) return (-1);
|
||||||
if (STREQ(entry2->relname, "..")) return (1);
|
if (FILENAME_IS_PARENT(entry2->relname)) return (1);
|
||||||
|
|
||||||
return (BLI_natstrcmp(entry1->relname, entry2->relname));
|
return (BLI_natstrcmp(entry1->relname, entry2->relname));
|
||||||
}
|
}
|
||||||
|
@ -239,7 +239,7 @@ static void draw_tile(int sx, int sy, int width, int height, int colorid, int sh
|
|||||||
static int get_file_icon(struct direntry *file)
|
static int get_file_icon(struct direntry *file)
|
||||||
{
|
{
|
||||||
if (file->type & S_IFDIR) {
|
if (file->type & S_IFDIR) {
|
||||||
if (STREQ(file->relname, "..")) {
|
if (FILENAME_IS_PARENT(file->relname)) {
|
||||||
return ICON_FILE_PARENT;
|
return ICON_FILE_PARENT;
|
||||||
}
|
}
|
||||||
if (file->flags & FILE_TYPE_APPLICATIONBUNDLE) {
|
if (file->flags & FILE_TYPE_APPLICATIONBUNDLE) {
|
||||||
@ -529,7 +529,7 @@ void file_draw_list(const bContext *C, ARegion *ar)
|
|||||||
int shade = (params->active_file == i) || (file->selflag & FILE_SEL_HIGHLIGHTED) ? 20 : 0;
|
int shade = (params->active_file == i) || (file->selflag & FILE_SEL_HIGHLIGHTED) ? 20 : 0;
|
||||||
|
|
||||||
/* readonly files (".." and ".") must not be drawn as selected - set color back to normal */
|
/* readonly files (".." and ".") must not be drawn as selected - set color back to normal */
|
||||||
if (STREQ(file->relname, "..") || STREQ(file->relname, ".")) {
|
if (FILENAME_IS_CURRPAR(file->relname)) {
|
||||||
colorid = TH_BACK;
|
colorid = TH_BACK;
|
||||||
}
|
}
|
||||||
draw_tile(sx, sy - 1, layout->tile_w + 4, sfile->layout->tile_h + layout->tile_border_y, colorid, shade);
|
draw_tile(sx, sy - 1, layout->tile_w + 4, sfile->layout->tile_h + layout->tile_border_y, colorid, shade);
|
||||||
@ -538,7 +538,7 @@ void file_draw_list(const bContext *C, ARegion *ar)
|
|||||||
UI_draw_roundbox_corner_set(UI_CNR_NONE);
|
UI_draw_roundbox_corner_set(UI_CNR_NONE);
|
||||||
|
|
||||||
/* don't drag parent or refresh items */
|
/* don't drag parent or refresh items */
|
||||||
do_drag = !(STREQ(file->relname, "..") || STREQ(file->relname, "."));
|
do_drag = !(FILENAME_IS_CURRPAR(file->relname));
|
||||||
|
|
||||||
if (FILE_IMGDISPLAY == params->display) {
|
if (FILE_IMGDISPLAY == params->display) {
|
||||||
is_icon = 0;
|
is_icon = 0;
|
||||||
|
@ -183,11 +183,11 @@ static FileSelect file_select_do(bContext *C, int selected_idx, bool do_diropen)
|
|||||||
retval = FILE_SELECT_DIR;
|
retval = FILE_SELECT_DIR;
|
||||||
}
|
}
|
||||||
/* the path is too long and we are not going up! */
|
/* the path is too long and we are not going up! */
|
||||||
else if (!STREQ(file->relname, "..") && strlen(params->dir) + strlen(file->relname) >= FILE_MAX) {
|
else if (!FILENAME_IS_PARENT(file->relname) && strlen(params->dir) + strlen(file->relname) >= FILE_MAX) {
|
||||||
// XXX error("Path too long, cannot enter this directory");
|
// XXX error("Path too long, cannot enter this directory");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (STREQ(file->relname, "..")) {
|
if (FILENAME_IS_PARENT(file->relname)) {
|
||||||
/* avoids /../../ */
|
/* avoids /../../ */
|
||||||
BLI_parent_dir(params->dir);
|
BLI_parent_dir(params->dir);
|
||||||
}
|
}
|
||||||
@ -269,7 +269,7 @@ static int file_border_select_modal(bContext *C, wmOperator *op, const wmEvent *
|
|||||||
for (idx = sel.last; idx >= 0; idx--) {
|
for (idx = sel.last; idx >= 0; idx--) {
|
||||||
struct direntry *file = filelist_file(sfile->files, idx);
|
struct direntry *file = filelist_file(sfile->files, idx);
|
||||||
|
|
||||||
if (STREQ(file->relname, "..") || STREQ(file->relname, ".")) {
|
if (FILENAME_IS_CURRPAR(file->relname)) {
|
||||||
file->selflag &= ~FILE_SEL_HIGHLIGHTED;
|
file->selflag &= ~FILE_SEL_HIGHLIGHTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -362,7 +362,7 @@ static int file_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
|
|||||||
|
|
||||||
if (idx >= 0) {
|
if (idx >= 0) {
|
||||||
struct direntry *file = filelist_file(sfile->files, idx);
|
struct direntry *file = filelist_file(sfile->files, idx);
|
||||||
if (STREQ(file->relname, "..") || STREQ(file->relname, ".")) {
|
if (FILENAME_IS_CURRPAR(file->relname)) {
|
||||||
/* skip - If a readonly file (".." or ".") is selected, skip deselect all! */
|
/* skip - If a readonly file (".." or ".") is selected, skip deselect all! */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -1531,7 +1531,7 @@ static int file_rename_poll(bContext *C)
|
|||||||
|
|
||||||
if (idx >= 0) {
|
if (idx >= 0) {
|
||||||
struct direntry *file = filelist_file(sfile->files, idx);
|
struct direntry *file = filelist_file(sfile->files, idx);
|
||||||
if (STREQ(file->relname, "..") || STREQ(file->relname, ".")) {
|
if (FILENAME_IS_CURRPAR(file->relname)) {
|
||||||
poll = 0;
|
poll = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -237,9 +237,6 @@ typedef struct FileList {
|
|||||||
bool (*filterf)(struct direntry *, const char *, FileListFilter *);
|
bool (*filterf)(struct direntry *, const char *, FileListFilter *);
|
||||||
} FileList;
|
} FileList;
|
||||||
|
|
||||||
#define FILENAME_IS_BREADCRUMBS(_n) \
|
|
||||||
((_n)[0] == '.' && ((_n)[1] == '\0' || ((_n)[1] == '.' && (_n)[2] == '\0')))
|
|
||||||
|
|
||||||
#define SPECIAL_IMG_SIZE 48
|
#define SPECIAL_IMG_SIZE 48
|
||||||
#define SPECIAL_IMG_ROWS 4
|
#define SPECIAL_IMG_ROWS 4
|
||||||
#define SPECIAL_IMG_COLS 4
|
#define SPECIAL_IMG_COLS 4
|
||||||
@ -304,10 +301,10 @@ static int compare_direntry_generic(const struct direntry *entry1, const struct
|
|||||||
if ((entry1->type & S_IFMT) > (entry2->type & S_IFMT)) return (1);
|
if ((entry1->type & S_IFMT) > (entry2->type & S_IFMT)) return (1);
|
||||||
|
|
||||||
/* make sure "." and ".." are always first */
|
/* make sure "." and ".." are always first */
|
||||||
if (STREQ(entry1->relname, ".")) return (-1);
|
if (FILENAME_IS_CURRENT(entry1->relname)) return (-1);
|
||||||
if (STREQ(entry2->relname, ".")) return (1);
|
if (FILENAME_IS_CURRENT(entry2->relname)) return (1);
|
||||||
if (STREQ(entry1->relname, "..")) return (-1);
|
if (FILENAME_IS_PARENT(entry1->relname)) return (-1);
|
||||||
if (STREQ(entry2->relname, "..")) return (1);
|
if (FILENAME_IS_PARENT(entry2->relname)) return (1);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -447,7 +444,7 @@ static bool is_filtered_file(struct direntry *file, const char *UNUSED(root), Fi
|
|||||||
{
|
{
|
||||||
bool is_filtered = !is_hidden_file(file->relname, filter);
|
bool is_filtered = !is_hidden_file(file->relname, filter);
|
||||||
|
|
||||||
if (is_filtered && filter->filter && !FILENAME_IS_BREADCRUMBS(file->relname)) {
|
if (is_filtered && filter->filter && !FILENAME_IS_CURRPAR(file->relname)) {
|
||||||
if ((file->type & S_IFDIR) && !(filter->filter & FILE_TYPE_FOLDER)) {
|
if ((file->type & S_IFDIR) && !(filter->filter & FILE_TYPE_FOLDER)) {
|
||||||
is_filtered = false;
|
is_filtered = false;
|
||||||
}
|
}
|
||||||
@ -471,7 +468,7 @@ static bool is_filtered_lib(struct direntry *file, const char *root, FileListFil
|
|||||||
|
|
||||||
if (BLO_is_a_library(root, dir, group)) {
|
if (BLO_is_a_library(root, dir, group)) {
|
||||||
is_filtered = !is_hidden_file(file->relname, filter);
|
is_filtered = !is_hidden_file(file->relname, filter);
|
||||||
if (is_filtered && filter->filter && !FILENAME_IS_BREADCRUMBS(file->relname)) {
|
if (is_filtered && filter->filter && !FILENAME_IS_CURRPAR(file->relname)) {
|
||||||
if (is_filtered && (filter->filter_search[0] != '\0')) {
|
if (is_filtered && (filter->filter_search[0] != '\0')) {
|
||||||
if (fnmatch(filter->filter_search, file->relname, FNM_CASEFOLD) != 0) {
|
if (fnmatch(filter->filter_search, file->relname, FNM_CASEFOLD) != 0) {
|
||||||
is_filtered = false;
|
is_filtered = false;
|
||||||
@ -634,10 +631,10 @@ ImBuf *filelist_geticon(struct FileList *filelist, const int index)
|
|||||||
fidx = filelist->fidx[index];
|
fidx = filelist->fidx[index];
|
||||||
file = &filelist->filelist[fidx];
|
file = &filelist->filelist[fidx];
|
||||||
if (file->type & S_IFDIR) {
|
if (file->type & S_IFDIR) {
|
||||||
if (STREQ(filelist->filelist[fidx].relname, "..")) {
|
if (FILENAME_IS_PARENT(filelist->filelist[fidx].relname)) {
|
||||||
ibuf = gSpecialFileImages[SPECIAL_IMG_PARENT];
|
ibuf = gSpecialFileImages[SPECIAL_IMG_PARENT];
|
||||||
}
|
}
|
||||||
else if (STREQ(filelist->filelist[fidx].relname, ".")) {
|
else if (FILENAME_IS_CURRENT(filelist->filelist[fidx].relname)) {
|
||||||
ibuf = gSpecialFileImages[SPECIAL_IMG_REFRESH];
|
ibuf = gSpecialFileImages[SPECIAL_IMG_REFRESH];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -1117,7 +1114,7 @@ static void filelist_from_library(struct FileList *filelist)
|
|||||||
filelist->filelist = malloc(filelist->numfiles * sizeof(*filelist->filelist));
|
filelist->filelist = malloc(filelist->numfiles * sizeof(*filelist->filelist));
|
||||||
memset(filelist->filelist, 0, filelist->numfiles * sizeof(*filelist->filelist));
|
memset(filelist->filelist, 0, filelist->numfiles * sizeof(*filelist->filelist));
|
||||||
|
|
||||||
filelist->filelist[0].relname = BLI_strdup("..");
|
filelist->filelist[0].relname = BLI_strdup(FILENAME_PARENT);
|
||||||
filelist->filelist[0].type |= S_IFDIR;
|
filelist->filelist[0].type |= S_IFDIR;
|
||||||
|
|
||||||
for (i = 0, l = names; i < nnames; i++, l = l->next) {
|
for (i = 0, l = names; i < nnames; i++, l = l->next) {
|
||||||
@ -1192,7 +1189,7 @@ static void filelist_from_main(struct FileList *filelist)
|
|||||||
filelist->filelist[a].type |= S_IFDIR;
|
filelist->filelist[a].type |= S_IFDIR;
|
||||||
}
|
}
|
||||||
|
|
||||||
filelist->filelist[0].relname = BLI_strdup("..");
|
filelist->filelist[0].relname = BLI_strdup(FILENAME_PARENT);
|
||||||
filelist->filelist[1].relname = BLI_strdup("Scene");
|
filelist->filelist[1].relname = BLI_strdup("Scene");
|
||||||
filelist->filelist[2].relname = BLI_strdup("Object");
|
filelist->filelist[2].relname = BLI_strdup("Object");
|
||||||
filelist->filelist[3].relname = BLI_strdup("Mesh");
|
filelist->filelist[3].relname = BLI_strdup("Mesh");
|
||||||
@ -1245,7 +1242,7 @@ static void filelist_from_main(struct FileList *filelist)
|
|||||||
|
|
||||||
if (!filelist->filter_data.hide_parent) {
|
if (!filelist->filter_data.hide_parent) {
|
||||||
memset(&(filelist->filelist[0]), 0, sizeof(struct direntry));
|
memset(&(filelist->filelist[0]), 0, sizeof(struct direntry));
|
||||||
filelist->filelist[0].relname = BLI_strdup("..");
|
filelist->filelist[0].relname = BLI_strdup(FILENAME_PARENT);
|
||||||
filelist->filelist[0].type |= S_IFDIR;
|
filelist->filelist[0].type |= S_IFDIR;
|
||||||
|
|
||||||
files++;
|
files++;
|
||||||
|
@ -669,7 +669,7 @@ int autocomplete_directory(struct bContext *C, char *str, void *UNUSED(arg_v))
|
|||||||
AutoComplete *autocpl = UI_autocomplete_begin(str, FILE_MAX);
|
AutoComplete *autocpl = UI_autocomplete_begin(str, FILE_MAX);
|
||||||
|
|
||||||
while ((de = readdir(dir)) != NULL) {
|
while ((de = readdir(dir)) != NULL) {
|
||||||
if (STREQ(de->d_name, ".") || STREQ(de->d_name, "..")) {
|
if (FILENAME_IS_CURRPAR(de->d_name)) {
|
||||||
/* pass */
|
/* pass */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
Loading…
Reference in New Issue
Block a user