From 95cdb78c6ceeb3b3a681047b72d269002048190c Mon Sep 17 00:00:00 2001
From: Arun Prakash Jana <engineerarun@gmail.com>
Date: Wed, 17 May 2017 08:16:33 +0530
Subject: [PATCH] Reduce number of entry movements

---
 nnn.c | 67 +++++++++++++++++++++++++++++++----------------------------
 1 file changed, 35 insertions(+), 32 deletions(-)

diff --git a/nnn.c b/nnn.c
index 6abc0886..483115bc 100644
--- a/nnn.c
+++ b/nnn.c
@@ -620,44 +620,47 @@ nextsel(char **run, char **env, int *ch)
 	return 0;
 }
 
-static int
+/*
+ * Move non-matching entries to the end
+ */
+static void
 fill(struct entry **dents,
 	 int (*filter)(regex_t *, char *), regex_t *re)
 {
-	static struct entry _dent;
-	static int count, n;
+	static int count;
+
+	for (count = 0; count < ndents; count++) {
+		if (filter(re, (*dents)[count].name) == 0) {
+			if (count != --ndents) {
+				static struct entry _dent;
+
+				/* Copy count to tmp */
+				xstrlcpy(_dent.name, (*dents)[count].name, NAME_MAX);
+				_dent.mode = (*dents)[count].mode;
+				_dent.t = (*dents)[count].t;
+				_dent.size = (*dents)[count].size;
+				_dent.bsize = (*dents)[count].bsize;
+
+				/* Copy ndents - 1 to count */
+				xstrlcpy((*dents)[count].name, (*dents)[ndents].name, NAME_MAX);
+				(*dents)[count].mode = (*dents)[ndents].mode;
+				(*dents)[count].t = (*dents)[ndents].t;
+				(*dents)[count].size = (*dents)[ndents].size;
+				(*dents)[count].bsize = (*dents)[ndents].bsize;
+
+				/* Copy tmp to ndents - 1 */
+				xstrlcpy((*dents)[ndents].name, _dent.name, NAME_MAX);
+				(*dents)[ndents].mode = _dent.mode;
+				(*dents)[ndents].t = _dent.t;
+				(*dents)[ndents].size = _dent.size;
+				(*dents)[ndents].bsize = _dent.bsize;
+
+				count--;
+			}
 
-	for (count = 0, n = 0; count < ndents; count++) {
-		if (filter(re, (*dents)[count].name) == 0)
 			continue;
-
-		if (n != count) {
-			/* Copy to tmp */
-			xstrlcpy(_dent.name, (*dents)[n].name, NAME_MAX);
-			_dent.mode = (*dents)[n].mode;
-			_dent.t = (*dents)[n].t;
-			_dent.size = (*dents)[n].size;
-			_dent.bsize = (*dents)[n].bsize;
-
-			/* Copy count to n */
-			xstrlcpy((*dents)[n].name, (*dents)[count].name, NAME_MAX);
-			(*dents)[n].mode = (*dents)[count].mode;
-			(*dents)[n].t = (*dents)[count].t;
-			(*dents)[n].size = (*dents)[count].size;
-			(*dents)[n].bsize = (*dents)[count].bsize;
-
-			/* Copy tmp to count */
-			xstrlcpy((*dents)[count].name, _dent.name, NAME_MAX);
-			(*dents)[count].mode = _dent.mode;
-			(*dents)[count].t = _dent.t;
-			(*dents)[count].size = _dent.size;
-			(*dents)[count].bsize = _dent.bsize;
 		}
-
-		n++;
 	}
-
-	return n;
 }
 
 static int
@@ -669,7 +672,7 @@ matches(char *fltr)
 	if (setfilter(&re, fltr) != 0)
 		return -1;
 
-	ndents = fill(&dents, visible, &re);
+	fill(&dents, visible, &re);
 	qsort(dents, ndents, sizeof(*dents), entrycmp);
 
 	return 0;
-- 
2.51.0