From cc3836954074c962be6a660270fa45055589d0c1 Mon Sep 17 00:00:00 2001
From: Arun Prakash Jana <engineerarun@gmail.com>
Date: Sun, 16 Dec 2018 08:33:40 +0530
Subject: [PATCH] use switch case for NNN_SCRIPT

---
 src/nnn.c | 71 +++++++++++++++++++++++++++++++++----------------------
 1 file changed, 43 insertions(+), 28 deletions(-)

diff --git a/src/nnn.c b/src/nnn.c
index 5778bb54..07863d53 100644
--- 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);
-- 
2.51.0