diff options
| author | 2017-04-02 14:18:54 +0530 | |
|---|---|---|
| committer | 2017-04-02 14:33:36 +0530 | |
| commit | 4bc2ce0fbc27180ea5108121fec93eebf3112de1 (patch) | |
| tree | 5e4f3903b1b44f5d2ec74b790bc92f2d78674de1 | |
| parent | 691291245a88d1c2277d8900a13f41b00685a72c (diff) | |
| download | nnn-4bc2ce0fbc27180ea5108121fec93eebf3112de1.tar.gz | |
Optimize directory search
| -rw-r--r-- | nnn.c | 32 |
1 files changed, 20 insertions, 12 deletions
@@ -515,6 +515,9 @@ canopendir(char *path) return 1; } +/* + * Returns "dir/name or "/name" + */ static char * mkpath(char *dir, char *name, char *out, size_t n) { @@ -656,20 +659,25 @@ dentfree(struct entry *dents) /* Return the position of the matching entry or 0 otherwise */ static int -dentfind(struct entry *dents, int n, char *cwd, char *path) +dentfind(struct entry *dents, int n, char *path) { - char tmp[PATH_MAX]; - int i; - - if (path == NULL) + if (!path) return 0; - for (i = 0; i < n; i++) { - mkpath(cwd, dents[i].name, tmp, sizeof(tmp)); - DPRINTF_S(path); - DPRINTF_S(tmp); - if (strcmp(tmp, path) == 0) + + char *p = xmemrchr(path, '/', strlen(path)); + if (!p) + p = path; + else + /* We are assuming an entry with actual + name ending in '/' will not appear */ + p++; + + DPRINTF_S(p); + + for (int i = 0; i < n; i++) + if (strcmp(p, dents[i].name) == 0) return i; - } + return 0; } @@ -698,7 +706,7 @@ populate(char *path, char *oldpath, char *fltr) qsort(dents, ndents, sizeof(*dents), entrycmp); /* Find cur from history */ - cur = dentfind(dents, ndents, path, oldpath); + cur = dentfind(dents, ndents, oldpath); return 0; } |