]> Sergey Matveev's repositories - nnn.git/commitdiff
Reduce number of entry movements
authorArun Prakash Jana <engineerarun@gmail.com>
Wed, 17 May 2017 02:46:33 +0000 (08:16 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Wed, 17 May 2017 02:46:33 +0000 (08:16 +0530)
nnn.c

diff --git a/nnn.c b/nnn.c
index 6abc08866d8a8da3db7bf94a651027382e1a812b..483115bcbeae56f02d58f8e3a7d98365aabe6e5f 100644 (file)
--- 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;