From 286a13d89104a7bf1b7f29104973924186e6a40c Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Tue, 11 Apr 2017 19:16:06 +0530 Subject: [PATCH] realloc() 32 entries at a time --- README.md | 6 +++--- nnn.c | 49 ++++++++----------------------------------------- 2 files changed, 11 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 96405546..8dff3d40 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/nnn.c b/nnn.c index 9dc7afbc..318fffe7 100644 --- a/nnn.c +++ b/nnn.c @@ -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));