]> Sergey Matveev's repositories - nnn.git/commitdiff
Use a single filter for hidden files
authorArun Prakash Jana <engineerarun@gmail.com>
Fri, 9 Nov 2018 06:55:19 +0000 (12:25 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Fri, 9 Nov 2018 06:55:29 +0000 (12:25 +0530)
nnn.c

diff --git a/nnn.c b/nnn.c
index 8e5cabf9363b6024ccca30d3e931240336d6b7f3..c838060640f54ff11ecd90763d7b24b90b40832e 100644 (file)
--- a/nnn.c
+++ b/nnn.c
@@ -176,6 +176,7 @@ disabledbg()
 #define SYMLINK_TO_DIR 0x1
 #define MAX_HOME_LEN 64
 #define MAX_CTX 4
+#define DOT_FILTER_LEN 8
 
 /* Macros to define process spawn behaviour as flags */
 #define F_NONE     0x00  /* no flag set */
@@ -200,7 +201,6 @@ disabledbg()
 #define clearprompt() printmsg("")
 #define printwarn() printmsg(strerror(errno))
 #define istopdir(path) ((path)[1] == '\0' && (path)[0] == '/')
-#define copyfilter() xstrlcpy(fltr, ifilter, NAME_MAX)
 #define copycurname() xstrlcpy(oldname, dents[cur].name, NAME_MAX + 1)
 #define settimeout() timeout(1000)
 #define cleartimeout() timeout(-1)
@@ -265,11 +265,11 @@ typedef struct {
 /* Contexts or workspaces */
 typedef struct {
        char c_name[NAME_MAX + 1];
-       char c_fltr[NAME_MAX + 1];
        char c_path[PATH_MAX];
        char c_init[PATH_MAX];
        char c_last[PATH_MAX];
        settings c_cfg;
+       char c_fltr[DOT_FILTER_LEN];
 } context;
 
 /* GLOBALS */
@@ -922,9 +922,9 @@ static int setfilter(regex_t *regex, char *filter)
        return r;
 }
 
-static void initfilter(int dot, char **ifilter)
+static void initfilter(int dot, char *hfilter)
 {
-       *ifilter = dot ? "." : "^[^.]";
+       dot ? (hfilter[0] = '.', hfilter[1] = '\0') : xstrlcpy(hfilter, "^[^.]", DOT_FILTER_LEN);
 }
 
 static int visible(regex_t *regex, char *file)
@@ -2469,13 +2469,12 @@ static void redraw(char *path)
        }
 }
 
-static void browse(char *ipath, char *ifilter)
+static void browse(char *ipath, char *hfilter)
 {
        static char path[PATH_MAX] __attribute__ ((aligned));
        static char newpath[PATH_MAX] __attribute__ ((aligned));
        static char lastdir[PATH_MAX] __attribute__ ((aligned));
        static char mark[PATH_MAX] __attribute__ ((aligned));
-       static char fltr[NAME_MAX + 1] __attribute__ ((aligned));
        static char oldname[NAME_MAX + 1] __attribute__ ((aligned));
        char *dir, *tmp, *run = NULL, *env = NULL;
        struct stat sb;
@@ -2488,7 +2487,6 @@ static void browse(char *ipath, char *ifilter)
        g_ctx[0].c_cfg = cfg;
 
        xstrlcpy(path, ipath, PATH_MAX);
-       copyfilter();
        oldname[0] = newpath[0] = lastdir[0] = mark[0] = '\0';
 
        if (cfg.filtermode)
@@ -2524,7 +2522,7 @@ begin:
        }
 #endif
 
