aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Arun Prakash Jana <engineerarun@gmail.com>2017-05-17 08:16:33 +0530
committerGravatar Arun Prakash Jana <engineerarun@gmail.com>2017-05-17 08:16:33 +0530
commit95cdb78c6ceeb3b3a681047b72d269002048190c (patch)
tree38d4c68dae49048ae7de367ed6700858b9d9231c
parent8263c9c419dab0fdeccaed3ba64b0091001bea33 (diff)
downloadnnn-95cdb78c6ceeb3b3a681047b72d269002048190c.tar.gz
Reduce number of entry movements
-rw-r--r--nnn.c63
1 files changed, 33 insertions, 30 deletions
diff --git a/nnn.c b/nnn.c
index 6abc088..483115b 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, n = 0; count < ndents; count++) {
- if (filter(re, (*dents)[count].name) == 0)
- continue;
+ for (count = 0; count < ndents; count++) {
+ if (filter(re, (*dents)[count].name) == 0) {
+ if (count != --ndents) {
+ static struct entry _dent;
- 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 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 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 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 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;
- }
+ /* 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;
- n++;
- }
+ count--;
+ }
- return n;
+ continue;
+ }
+ }
}
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;