mirror of
https://github.com/jarun/nnn.git
synced 2024-11-28 13:51:31 +00:00
Home-grown APIs, reduced binary size (<40KB)
This commit is contained in:
parent
00f9ae9c85
commit
3bf858a580
117
nnn.c
117
nnn.c
|
@ -178,6 +178,7 @@ static size_t fs_free;
|
||||||
static uint open_max;
|
static uint open_max;
|
||||||
static bm bookmark[MAX_BM];
|
static bm bookmark[MAX_BM];
|
||||||
static const double div_2_pow_10 = 1.0 / 1024.0;
|
static const double div_2_pow_10 = 1.0 / 1024.0;
|
||||||
|
static uint _WSHIFT;
|
||||||
|
|
||||||
/* Utilities to open files, run actions */
|
/* Utilities to open files, run actions */
|
||||||
static char *utils[] = {
|
static char *utils[] = {
|
||||||
|
@ -239,15 +240,96 @@ max_openfds()
|
||||||
return 32;
|
return 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Just a safe strncpy(3) */
|
/*
|
||||||
static void
|
* Custom xstrlen()
|
||||||
|
*/
|
||||||
|
static size_t
|
||||||
|
xstrlen(const char *s)
|
||||||
|
{
|
||||||
|
static size_t len;
|
||||||
|
|
||||||
|
if (!s)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
len = 0;
|
||||||
|
while (*s) {
|
||||||
|
++len, ++s;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Just a safe strncpy(3)
|
||||||
|
* Always null ('\0') terminates if both src and dest are valid pointers.
|
||||||
|
* Returns the number of bytes copied including terminating null byte.
|
||||||
|
*/
|
||||||
|
static size_t
|
||||||
xstrlcpy(char *dest, const char *src, size_t n)
|
xstrlcpy(char *dest, const char *src, size_t n)
|
||||||
{
|
{
|
||||||
|
static size_t len, blocks;
|
||||||
|
|
||||||
|
if (!src || !dest)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
len = xstrlen(src) + 1;
|
||||||
|
if (n > len)
|
||||||
|
n = len;
|
||||||
|
else if (len > n)
|
||||||
|
/* Save total number of bytes to copy in len */
|
||||||
|
len = n;
|
||||||
|
|
||||||
|
blocks = n >> _WSHIFT;
|
||||||
|
n -= (blocks << _WSHIFT);
|
||||||
|
|
||||||
|
if (blocks) {
|
||||||
|
static ulong *s, *d;
|
||||||
|
|
||||||
|
s = (ulong *)src;
|
||||||
|
d = (ulong *)dest;
|
||||||
|
|
||||||
|
while (blocks) {
|
||||||
|
*d = *s;
|
||||||
|
++d, ++s;
|
||||||
|
--blocks;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!n) {
|
||||||
|
dest = (char *)d;
|
||||||
|
*--dest = '\0';
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
src = (char *)s;
|
||||||
|
dest = (char *)d;
|
||||||
|
}
|
||||||
|
|
||||||
while (--n && (*dest = *src))
|
while (--n && (*dest = *src))
|
||||||
++dest, ++src;
|
++dest, ++src;
|
||||||
|
|
||||||
if (!n)
|
if (!n)
|
||||||
*dest = '\0';
|
*dest = '\0';
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Custom strcmp(), just what we need.
|
||||||
|
* Returns 0 if same, else -1
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
xstrcmp(const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
if (!s1 || !s2)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
while (*s1 && *s1 == *s2)
|
||||||
|
++s1, ++s2;
|
||||||
|
|
||||||
|
if (*s1 != *s2)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -518,7 +600,7 @@ strstrip(char *s)
|
||||||
if (!s || !*s)
|
if (!s || !*s)
|
||||||
return s;
|
return s;
|
||||||
|
|
||||||
size_t len = strlen(s) - 1;
|
size_t len = xstrlen(s) - 1;
|
||||||
|
|
||||||
while (len != 0 && (isspace(s[len]) || s[len] == '/'))
|
while (len != 0 && (isspace(s[len]) || s[len] == '/'))
|
||||||
--len;
|
--len;
|
||||||
|
@ -868,7 +950,7 @@ mkpath(char *dir, char *name, char *out, size_t n)
|
||||||
xstrlcpy(out, name, n);
|
xstrlcpy(out, name, n);
|
||||||
else {
|
else {
|
||||||
/* Handle root case */
|
/* Handle root case */
|
||||||
if (strcmp(dir, "/") == 0)
|
if (dir[0] == '/' && dir[1] == '\0')
|
||||||
snprintf(out, n, "/%s", name);
|
snprintf(out, n, "/%s", name);
|
||||||
else
|
else
|
||||||
snprintf(out, n, "%s/%s", dir, name);
|
snprintf(out, n, "%s/%s", dir, name);
|
||||||
|
@ -1612,7 +1694,7 @@ dentfind(struct entry *dents, int n, char *path)
|
||||||
DPRINTF_S(p);
|
DPRINTF_S(p);
|
||||||
|
|
||||||
for (i = 0; i < n; ++i)
|
for (i = 0; i < n; ++i)
|
||||||
if (strcmp(p, dents[i].name) == 0)
|
if (xstrcmp(p, dents[i].name) == 0)
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1657,7 +1739,7 @@ redraw(char *path)
|
||||||
erase();
|
erase();
|
||||||
|
|
||||||
/* Strip trailing slashes */
|
/* Strip trailing slashes */
|
||||||
for (i = strlen(path) - 1; i > 0; --i)
|
for (i = xstrlen(path) - 1; i > 0; --i)
|
||||||
if (path[i] == '/')
|
if (path[i] == '/')
|
||||||
path[i] = '\0';
|
path[i] = '\0';
|
||||||
else
|
else
|
||||||
|
@ -1675,7 +1757,8 @@ redraw(char *path)
|
||||||
ncols = COLS;
|
ncols = COLS;
|
||||||
if (ncols > PATH_MAX)
|
if (ncols > PATH_MAX)
|
||||||
ncols = PATH_MAX;
|
ncols = PATH_MAX;
|
||||||
g_buf[ncols - strlen(CWD) - 1] = '\0';
|
/* - xstrlen(CWD) - 1 = 6 */
|
||||||
|
g_buf[ncols - 6] = '\0';
|
||||||
printw(CWD "%s\n\n", g_buf);
|
printw(CWD "%s\n\n", g_buf);
|
||||||
|
|
||||||
if (cfg.showcolor) {
|
if (cfg.showcolor) {
|
||||||
|
@ -2069,7 +2152,7 @@ nochange:
|
||||||
if (truecd == 0) {
|
if (truecd == 0) {
|
||||||
/* Probable change in dir */
|
/* Probable change in dir */
|
||||||
/* No-op if it's the same directory */
|
/* No-op if it's the same directory */
|
||||||
if (strcmp(path, newpath) == 0)
|
if (xstrcmp(path, newpath) == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
oldpath[0] = '\0';
|
oldpath[0] = '\0';
|
||||||
|
@ -2102,7 +2185,7 @@ nochange:
|
||||||
goto nochange;
|
goto nochange;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(path, tmp) == 0)
|
if (xstrcmp(path, tmp) == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Save last working directory */
|
/* Save last working directory */
|
||||||
|
@ -2122,7 +2205,7 @@ nochange:
|
||||||
goto nochange;
|
goto nochange;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(path, ipath) == 0)
|
if (xstrcmp(path, ipath) == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Save last working directory */
|
/* Save last working directory */
|
||||||
|
@ -2166,7 +2249,7 @@ nochange:
|
||||||
clearprompt();
|
clearprompt();
|
||||||
|
|
||||||
for (r = 0; bookmark[r].key && r < MAX_BM; ++r) {
|
for (r = 0; bookmark[r].key && r < MAX_BM; ++r) {
|
||||||
if (strcmp(bookmark[r].key, tmp) == 0) {
|
if (xstrcmp(bookmark[r].key, tmp) == 0) {
|
||||||
if (bookmark[r].loc[0] == '~') {
|
if (bookmark[r].loc[0] == '~') {
|
||||||
/* Expand ~ to HOME */
|
/* Expand ~ to HOME */
|
||||||
char *home = getenv("HOME");
|
char *home = getenv("HOME");
|
||||||
|
@ -2191,7 +2274,7 @@ nochange:
|
||||||
goto nochange;
|
goto nochange;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(path, newpath) == 0)
|
if (xstrcmp(path, newpath) == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
oldpath[0] = '\0';
|
oldpath[0] = '\0';
|
||||||
|
@ -2325,7 +2408,7 @@ nochange:
|
||||||
goto begin;
|
goto begin;
|
||||||
case SEL_COPY:
|
case SEL_COPY:
|
||||||
if (copier && ndents) {
|
if (copier && ndents) {
|
||||||
if (strcmp(path, "/") == 0)
|
if (path[0] == '/' && path[1] == '\0')
|
||||||
snprintf(newpath, PATH_MAX, "/%s",
|
snprintf(newpath, PATH_MAX, "/%s",
|
||||||
dents[cur].name);
|
dents[cur].name);
|
||||||
else
|
else
|
||||||
|
@ -2435,6 +2518,14 @@ main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the word shift */
|
||||||
|
_WSHIFT = sizeof(ulong);
|
||||||
|
if (_WSHIFT == 8)
|
||||||
|
_WSHIFT = 3;
|
||||||
|
else
|
||||||
|
_WSHIFT = 2;
|
||||||
|
|
||||||
|
/* Increase current open file descriptor limit */
|
||||||
open_max = max_openfds();
|
open_max = max_openfds();
|
||||||
|
|
||||||
if (getuid() == 0)
|
if (getuid() == 0)
|
||||||
|
|
Loading…
Reference in a new issue