realloc() 32 entries at a time

This commit is contained in:
Arun Prakash Jana 2017-04-11 19:16:06 +05:30
parent 74a13c645d
commit 286a13d891
No known key found for this signature in database
GPG key ID: A75979F35C080412
2 changed files with 11 additions and 44 deletions

View file

@ -48,7 +48,7 @@ I chose to fork because:
### Original features
- Super-easy navigation
- Pre-defined associaitons for different file types
- Pre-defined associations for different file types
- Jump to home directory
- Filter contents in current directory
- Show/hide hidden files
@ -108,8 +108,8 @@ The following top excerpt shows the difference in nnn and ncdu memory usage whil
```
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6054 vaio 20 0 56768 45268 2300 S 0.0 0.9 0:02.82 ncdu
10806 vaio 20 0 21228 8572 2432 S 0.0 0.2 0:00.07 nnn -d
10406 vaio 20 0 53808 42284 2248 S 0.0 0.8 0:00.82 ncdu
10409 vaio 20 0 20452 9172 2356 S 0.0 0.2 0:00.83 nnn -d
```
### Installation

49
nnn.c
View file

@ -149,26 +149,6 @@ static void printmsg(char *);
static void printwarn(void);
static void printerr(int, char *);
static void *
xmalloc(size_t size)
{
void *p = malloc(size);
if (p == NULL)
printerr(1, "malloc");
return p;
}
#if 0
static void *
xrealloc(void *p, size_t size)
{
p = realloc(p, size);
if (p == NULL)
printerr(1, "realloc");
return p;
}
#endif
static rlim_t
max_openfds()
{
@ -1022,34 +1002,21 @@ dentfill(char *path, struct entry **dents,
if (dirp == NULL)
return 0;
long pos = telldir(dirp);
while ((dp = readdir(dirp)) != NULL) {
if (filter(re, dp->d_name) == 0)
continue;
n++;
}
if (filter(re, ".") != 0)
n--;
if (filter(re, "..") != 0)
n--;
if (n == 0)
return n;
*dents = xmalloc(n * sizeof(**dents));
n = 0;
seekdir(dirp, pos);
while ((dp = readdir(dirp)) != NULL) {
/* Skip self and parent */
if ((dp->d_name[0] == '.' && (dp->d_name[1] == '\0' ||
(dp->d_name[1] == '.' && dp->d_name[2] == '\0'))))
continue;
if (filter(re, dp->d_name) == 0)
continue;
//*dents = xrealloc(*dents, (n + 1) * sizeof(**dents));
if (((n >> 5) << 5) == n) {
*dents = realloc(*dents, (n + 32) * sizeof(**dents));
if (*dents == NULL)
printerr(1, "realloc");
}
xstrlcpy((*dents)[n].name, dp->d_name, sizeof((*dents)[n].name));
/* Get mode flags */
mkpath(path, dp->d_name, newpath, sizeof(newpath));