commit 0159c086029458105ccea14b0ca104934e6e72a4
parent 064f5ea998a6512d061d1bf62d595f2fe4215065
Author: Arun Prakash Jana <engineerarun@gmail.com>
Date: Thu, 15 Jul 2021 18:55:03 +0530
Invert optimization: allocate in a go
Diffstat:
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/src/nnn.c b/src/nnn.c
@@ -1562,7 +1562,8 @@ static inline void findmarkentry(char *path, struct entry *dentp)
static void invertselbuf(char *path)
{
- size_t len, endpos, offset = 0;
+ size_t len, endpos, shrinklen = 0, alloclen = 0;
+ size_t const pathlen = xstrlen(path);
char *found;
int nmarked = 0, prev = 0;
struct entry *dentp;
@@ -1580,6 +1581,7 @@ static void invertselbuf(char *path)
} else {
++nselected;
dentp->flags |= FILE_SELECTED;
+ alloclen += pathlen + dentp->nlen;
}
} else {
dentp->flags |= FILE_SCANNED;
@@ -1603,10 +1605,11 @@ static void invertselbuf(char *path)
}
--nselected;
- offset += len; /* buffer size adjustment */
+ shrinklen += len; /* buffer size adjustment */
} else {
++nselected;
dentp->flags |= FILE_SELECTED;
+ alloclen += pathlen + dentp->nlen;
}
scan = FALSE;
}
@@ -1658,7 +1661,13 @@ static void invertselbuf(char *path)
}
/* Buffer size adjustment */
- selbufpos -= offset;
+ selbufpos -= shrinklen;
+
+ if (alloclen > shrinklen) {
+ pselbuf = xrealloc(pselbuf, selbuflen + (alloclen - shrinklen));
+ if (!pselbuf)
+ errexit();
+ }
free(marked);