mirror of
https://github.com/jarun/nnn.git
synced 2024-11-13 15:34:52 +03: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 bm bookmark[MAX_BM];
|
||||
static const double div_2_pow_10 = 1.0 / 1024.0;
|
||||
static uint _WSHIFT;
|
||||
|
||||
/* Utilities to open files, run actions */
|
||||
static char *utils[] = {
|
||||
@ -239,15 +240,96 @@ max_openfds()
|
||||
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)
|
||||
{
|
||||
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))
|
||||
++dest, ++src;
|
||||
|
||||
if (!n)
|
||||
*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)
|
||||
return s;
|
||||
|
||||
size_t len = strlen(s) - 1;
|
||||
size_t len = xstrlen(s) - 1;
|
||||
|
||||
while (len != 0 && (isspace(s[len]) || s[len] == '/'))
|
||||
--len;
|
||||
@ -868,7 +950,7 @@ mkpath(char *dir, char *name, char *out, size_t n)
|
||||
xstrlcpy(out, name, n);
|
||||
else {
|
||||
/* Handle root case */
|
||||
if (strcmp(dir, "/") == 0)
|
||||
if (dir[0] == '/' && dir[1] == '\0')
|
||||
snprintf(out, n, "/%s", name);
|
||||
else
|
||||
snprintf(out, n, "%s/%s", dir, name);
|
||||
@ -1612,7 +1694,7 @@ dentfind(struct entry *dents, int n, char *path)
|
||||
DPRINTF_S(p);
|
||||
|
||||
for (i = 0; i < n; ++i)
|
||||
if (strcmp(p, dents[i].name) == 0)
|
||||
if (xstrcmp(p, dents[i].name) == 0)
|
||||
return i;
|
||||
|
||||
return 0;
|
||||
@ -1657,7 +1739,7 @@ redraw(char *path)
|
||||
erase();
|
||||
|
||||
/* Strip trailing slashes */
|
||||
for (i = strlen(path) - 1; i > 0; --i)
|
||||
for (i = xstrlen(path) - 1; i > 0; --i)
|
||||
if (path[i] == '/')
|
||||
path[i] = '\0';
|
||||
else
|
||||
@ -1675,7 +1757,8 @@ redraw(char *path)
|
||||
ncols = COLS;
|
||||
if (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);
|
||||
|
||||
if (cfg.showcolor) {
|
||||
@ -2069,7 +2152,7 @@ nochange:
|
||||
if (truecd == 0) {
|
||||
/* Probable change in dir */
|
||||
/* No-op if it's the same directory */
|
||||
if (strcmp(path, newpath) == 0)
|
||||
if (xstrcmp(path, newpath) == 0)
|
||||
break;
|
||||
|
||||
oldpath[0] = '\0';
|
||||
@ -2102,7 +2185,7 @@ nochange:
|
||||
goto nochange;
|
||||
}
|
||||
|
||||
if (strcmp(path, tmp) == 0)
|
||||
if (xstrcmp(path, tmp) == 0)
|
||||
break;
|
||||
|
||||
/* Save last working directory */
|
||||
@ -2122,7 +2205,7 @@ nochange:
|
||||
goto nochange;
|
||||
}
|
||||
|
||||
if (strcmp(path, ipath) == 0)
|
||||
if (xstrcmp(path, ipath) == 0)
|
||||
break;
|
||||
|
||||
/* Save last working directory */
|
||||
@ -2166,7 +2249,7 @@ nochange:
|
||||
clearprompt();
|
||||
|
||||
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] == '~') {
|
||||
/* Expand ~ to HOME */
|
||||
char *home = getenv("HOME");
|
||||
@ -2191,7 +2274,7 @@ nochange:
|
||||
goto nochange;
|
||||
}
|
||||
|
||||
if (strcmp(path, newpath) == 0)
|
||||
if (xstrcmp(path, newpath) == 0)
|
||||
break;
|
||||
|
||||
oldpath[0] = '\0';
|
||||
@ -2325,7 +2408,7 @@ nochange:
|
||||
goto begin;
|
||||
case SEL_COPY:
|
||||
if (copier && ndents) {
|
||||
if (strcmp(path, "/") == 0)
|
||||
if (path[0] == '/' && path[1] == '\0')
|
||||
snprintf(newpath, PATH_MAX, "/%s",
|
||||
dents[cur].name);
|
||||
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();
|
||||
|
||||
if (getuid() == 0)
|
||||
|
Loading…
Reference in New Issue
Block a user