From 0159c086029458105ccea14b0ca104934e6e72a4 Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Thu, 15 Jul 2021 18:55:03 +0530 Subject: [PATCH] Invert optimization: allocate in a go --- src/nnn.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/nnn.c b/src/nnn.c index 50200422..01f512b8 100644 --- 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);