-       if (populate(path, oldname, fltr) == -1) {
+       if (populate(path, oldname, hfilter) == -1) {
                printwarn();
                goto nochange;
        }
@@ -2578,8 +2576,6 @@ nochange:
                        dir_changed = TRUE;
 
                        xstrlcpy(path, dir, PATH_MAX);
-                       /* Reset filter */
-                       copyfilter();
                        if (cfg.filtermode)
                                presel = FILTER;
                        goto begin;
@@ -2618,8 +2614,6 @@ nochange:
 
                                xstrlcpy(path, newpath, PATH_MAX);
                                oldname[0] = '\0';
-                               /* Reset filter */
-                               copyfilter();
                                if (cfg.filtermode)
                                        presel = FILTER;
                                goto begin;
@@ -2704,8 +2698,6 @@ nochange:
 
                        xstrlcpy(path, dir, PATH_MAX);
                        oldname[0] = '\0';
-                       /* Reset filter */
-                       copyfilter();
                        DPRINTF_S(path);
                        if (cfg.filtermode)
                                presel = FILTER;
@@ -2733,8 +2725,6 @@ nochange:
                        dir_changed = TRUE;
                        xstrlcpy(path, newpath, PATH_MAX);
                        oldname[0] = '\0';
-                       /* Reset filter */
-                       copyfilter();
                        DPRINTF_S(path);
                        if (cfg.filtermode)
                                presel = FILTER;
@@ -2778,29 +2768,29 @@ nochange:
 
                                        /* Save current context */
                                        xstrlcpy(g_ctx[cfg.curctx].c_name, dents[cur].name, NAME_MAX + 1);
-                                       xstrlcpy(g_ctx[cfg.curctx].c_fltr, fltr, NAME_MAX + 1);
                                        xstrlcpy(g_ctx[cfg.curctx].c_path, path, PATH_MAX);
                                        xstrlcpy(g_ctx[cfg.curctx].c_last, lastdir, PATH_MAX);
                                        g_ctx[cfg.curctx].c_cfg = cfg;
+                                       xstrlcpy(g_ctx[cfg.curctx].c_fltr, hfilter, DOT_FILTER_LEN);
 
                                        if (!g_ctx[r].c_cfg.ctxactive) {
                                                /* Setup a new context  from current context */
                                                g_ctx[r].c_cfg.ctxactive = 1;
                                                xstrlcpy(g_ctx[r].c_name, dents[cur].name, NAME_MAX + 1);
-                                               xstrlcpy(g_ctx[r].c_fltr, fltr, NAME_MAX + 1);
                                                xstrlcpy(g_ctx[r].c_path, path, PATH_MAX);
                                                xstrlcpy(g_ctx[r].c_init, path, PATH_MAX);
                                                ipath = g_ctx[r].c_init;
                                                g_ctx[r].c_last[0] = lastdir[0] = '\0';
                                                g_ctx[r].c_cfg = cfg;
+                                               xstrlcpy(g_ctx[r].c_fltr, hfilter, DOT_FILTER_LEN);
                                        } else {
                                                /* Switch to saved context */
                                                xstrlcpy(oldname, g_ctx[r].c_name, NAME_MAX + 1);
-                                               xstrlcpy(fltr, g_ctx[r].c_fltr, NAME_MAX + 1);
                                                xstrlcpy(path, g_ctx[r].c_path, PATH_MAX);
                                                ipath = g_ctx[r].c_init;
                                                xstrlcpy(lastdir, g_ctx[r].c_last, PATH_MAX);
                                                cfg = g_ctx[r].c_cfg;
+                                               xstrlcpy(hfilter, g_ctx[r].c_fltr, DOT_FILTER_LEN);
                                        }
 
                                        cfg.curctx = r;
@@ -2832,9 +2822,6 @@ nochange:
 
                        /* Save the newly opted dir in path */
                        xstrlcpy(path, newpath, PATH_MAX);
-
-                       /* Reset filter */
-                       copyfilter();
                        DPRINTF_S(path);
 
                        if (cfg.filtermode)
@@ -2846,8 +2833,6 @@ nochange:
                        goto nochange;
                case SEL_FLTR:
                        presel = filterentries(path);
-                       copyfilter();
-                       DPRINTF_S(fltr);
                        /* Save current */
                        if (ndents)
                                copycurname();
@@ -2867,8 +2852,7 @@ nochange:
                        goto nochange;
                case SEL_TOGGLEDOT:
                        cfg.showhidden ^= 1;
-                       initfilter(cfg.showhidden, &ifilter);
-                       copyfilter();
+                       initfilter(cfg.showhidden, hfilter);
                        goto begin;
                case SEL_DETAIL:
                        cfg.showdetail ^= 1;
@@ -3322,7 +3306,7 @@ nochange:
 
                                        /* Switch to next active context */
                                        xstrlcpy(oldname, g_ctx[r].c_name, NAME_MAX + 1);
-                                       xstrlcpy(fltr, g_ctx[r].c_fltr, NAME_MAX + 1);
+                                       xstrlcpy(hfilter, g_ctx[r].c_fltr, NAME_MAX + 1);
                                        xstrlcpy(path, g_ctx[r].c_path, PATH_MAX);
                                        ipath = g_ctx[r].c_init;
                                        xstrlcpy(lastdir, g_ctx[r].c_last, PATH_MAX);
@@ -3395,7 +3379,7 @@ static void usage(void)
 int main(int argc, char *argv[])
 {
        static char cwd[PATH_MAX] __attribute__ ((aligned));
-       char *ipath = NULL, *ifilter;
+       char *ipath = NULL, hfilter[DOT_FILTER_LEN] = {'\0'}; /* Hidden file filter */
        int opt;
 
        /* Confirm we are in a terminal */
@@ -3469,7 +3453,7 @@ int main(int argc, char *argv[])
 
        if (getuid() == 0 || getenv("NNN_SHOW_HIDDEN"))
                cfg.showhidden = 1;
-       initfilter(cfg.showhidden, &ifilter);
+       initfilter(cfg.showhidden, hfilter);
 
 #ifdef LINUX_INOTIFY
        /* Initialize inotify */
@@ -3544,7 +3528,7 @@ int main(int argc, char *argv[])
        enabledbg();
 #endif
        initcurses();
-       browse(ipath, ifilter);
+       browse(ipath, hfilter);
        exitcurses();
 
        if (g_cppath[0])