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;
} else {
++nselected;
dentp->flags |= FILE_SELECTED;
+ alloclen += pathlen + dentp->nlen;
}
} else {
dentp->flags |= FILE_SCANNED;
}
--nselected;
- offset += len; /* buffer size adjustment */
+ shrinklen += len; /* buffer size adjustment */
} else {
++nselected;
dentp->flags |= FILE_SELECTED;
+ alloclen += pathlen + dentp->nlen;
}
scan = FALSE;
}
}
/* Buffer size adjustment */
- selbufpos -= offset;
+ selbufpos -= shrinklen;
+
+ if (alloclen > shrinklen) {
+ pselbuf = xrealloc(pselbuf, selbuflen + (alloclen - shrinklen));
+ if (!pselbuf)
+ errexit();
+ }
free(marked);