From 94781f7977c855db2e85d0cbb92c1c2595a41259 Mon Sep 17 00:00:00 2001
From: Arun Prakash Jana <engineerarun@gmail.com>
Date: Sat, 11 Jan 2020 23:18:24 +0530
Subject: [PATCH] Refactor status bar printing

---
 src/nnn.c | 156 ++++++++++++++++++++++++++++--------------------------
 1 file changed, 82 insertions(+), 74 deletions(-)

diff --git a/src/nnn.c b/src/nnn.c
index 43a19f1..00e8f5e 100644
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -4201,17 +4201,88 @@ static int handle_context_switch(enum action sel, char *newpath)
 	return r;
 }
 
+static void statusbar(char *path)
+{
+	int i = 0, extnlen = 0;
+	char *ptr;
+	char sort[] = "\0\0\0\0";
+	char buf[24];
+	pEntry pent = &dents[cur];
+
+	if (!ndents) {
+		printmsg("0/0");
+		return;
+	}
+
+	if (cfg.mtimeorder)
+		sort[0] = cfg.mtime ? 'T' : 'A';
+	else if (cfg.sizeorder)
+		sort[0] = 'Z';
+	else if (cfg.extnorder)
+		sort[0] = 'E';
+
+	if (sort[i])
+		++i;
+
+	if (entrycmpfn == &reventrycmp) {
+		sort[i] = 'R';
+		++i;
+	}
+
+	if (namecmpfn == &xstrverscasecmp) {
+		sort[i] = 'V';
+		++i;
+	}
+
+	if (i)
+		sort[i] = ' ';
+
+	/* Get the file extension for regular files */
+	if (S_ISREG(pent->mode)) {
+		i = (int)(pent->nlen - 1);
+		ptr = xmemrchr((uchar *)pent->name, '.', i);
+		if (ptr) {
+			extnlen = ptr - pent->name;
+			extnlen = i - extnlen;
+		}
+		if (!ptr || extnlen > 5 || extnlen < 2)
+			ptr = "\b";
+	} else
+		ptr = "\b";
+
+	if (cfg.blkorder) { /* du mode */
+		xstrlcpy(buf, coolsize(dir_blocks << blk_shift), 12);
+
+		mvprintw(xlines - 1, 0, "%d/%d [%d:%s] %cu:%s free:%s files:%lu %lldB %s",
+			 cur + 1, ndents, cfg.selmode,
+			 ((g_states & STATE_RANGESEL) ? "*" : (nselected ? xitoa(nselected) : "")),
+			 (cfg.apparentsz ? 'a' : 'd'), buf, coolsize(get_fs_info(path, FREE)),
+			 num_files, (ll)pent->blocks << blk_shift, ptr);
+	} else { /* light or detail mode */
+		/* Show filename as it may be truncated in directory listing */
+		/* Get the unescaped file name */
+		char *fname = unescape(pent->name, NAME_MAX, NULL);
+
+		/* Timestamp */
+		strftime(buf, sizeof(buf), "%F %R", localtime(&pent->t));
+		buf[sizeof(buf)-1] = '\0';
+
+		mvprintw(xlines - 1, 0, "%d/%d [%d:%s] %s%s %s %s %s [%s]",
+			 cur + 1, ndents, cfg.selmode,
+			 ((g_states & STATE_RANGESEL) ? "*" : (nselected ? xitoa(nselected) : "")),
+			 sort, buf, get_lsperms(pent->mode), coolsize(pent->size), ptr, fname);
+	}
+}
+
 static void redraw(char *path)
 {
 	xlines = LINES;
 	xcols = COLS;
 
 	int ncols = (xcols <= PATH_MAX) ? xcols : PATH_MAX;
-	int lastln = xlines - 1, onscreen = xlines - 4;
-	int i, attrs;
-	char buf[24];
-	char c;
-	char *ptr = path, *base;
+	int onscreen = xlines - 4;
+	int i;
+	char *ptr = path;
 
 	/* Clear screen */
 	erase();
@@ -4233,9 +4304,9 @@ static void redraw(char *path)
 		if (!g_ctx[i].c_cfg.ctxactive) {
 			addch(i + '1');
 		} else {
-			attrs = (cfg.curctx != i)
-				 ? (COLOR_PAIR(i + 1) | A_BOLD | A_UNDERLINE) /* Underline active */
-				 : (COLOR_PAIR(i + 1) | A_BOLD | A_REVERSE); /* Current in reverse */
+			int attrs = (cfg.curctx != i)
+				     ? (COLOR_PAIR(i + 1) | A_BOLD | A_UNDERLINE) /* Active */
+				     : (COLOR_PAIR(i + 1) | A_BOLD | A_REVERSE); /* Current */
 			attron(attrs);
 			addch(i + '1');
 			attroff(attrs);
@@ -4251,7 +4322,8 @@ static void redraw(char *path)
 	if ((i + MIN_DISPLAY_COLS) <= ncols)
 		addnstr(path, ncols - MIN_DISPLAY_COLS);
 	else {
-		base = xbasename(path);
+		char *base = xbasename(path);
+
 		if ((base - ptr) <= 1)
 			addnstr(path, ncols - MIN_DISPLAY_COLS);
 		else {
@@ -4305,71 +4377,7 @@ static void redraw(char *path)
 		cfg.dircolor = 0;
 	}
 
-	if (ndents) {
-		char sort[] = "\0\0\0\0";
-		pEntry pent = &dents[cur];
-
-		i = 0;
-
-		if (cfg.mtimeorder)
-			sort[0] = cfg.mtime ? 'T' : 'A';
-		else if (cfg.sizeorder)
-			sort[0] = 'Z';
-		else if (cfg.extnorder)
-			sort[0] = 'E';
-
-		if (sort[i])
-			++i;
-
-		if (entrycmpfn == &reventrycmp) {
-			sort[i] = 'R';
-			++i;
-		}
-
-		if (namecmpfn == &xstrverscasecmp) {
-			sort[i] = 'V';
-			++i;
-		}
-
-		if (i)
-			sort[i] = ' ';
-
-		/* Get the file extension for regular files */
-		if (S_ISREG(pent->mode)) {
-			i = (int)(pent->nlen - 1);
-			ptr = xmemrchr((uchar *)pent->name, '.', i);
-			if (ptr)
-				attrs = ptr - pent->name; /* attrs used as tmp var */
-			if (!ptr || (i - attrs) > 5 || (i - attrs) < 2)
-				ptr = "\b";
-		} else
-			ptr = "\b";
-
-		if (cfg.blkorder) { /* du mode */
-			xstrlcpy(buf, coolsize(dir_blocks << blk_shift), 12);
-			c = cfg.apparentsz ? 'a' : 'd';
-
-			mvprintw(lastln, 0, "%d/%d [%d:%s] %cu:%s free:%s files:%lu %lldB %s",
-				 cur + 1, ndents, cfg.selmode,
-				 ((g_states & STATE_RANGESEL) ? "*" : (nselected ? xitoa(nselected) : "")),
-				 c, buf, coolsize(get_fs_info(path, FREE)), num_files,
-				 (ll)pent->blocks << blk_shift, ptr);
-		} else { /* light or detail mode */
-			/* Show filename as it may be truncated in directory listing */
-			/* Get the unescaped file name */
-			base = unescape(pent->name, NAME_MAX, NULL);
-
-			/* Timestamp */
-			strftime(buf, sizeof(buf), "%F %R", localtime(&pent->t));
-			buf[sizeof(buf)-1] = '\0';
-
-			mvprintw(lastln, 0, "%d/%d [%d:%s] %s%s %s %s %s [%s]",
-				 cur + 1, ndents, cfg.selmode,
-				 ((g_states & STATE_RANGESEL) ? "*" : (nselected ? xitoa(nselected) : "")),
-				 sort, buf, get_lsperms(pent->mode), coolsize(pent->size), ptr, base);
-		}
-	} else
-		printmsg("0/0");
+	statusbar(path);
 }
 
 static void browse(char *ipath, const char *session)