]> Sergey Matveev's repositories - nnn.git/commitdiff
use switch case for NNN_SCRIPT
authorArun Prakash Jana <engineerarun@gmail.com>
Sun, 16 Dec 2018 03:03:40 +0000 (08:33 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Sun, 16 Dec 2018 03:12:25 +0000 (08:42 +0530)
src/nnn.c

index 5778bb54d5b4afd1bed7d8a7243f9b2d7dd811d1..07863d53a854ed61a8a4782024022c63cdfd2c8c 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -295,6 +295,7 @@ static char *copier;
 static char *editor, *editor_arg;
 static char *pager, *pager_arg;
 static char *shell, *shell_arg;
+static char *runpath;
 static blkcnt_t ent_blocks;
 static blkcnt_t dir_blocks;
 static ulong num_files;
@@ -2105,8 +2106,8 @@ static bool show_help(char *path)
                dprintf(fd, "NNN_COPIER: %s\n", copier);
        else if (g_cppath[0])
                dprintf(fd, "copy file: %s\n", g_cppath);
-       if (getenv("NNN_SCRIPT"))
-               dprintf(fd, "NNN_SCRIPT: %s\n", getenv("NNN_SCRIPT"));
+       if (runpath)
+               dprintf(fd, "NNN_SCRIPT: %s\n", runpath);
        if (getenv("NNN_SHOW_HIDDEN"))
                dprintf(fd, "NNN_SHOW_HIDDEN: 1\n");
        if (getenv("NNN_NO_AUTOSELECT"))
@@ -2695,7 +2696,8 @@ nochange:
                                        if (cfg.runctx != cfg.curctx)
                                                continue;
 
-                                       if (!getenv("NNN_SCRIPT") || strcmp(path, getenv("NNN_SCRIPT")) != 0)
+                                       /* Must be in script directory to select script */
+                                       if (strcmp(path, runpath) != 0)
                                                continue;
 
                                        mkpath(path, dents[cur].name, newpath, PATH_MAX);
@@ -3393,50 +3395,49 @@ nochange:
                        xstrlcpy(lastname, tmp, NAME_MAX + 1);
                        goto begin;
                }
-               case SEL_EXEC:
-                       if (!ndents)
-                               goto nochange; // fallthrough
+               case SEL_EXEC: // fallthrough
                case SEL_SHELL: // fallthrough
                case SEL_SCRIPT: // fallthrough
                case SEL_RUNCMD:
-                       if (sel == SEL_EXEC) {
+                       switch (sel) {
+                       case SEL_EXEC:
+                               if (!ndents)
+                                       goto nochange;
+
                                /* Check if this is a directory */
-                               if (S_ISDIR(dents[cur].mode)) {
-                                       printmsg("directory");
+                               if (!S_ISREG(dents[cur].mode)) {
+                                       printmsg("not a regular file");
                                        goto nochange;
                                }
 
                                /* Check if file is executable */
                                if (!(dents[cur].mode & 0100)) {
-                                       printmsg("Permission denied");
+                                       printmsg("permission denied");
                                        goto nochange;
                                }
 
                                mkpath(path, dents[cur].name, newpath, PATH_MAX);
                                spawn(newpath, NULL, NULL, path, F_NORMAL | F_SIGINT);
-                       } else if (sel == SEL_SCRIPT) {
-                               dir = getenv("NNN_SCRIPT");
-                               if (!dir) {
+                               break;
+                       case SEL_SHELL:
+                               spawn(shell, shell_arg, NULL, path, F_NORMAL | F_MARKER);
+                               break;
+                       case SEL_SCRIPT:
+                               if (!runpath) {
                                        printmsg("set NNN_SCRIPT");
                                        goto nochange;
                                }
 
-                               if (stat(dir, &sb) == -1) {
+                               if (stat(runpath, &sb) == -1) {
                                        printwarn();
                                        goto nochange;
                                }
 
-                               if (!S_ISDIR(sb.st_mode)) {
-                                       if (ndents)
-                                               tmp = dents[cur].name;
-                                       else
-                                               tmp = NULL;
-                                       spawn(shell, dir, tmp, path, F_NORMAL | F_SIGINT);
-                               } else {
+                               if (S_ISDIR(sb.st_mode)) {
                                        cfg.runscript ^= 1;
                                        if (!cfg.runscript && rundir[0]) {
-                                               /* If reset, switch to original dir */
-                                               if (strcmp(path, getenv("NNN_SCRIPT")) == 0) {
+                                               /* If toggled, switch to original directory */
+                                               if (strcmp(path, runpath) == 0) {
                                                        xstrlcpy(path, rundir, PATH_MAX);
                                                        xstrlcpy(lastname, runfile, NAME_MAX);
                                                        rundir[0] = '\0';
@@ -3448,11 +3449,11 @@ nochange:
                                        }
 
                                        /* Check if directory is accessible */
-                                       if (!xdiraccess(dir))
+                                       if (!xdiraccess(runpath))
                                                goto nochange;
 
                                        xstrlcpy(rundir, path, PATH_MAX);
-                                       xstrlcpy(path, dir, PATH_MAX);
+                                       xstrlcpy(path, runpath, PATH_MAX);
                                        if (ndents)
                                                xstrlcpy(runfile, dents[cur].name, NAME_MAX);
                                        cfg.runctx = cfg.curctx;
@@ -3460,12 +3461,23 @@ nochange:
                                        setdirwatch();
                                        goto begin;
                                }
-                       } else if (sel == SEL_RUNCMD) {
+
+                               if (S_ISREG(sb.st_mode)) {
+                                       if (ndents)
+                                               tmp = dents[cur].name;
+                                       else
+                                               tmp = NULL;
+                                       spawn(shell, runpath, tmp, path, F_NORMAL | F_SIGINT);
+                               } else {
+                                       printmsg("unsupported file");
+                                       goto nochange;
+                               }
+                               break;
+                       default: /* SEL_RUNCMD */
                                tmp = xreadline(NULL, "> ");
                                if (tmp && tmp[0])
                                        spawn(shell, "-c", tmp, path, F_NORMAL | F_SIGINT);
-                       } else
-                               spawn(shell, shell_arg, NULL, path, F_NORMAL | F_MARKER);
+                       }
 
                        /* Continue in navigate-as-you-type mode, if enabled */
                        if (cfg.filtermode)
@@ -3705,6 +3717,9 @@ int main(int argc, char *argv[])
        shell = xgetenv("SHELL", "sh");
        getprogarg(shell, &shell_arg);
 
+       /* Setup script execution */
+       runpath = getenv("NNN_SCRIPT");
+
 #ifdef LINUX_INOTIFY
        /* Initialize inotify */
        inotify_fd = inotify_init1(IN_NONBLOCK);