return end - dst;
}
+static inline size_t xstrlen(const char *s)
+{
+#if !defined(__GLIBC__)
+ return strlen(s);
+#else
+ return (char *)rawmemchr(s, '\0') - s;
+#endif
+}
+
+static char *xstrdup(const char* s)
+{
+ size_t len = xstrlen(s) + 1;
+ char *ptr = malloc(len);
+
+ if (ptr)
+ xstrsncpy(ptr, s, len);
+ return ptr;
+}
+
static bool is_suffix(const char *str, const char *suffix)
{
if (!str || !suffix)
return FALSE;
- size_t lenstr = strlen(str);
- size_t lensuffix = strlen(suffix);
+ size_t lenstr = xstrlen(str);
+ size_t lensuffix = xstrlen(suffix);
if (lensuffix > lenstr)
return FALSE;
* The poor man's implementation of memrchr(3).
* We are only looking for '/' in this program.
* And we are NOT expecting a '/' at the end.
- * Ideally 0 < n <= strlen(s).
+ * Ideally 0 < n <= xstrlen(s).
*/
static void *xmemrchr(uchar *s, uchar ch, size_t n)
{
if (!path || !cwd)
return NULL;
- size_t dst_size = 0, src_size = strlen(path), cwd_size = strlen(cwd);
+ size_t dst_size = 0, src_size = xstrlen(path), cwd_size = xstrlen(cwd);
const char *src;
char *dst;
char *resolved_path = malloc(src_size + (*path == '/' ? 0 : cwd_size) + 1);
/* A very simplified implementation, changes path */
static char *xdirname(char *path)
{
- char *base = xmemrchr((uchar *)path, '/', strlen(path));
+ char *base = xmemrchr((uchar *)path, '/', xstrlen(path));
if (base == path)
path[1] = '\0';
static char *xbasename(char *path)
{
- char *base = xmemrchr((uchar *)path, '/', strlen(path)); // NOLINT
+ char *base = xmemrchr((uchar *)path, '/', xstrlen(path)); // NOLINT
return base ? base + 1 : path;
}
lastpos = selbufpos - 1;
while (pos <= lastpos) {
- len = strlen(pbuf);
+ len = xstrlen(pbuf);
pos += len;
r = write(fd, pbuf, len);
}
if (flag & F_MULTI) {
- size_t len = strlen(file) + 1;
+ size_t len = xstrlen(file) + 1;
cmd = (char *)malloc(len);
if (!cmd) {
if (fd1 == -1)
return ret;
- xstrsncpy(foriginal, g_tmpfpath, strlen(g_tmpfpath) + 1);
+ xstrsncpy(foriginal, g_tmpfpath, xstrlen(g_tmpfpath) + 1);
fd2 = create_tmp_file();
if (fd2 == -1) {
static void archive_selection(const char *cmd, const char *archive, const char *curpath)
{
/* The 70 comes from the string below */
- char *buf = (char *)malloc((70 + strlen(cmd) + strlen(archive)
- + strlen(curpath) + strlen(selpath)) * sizeof(char));
+ char *buf = (char *)malloc((70 + xstrlen(cmd) + xstrlen(archive)
+ + xstrlen(curpath) + xstrlen(selpath)) * sizeof(char));
if (!buf) {
DPRINTF_S(strerror(errno));
printwarn(NULL);
static bool write_lastdir(const char *curpath)
{
bool ret = TRUE;
- size_t len = strlen(cfgdir);
+ size_t len = xstrlen(cfgdir);
xstrsncpy(cfgdir + len, "/.lastd", 8);
DPRINTF_S(cfgdir);
static int visible_re(const fltrexp_t *fltrexp, const char *fname)
{
#ifdef PCRE
- return pcre_exec(fltrexp->pcrex, NULL, fname, strlen(fname), 0, 0, NULL, 0) == 0;
+ return pcre_exec(fltrexp->pcrex, NULL, fname, xstrlen(fname), 0, 0, NULL, 0) == 0;
#else
return regexec(fltrexp->regex, fname, 0, NULL, 0) == 0;
#endif
((fnstrstr == &strcasestr) ? "ic" : "noic"));
clearinfoln();
- mvaddstr(xlines - 2, xcols - strlen(info), info);
+ mvaddstr(xlines - 2, xcols - xstrlen(info), info);
}
static void showfilter(char *str)
}
while (pos < selbufpos) {
- len = strlen(psel);
+ len = xstrlen(psel);
fname = xbasename(psel);
r = xstrsncpy(buf, prefix, NAME_MAX + 1); /* Copy prefix */
return TRUE;
nextkey = ptr;
- while (*nextkey) {
- if (*nextkey == ':')
+ while (*nextkey)
+ if (*nextkey++ == ':')
++maxitems;
- ++nextkey;
- }
if (!maxitems || maxitems > 100)
return FALSE;
kvarr = *arr;
- *envcpy = strdup(ptr);
+ *envcpy = xstrdup(ptr);
if (!*envcpy) {
xerror();
return FALSE;
}
- if (nextkey - ptr > 1)
- /* Clear trailing ; or / */
- if (*--nextkey == ';')
- *(*envcpy + (nextkey - ptr)) = '\0';
+ /* Clear trailing ;s */
+ if (*--nextkey == ';')
+ *(*envcpy + (nextkey - ptr)) = '\0';
ptr = *envcpy;
nextkey = ptr;
/* Redundant check so far, all paths will get evaluated and fail */
//for (i = 0; i < maxitems && kvarr[i].key; ++i)
- // if (strlen(kvarr[i].val) >= PATH_MAX)
+ // if (xstrlen(kvarr[i].val) >= PATH_MAX)
// return FALSE;
*items = maxitems;
return kvarr[r].val;
if (kvarr[r].val[0] == '~') {
- ssize_t len = strlen(home);
- ssize_t loclen = strlen(kvarr[r].val);
+ ssize_t len = xstrlen(home);
+ ssize_t loclen = xstrlen(kvarr[r].val);
xstrsncpy(g_buf, home, len + 1);
xstrsncpy(g_buf + len, kvarr[r].val + 1, loclen);
char *frac = xitoa(rem);
size_t toprint = i > 3 ? 3 : i;
- size_t len = strlen(frac);
+ size_t len = xstrlen(frac);
if (len < toprint) {
size_buf[ret] = size_buf[ret + 1] = size_buf[ret + 2] = '0';
}
size = coolsize(cfg.blkorder ? ent->blocks << blk_shift : ent->size);
- len = 10 - (uint)strlen(size);
+ len = 10 - (uint)xstrlen(size);
while (--len)
addch(' ');
addstr(size);
{
char *dir, *cmd = utils[UTIL_ARCHIVEMOUNT];
char *name = dents[cur].name;
- size_t len;
+ size_t len = dents[cur].nlen;
if (!getutil(cmd)) {
printmsg(messages[MSG_UTIL_MISSING]);
return FALSE;
}
- dir = strdup(name);
+ dir = xstrdup(name);
if (!dir) {
printmsg(messages[MSG_FAILED]);
return FALSE;
}
- len = strlen(dir);
-
while (len > 1)
if (dir[--len] == '.') {
dir[len] = '\0';
}
/* Convert "Host" to "Host:" */
- size_t len = strlen(tmp);
+ size_t len = xstrlen(tmp);
if (tmp[len - 1] != ':') { /* Append ':' if missing */
tmp[len] = ':';
xstrsncpy(g_buf, file, PATH_MAX);
- len = strlen(g_buf);
+ len = xstrlen(g_buf);
if (len > 1 && g_buf[len - 1] == '*') {
flags &= ~F_CONFIRM; /* Skip user confirmation */
g_buf[len - 1] = '\0'; /* Get rid of trailing no confirmation symbol */
if (cfg.blkorder) {
num_files = 0;
dir_blocks = 0;
- buf = (char *)alloca(strlen(path) + NAME_MAX + 2);
+ buf = (char *)alloca(xstrlen(path) + NAME_MAX + 2);
if (!buf)
return 0;
attron(A_UNDERLINE);
/* Print path */
- i = (int)strlen(path);
+ i = (int)xstrlen(path);
if ((i + MIN_DISPLAY_COLS) <= ncols)
addnstr(path, ncols - MIN_DISPLAY_COLS);
else {
#ifdef PCRE
if (!pcre_exec(archive_pcre, NULL, dents[cur].name,
- strlen(dents[cur].name), 0, 0, NULL, 0)) {
+ xstrlen(dents[cur].name), 0, 0, NULL, 0)) {
#else
if (!regexec(&archive_re, dents[cur].name, 0, NULL, 0)) {
#endif
goto begin;
case SEL_PIN:
free(mark);
- mark = strdup(path);
+ mark = xstrdup(path);
printwait(mark, &presel);
goto nochange;
case SEL_FLTR:
int err, ignore = 0;
struct stat sb;
char *slash, *tmp;
- ssize_t len = strlen(prefix);
+ ssize_t len = xstrlen(prefix);
char *tmpdir = malloc(sizeof(char) * (PATH_MAX + TMP_LEN_MAX));
if (!tmpdir) {
}
/* Don't copy the common prefix */
- xstrsncpy(tmp, paths[i] + len, strlen(paths[i]) - len + 1);
+ xstrsncpy(tmp, paths[i] + len, xstrlen(paths[i]) - len + 1);
/* Get the dir containing the path */
- slash = xmemrchr((uchar *)tmp, '/', strlen(paths[i]) - len);
+ slash = xmemrchr((uchar *)tmp, '/', xstrlen(paths[i]) - len);
if (slash)
*slash = '\0';
if (prefixpath[0]) {
if (entries == 1) {
- tmp = xmemrchr((uchar *)prefixpath, '/', strlen(prefixpath));
+ tmp = xmemrchr((uchar *)prefixpath, '/', xstrlen(prefixpath));
if (!tmp)
goto malloc_2;
return FALSE;
}
- len = strlen(xdgcfg) + 1 + 13; /* add length of "/nnn/sessions" */
+ len = xstrlen(xdgcfg) + 1 + 13; /* add length of "/nnn/sessions" */
xdg = TRUE;
}
if (!xdg)
- len = strlen(home) + 1 + 21; /* add length of "/.config/nnn/sessions" */
+ len = xstrlen(home) + 1 + 21; /* add length of "/.config/nnn/sessions" */
cfgdir = (char *)malloc(len);
plugindir = (char *)malloc(len);
middle_click_key = (uchar)middle_click_env[0];
#endif
const char* const env_opts = xgetenv(env_cfg[NNN_OPTS], NULL);
- int env_opts_id = env_opts ? (int)strlen(env_opts) : -1;
+ int env_opts_id = env_opts ? (int)xstrlen(env_opts) : -1;
#ifndef NORL
bool rlhist = FALSE;
#endif
} else {
arg = argv[optind];
DPRINTF_S(arg);
- if (strlen(arg) > 7 && !strncmp(arg, "file://", 7))
+ if (xstrlen(arg) > 7 && !strncmp(arg, "file://", 7))
arg = arg + 7;
initpath = realpath(arg, NULL);
DPRINTF_S(initpath);