From ab3f53fbbe24a4219c78f6babdcabe7fe5f82b7f Mon Sep 17 00:00:00 2001 From: Andrew Borodin Date: Sat, 13 Jul 2013 21:02:34 +0400 Subject: [PATCH] Add DIR_IS_DOT and DIR_IS_DOTDOT macros ...to detect "." and ".." directories, respectively. Signed-off-by: Andrew Borodin --- lib/fs.h | 3 +++ lib/vfs/parse_ls_vga.c | 2 +- lib/widget/input_complete.c | 2 +- src/filemanager/cmd.c | 10 ++++---- src/filemanager/command.c | 2 +- src/filemanager/dir.c | 10 +++----- src/filemanager/file.c | 49 ++++++++++++------------------------- src/filemanager/find.c | 8 +++--- src/filemanager/mountlist.c | 4 +-- src/filemanager/panel.c | 10 +++----- src/filemanager/panelize.c | 5 +--- src/filemanager/treestore.c | 16 ++++-------- src/subshell.c | 2 +- src/vfs/extfs/extfs.c | 6 ++--- 14 files changed, 50 insertions(+), 79 deletions(-) diff --git a/lib/fs.h b/lib/fs.h index 4c66e5c99..24cc94350 100644 --- a/lib/fs.h +++ b/lib/fs.h @@ -74,6 +74,9 @@ #define MC_MAXFILENAMELEN MAXNAMLEN +#define DIR_IS_DOT(x) ((x)[0] == '.' && (x)[1] == '\0') +#define DIR_IS_DOTDOT(x) ((x)[0] == '.' && (x)[1] == '.' && (x)[2] == '\0') + /*** enums ***************************************************************************************/ /*** structures declarations (and typedefs of structures)*****************************************/ diff --git a/lib/vfs/parse_ls_vga.c b/lib/vfs/parse_ls_vga.c index 84f8df99a..f81b6fb90 100644 --- a/lib/vfs/parse_ls_vga.c +++ b/lib/vfs/parse_ls_vga.c @@ -800,7 +800,7 @@ vfs_parse_ls_lga (const char *p, struct stat * s, char **filename, char **linkna if (num_spaces != NULL) { *num_spaces = column_ptr[idx] - column_ptr[idx - 1] - strlen (columns[idx - 1]); - if (strcmp (columns[idx], "..") == 0) + if (DIR_IS_DOTDOT (columns[idx])) vfs_parce_ls_final_num_spaces = *num_spaces; } diff --git a/lib/widget/input_complete.c b/lib/widget/input_complete.c index 43dc54ba3..5bc26135b 100644 --- a/lib/widget/input_complete.c +++ b/lib/widget/input_complete.c @@ -213,7 +213,7 @@ filename_completion_function (const char *text, int state, input_complete_t flag All entries except "." and ".." match. */ if (filename_len == 0) { - if (!strcmp (entry->d_name, ".") || !strcmp (entry->d_name, "..")) + if (DIR_IS_DOT (entry->d_name) || DIR_IS_DOTDOT (entry->d_name)) continue; } else diff --git a/src/filemanager/cmd.c b/src/filemanager/cmd.c index 8d4215ffc..577d396b5 100644 --- a/src/filemanager/cmd.c +++ b/src/filemanager/cmd.c @@ -266,7 +266,7 @@ select_unselect_cmd (const char *title, const char *history_name, gboolean do_se for (i = 0; i < current_panel->count; i++) { - if (strcmp (current_panel->dir.list[i].fname, "..") == 0) + if (DIR_IS_DOTDOT (current_panel->dir.list[i].fname)) continue; if (S_ISDIR (current_panel->dir.list[i].st.st_mode) && files_only != 0) continue; @@ -941,7 +941,7 @@ mkdir_cmd (void) const char *name = ""; /* If 'on' then automatically fills name with current selected item name */ - if (auto_fill_mkdir_name && strcmp (selection (current_panel)->fname, "..") != 0) + if (auto_fill_mkdir_name && !DIR_IS_DOTDOT (selection (current_panel)->fname)) name = selection (current_panel)->fname; dir = @@ -1607,7 +1607,7 @@ smart_dirsize_cmd (void) file_entry *entry; entry = &(panel->dir.list[panel->selected]); - if ((S_ISDIR (entry->st.st_mode) && (strcmp (entry->fname, "..") == 0)) || panel->dirs_marked) + if ((S_ISDIR (entry->st.st_mode) && DIR_IS_DOTDOT (entry->fname)) || panel->dirs_marked) dirsizes_cmd (); else single_dirsize_cmd (); @@ -1622,7 +1622,7 @@ single_dirsize_cmd (void) file_entry *entry; entry = &(panel->dir.list[panel->selected]); - if (S_ISDIR (entry->st.st_mode) && strcmp (entry->fname, "..") != 0) + if (S_ISDIR (entry->st.st_mode) && !DIR_IS_DOTDOT (entry->fname)) { size_t marked = 0; uintmax_t total = 0; @@ -1668,7 +1668,7 @@ dirsizes_cmd (void) for (i = 0; i < panel->count; i++) if (S_ISDIR (panel->dir.list[i].st.st_mode) && ((panel->dirs_marked && panel->dir.list[i].f.marked) - || !panel->dirs_marked) && strcmp (panel->dir.list[i].fname, "..") != 0) + || !panel->dirs_marked) && !DIR_IS_DOTDOT (panel->dir.list[i].fname)) { vfs_path_t *p; size_t marked = 0; diff --git a/src/filemanager/command.c b/src/filemanager/command.c index 65f35dbeb..fd5c6cf18 100644 --- a/src/filemanager/command.c +++ b/src/filemanager/command.c @@ -400,7 +400,7 @@ do_cd_command (char *orig_cmd) { sync_tree (mc_config_get_home_dir ()); } - else if (strcmp (cmd + operand_pos, "..") == 0) + else if (DIR_IS_DOTDOT (cmd + operand_pos)) { if (vfs_path_elements_count (current_panel->cwd_vpath) != 1 || strlen (vfs_path_get_by_index (current_panel->cwd_vpath, 0)->path) > 1) diff --git a/src/filemanager/dir.c b/src/filemanager/dir.c index 1ec2e4270..d0816303b 100644 --- a/src/filemanager/dir.c +++ b/src/filemanager/dir.c @@ -172,9 +172,7 @@ handle_dirent (dir_list * list, const char *fltr, struct dirent *dp, { vfs_path_t *vpath; - if (dp->d_name[0] == '.' && dp->d_name[1] == 0) - return 0; - if (dp->d_name[0] == '.' && dp->d_name[1] == '.' && dp->d_name[2] == 0) + if (DIR_IS_DOT (dp->d_name) || DIR_IS_DOTDOT (dp->d_name)) return 0; if (!panels_options.show_dot_files && (dp->d_name[0] == '.')) return 0; @@ -449,7 +447,7 @@ do_sort (dir_list * list, sortfn * sort, int top, gboolean reverse_f, gboolean c /* If there is an ".." entry the caller must take care to ensure that it occupies the first list element. */ - if (strcmp (list->list[0].fname, "..") == 0) + if (DIR_IS_DOTDOT (list->list[0].fname)) dot_dot_found = 1; reverse = reverse_f ? -1 : 1; @@ -510,9 +508,7 @@ handle_path (dir_list * list, const char *path, { vfs_path_t *vpath; - if (path[0] == '.' && path[1] == 0) - return 0; - if (path[0] == '.' && path[1] == '.' && path[2] == 0) + if (DIR_IS_DOT (path) || DIR_IS_DOTDOT (path)) return 0; vpath = vfs_path_from_str (path); diff --git a/src/filemanager/file.c b/src/filemanager/file.c index 11269532e..16b37d5f1 100644 --- a/src/filemanager/file.c +++ b/src/filemanager/file.c @@ -524,9 +524,7 @@ do_compute_dir_size (const vfs_path_t * dirname_vpath, void *ui, { vfs_path_t *tmp_vpath; - if (strcmp (dirent->d_name, ".") == 0) - continue; - if (strcmp (dirent->d_name, "..") == 0) + if (DIR_IS_DOT (dirent->d_name) || DIR_IS_DOTDOT (dirent->d_name)) continue; tmp_vpath = vfs_path_append_new (dirname_vpath, dirent->d_name, NULL); @@ -1076,7 +1074,7 @@ recursive_erase (FileOpTotalContext * tctx, FileOpContext * ctx, const char *s) FileProgressStatus return_status = FILE_CONT; vfs_path_t *vpath; - if (strcmp (s, "..") == 0) + if (DIR_IS_DOTDOT (s)) return FILE_RETRY; vpath = vfs_path_from_str (s); @@ -1092,10 +1090,9 @@ recursive_erase (FileOpTotalContext * tctx, FileOpContext * ctx, const char *s) { vfs_path_t *tmp_vpath; - if (!strcmp (next->d_name, ".")) - continue; - if (!strcmp (next->d_name, "..")) + if (DIR_IS_DOT (next->d_name) || DIR_IS_DOTDOT (next->d_name)) continue; + path = mc_build_filename (s, next->d_name, NULL); tmp_vpath = vfs_path_from_str (path); if (mc_lstat (tmp_vpath, &buf) != 0) @@ -1151,20 +1148,18 @@ check_dir_is_empty (const vfs_path_t * vpath) { DIR *dir; struct dirent *d; - int i; + int i = 1; dir = mc_opendir (vpath); - if (!dir) + if (dir == NULL) return -1; - for (i = 1, d = mc_readdir (dir); d; d = mc_readdir (dir)) - { - if (d->d_name[0] == '.' && (d->d_name[1] == '\0' || - (d->d_name[1] == '.' && d->d_name[2] == '\0'))) - continue; /* "." or ".." */ - i = 0; - break; - } + for (d = mc_readdir (dir); d != NULL; d = mc_readdir (dir)) + if (!DIR_IS_DOT (d->d_name) && !DIR_IS_DOTDOT (d->d_name)) + { + i = 0; + break; + } mc_closedir (dir); return i; @@ -1178,10 +1173,7 @@ erase_dir_iff_empty (FileOpContext * ctx, const char *s) FileProgressStatus error; vfs_path_t *s_vpath; - if (strcmp (s, "..") == 0) - return FILE_SKIP; - - if (strcmp (s, ".") == 0) + if (DIR_IS_DOT (s) || DIR_IS_DOTDOT (s)) return FILE_SKIP; file_progress_show_deleting (ctx, s); @@ -2207,12 +2199,11 @@ copy_dir_dir (FileOpTotalContext * tctx, FileOpContext * ctx, const char *s, con { char *path; vfs_path_t *tmp_vpath; + /* * Now, we don't want '.' and '..' to be created / copied at any time */ - if (!strcmp (next->d_name, ".")) - continue; - if (!strcmp (next->d_name, "..")) + if (DIR_IS_DOT (next->d_name) || DIR_IS_DOTDOT (next->d_name)) continue; /* get the filename and add it to the src directory */ @@ -2441,14 +2432,6 @@ erase_dir (FileOpTotalContext * tctx, FileOpContext * ctx, const vfs_path_t * s_ { FileProgressStatus error; - /* - if (strcmp (s, "..") == 0) - return FILE_SKIP; - - if (strcmp (s, ".") == 0) - return FILE_SKIP; - */ - file_progress_show_deleting (ctx, vfs_path_as_str (s_vpath)); if (check_progress_buttons (ctx) == FILE_ABORT) return FILE_ABORT; @@ -2672,7 +2655,7 @@ panel_operate (void *source_panel, FileOperation operation, gboolean force_singl else source = panel_get_file (panel); - if (strcmp (source, "..") == 0) + if (DIR_IS_DOTDOT (source)) { g_free (source); message (D_ERROR, MSG_ERROR, _("Cannot operate on \"..\"!")); diff --git a/src/filemanager/find.c b/src/filemanager/find.c index 2d2ae2dc7..60028645f 100644 --- a/src/filemanager/find.c +++ b/src/filemanager/find.c @@ -717,7 +717,7 @@ find_parameters (char **start_dir, ssize_t * start_dir_len, char *temp_dir; temp_dir = in_start->buffer; - if ((temp_dir[0] == '\0') || ((temp_dir[0] == '.') && (temp_dir[1] == '\0'))) + if (*temp_dir == '\0' || DIR_IS_DOT (temp_dir)) temp_dir = g_strdup (vfs_path_as_str (current_panel->cwd_vpath)); else temp_dir = g_strdup (temp_dir); @@ -768,7 +768,7 @@ find_parameters (char **start_dir, ssize_t * start_dir_len, s = tilde_expand (*start_dir); canonicalize_pathname (s); - if (s[0] == '.' && s[1] == '\0') + if (DIR_IS_DOT (s)) { *start_dir = g_strdup (vfs_path_as_str (current_panel->cwd_vpath)); /* FIXME: is current_panel->cwd_vpath canonicalized? */ @@ -792,7 +792,7 @@ find_parameters (char **start_dir, ssize_t * start_dir_len, } if (!options.ignore_dirs_enable || in_ignore->buffer[0] == '\0' - || (in_ignore->buffer[0] == '.' && in_ignore->buffer[1] == '\0')) + || DIR_IS_DOT (in_ignore->buffer)) *ignore_dirs = NULL; else *ignore_dirs = g_strdup (in_ignore->buffer); @@ -1306,7 +1306,7 @@ do_search (WDialog * h) ; } /* while (!dp) */ - if (strcmp (dp->d_name, ".") == 0 || strcmp (dp->d_name, "..") == 0) + if (DIR_IS_DOT (dp->d_name) || DIR_IS_DOTDOT (dp->d_name)) { /* skip invalid filenames */ while ((dp = mc_readdir (dirp)) != NULL && !str_is_valid_string (dp->d_name)) diff --git a/src/filemanager/mountlist.c b/src/filemanager/mountlist.c index 1fd8640b9..a2e3cb3b3 100644 --- a/src/filemanager/mountlist.c +++ b/src/filemanager/mountlist.c @@ -779,10 +779,10 @@ read_file_system_list (int need_fs_type) char *name; struct stat statbuf; - if (strcmp (d->d_name, "..") == 0) + if (DIR_IS_DOT (d->d_name)) continue; - if (strcmp (d->d_name, ".") == 0) + if (DIR_IS_DOTDOT (d->d_name)) name = g_strdup ("/"); else name = g_strconcat ("/", d->d_name, (char *) NULL); diff --git a/src/filemanager/panel.c b/src/filemanager/panel.c index 0c02a8335..b41d803d4 100644 --- a/src/filemanager/panel.c +++ b/src/filemanager/panel.c @@ -501,10 +501,8 @@ string_file_size (file_entry * fe, int len) static char buffer[BUF_TINY]; /* Don't ever show size of ".." since we don't calculate it */ - if (!strcmp (fe->fname, "..")) - { + if (DIR_IS_DOTDOT (fe->fname)) return _("UP--DIR"); - } #ifdef HAVE_STRUCT_STAT_ST_RDEV if (S_ISBLK (fe->st.st_mode) || S_ISCHR (fe->st.st_mode)) @@ -528,7 +526,7 @@ string_file_size_brief (file_entry * fe, int len) return _("SYMLINK"); } - if ((S_ISDIR (fe->st.st_mode) || fe->f.link_to_dir) && strcmp (fe->fname, "..")) + if ((S_ISDIR (fe->st.st_mode) || fe->f.link_to_dir) && !DIR_IS_DOTDOT (fe->fname)) { return _("SUB-DIR"); } @@ -1007,7 +1005,7 @@ display_mini_info (WPanel * panel) else tty_print_string (str_fit_to_term (_(""), w->cols - 2, J_LEFT)); } - else if (strcmp (panel->dir.list[panel->selected].fname, "..") == 0) + else if (DIR_IS_DOTDOT (panel->dir.list[panel->selected].fname)) { /* FIXME: * while loading directory (do_load_dir() and do_reload_dir()), @@ -4377,7 +4375,7 @@ do_file_mark (WPanel * panel, int idx, int mark) return; /* Only '..' can't be marked, '.' isn't visible */ - if (strcmp (panel->dir.list[idx].fname, "..") == 0) + if (DIR_IS_DOTDOT (panel->dir.list[idx].fname)) return; file_mark (panel, idx, mark); diff --git a/src/filemanager/panelize.c b/src/filemanager/panelize.c index 5c609df9f..c78295edc 100644 --- a/src/filemanager/panelize.c +++ b/src/filemanager/panelize.c @@ -429,10 +429,7 @@ do_panelize_cd (struct WPanel *panel) for (i = 0; i < panelized_panel.count; i++) { - if (panelized_same - || (panelized_panel.list.list[i].fname[0] == '.' - && panelized_panel.list.list[i].fname[1] == '.' - && panelized_panel.list.list[i].fname[2] == '\0')) + if (panelized_same || DIR_IS_DOTDOT (panelized_panel.list.list[i].fname)) { list->list[i].fnamelen = panelized_panel.list.list[i].fnamelen; list->list[i].fname = g_strndup (panelized_panel.list.list[i].fname, diff --git a/src/filemanager/treestore.c b/src/filemanager/treestore.c index 2ad7db0f6..959a8f6eb 100644 --- a/src/filemanager/treestore.c +++ b/src/filemanager/treestore.c @@ -748,7 +748,7 @@ tree_store_mark_checked (const char *subname) return; /* Calculate the full name of the subdirectory */ - if (subname[0] == '.' && (subname[1] == 0 || (subname[1] == '.' && subname[2] == 0))) + if (DIR_IS_DOT (subname) || DIR_IS_DOTDOT (subname)) return; cname = vfs_path_as_str (ts.check_name); @@ -927,18 +927,12 @@ tree_store_rescan (const vfs_path_t * vpath) { vfs_path_t *tmp_vpath; - if (dp->d_name[0] == '.') - { - if (dp->d_name[1] == 0 || (dp->d_name[1] == '.' && dp->d_name[2] == 0)) - continue; - } + if (DIR_IS_DOT (dp->d_name) || DIR_IS_DOTDOT (dp->d_name)) + continue; tmp_vpath = vfs_path_append_new (vpath, dp->d_name, NULL); - if (mc_lstat (tmp_vpath, &buf) != -1) - { - if (S_ISDIR (buf.st_mode)) - tree_store_mark_checked (dp->d_name); - } + if (mc_lstat (tmp_vpath, &buf) != -1 && S_ISDIR (buf.st_mode)) + tree_store_mark_checked (dp->d_name); vfs_path_free (tmp_vpath); } mc_closedir (dirp); diff --git a/src/subshell.c b/src/subshell.c index db1bbec85..b36fbbcca 100644 --- a/src/subshell.c +++ b/src/subshell.c @@ -1221,7 +1221,7 @@ do_subshell_chdir (const vfs_path_t * vpath, gboolean update_prompt) bPathNotEq = strcmp (p_subshell_cwd, p_current_panel_cwd); } - if (bPathNotEq && strcmp (pcwd, ".") != 0) + if (bPathNotEq && !DIR_IS_DOT (pcwd)) { char *cwd; diff --git a/src/vfs/extfs/extfs.c b/src/vfs/extfs/extfs.c index be3662288..488b479dc 100644 --- a/src/vfs/extfs/extfs.c +++ b/src/vfs/extfs/extfs.c @@ -265,9 +265,9 @@ extfs_find_entry_int (struct entry *dir, const char *name, GSList * list, c = *q; *q = '\0'; - if (strcmp (p, ".") != 0) + if (!DIR_IS_DOT (p)) { - if (strcmp (p, "..") == 0) + if (DIR_IS_DOTDOT (p)) pent = pent->dir; else { @@ -540,7 +540,7 @@ extfs_read_archive (int fstype, const char *name, struct archive **pparc) *(p++) = '\0'; q = cfn; } - if (S_ISDIR (hstat.st_mode) && (strcmp (p, ".") == 0 || strcmp (p, "..") == 0)) + if (S_ISDIR (hstat.st_mode) && (DIR_IS_DOT (p) || DIR_IS_DOTDOT (p))) goto read_extfs_continue; pent = extfs_find_entry (current_archive->root_entry, q, TRUE, FALSE); if (pent == NULL)