commit 4bc2ce0fbc27180ea5108121fec93eebf3112de1
parent 691291245a88d1c2277d8900a13f41b00685a72c
Author: Arun Prakash Jana <engineerarun@gmail.com>
Date: Sun, 2 Apr 2017 14:18:54 +0530
Optimize directory search
Diffstat:
| M | nnn.c | | | 32 | ++++++++++++++++++++------------ |
1 file changed, 20 insertions(+), 12 deletions(-)
diff --git a/nnn.c b/nnn.c
@@ -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;
}