aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Arun Prakash Jana <engineerarun@gmail.com>2020-08-05 20:36:50 +0530
committerGravatar Arun Prakash Jana <engineerarun@gmail.com>2020-08-05 20:36:50 +0530
commitf712441edab64c45e980da9910974af5364ff564 (patch)
tree1d39dbd052dc9bdffecf2b876aa95796d1bb90bf /src
parenta1b43ae830882fa18c01662837e08b81aa6b5f1e (diff)
downloadnnn-f712441edab64c45e980da9910974af5364ff564.tar.gz
Utility functions to top, API to get file extn
Diffstat (limited to 'src')
-rw-r--r--src/nnn.c374
1 files changed, 187 insertions, 187 deletions
diff --git a/src/nnn.c b/src/nnn.c
index 1407672..da42690 100644
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -732,15 +732,10 @@ static haiku_nm_h haiku_hnd;
#endif /* __GNUC__ */
/* Forward declarations */
-static size_t xstrsncpy(char *restrict dst, const char *restrict src, size_t n);
static void redraw(char *path);
static int spawn(char *file, char *arg1, char *arg2, uchar flag);
static int (*nftw_fn)(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf);
-static int dentfind(const char *fname, int n);
static void move_cursor(int target, int ignore_scrolloff);
-static inline bool getutil(char *util);
-static size_t mkpath(const char *dir, const char *name, char *out);
-static bool plugscript(const char *plugin, uchar flags);
static char *load_input(int fd, const char *path);
static int set_sort_flags(int r);
@@ -824,128 +819,6 @@ static bool test_clear_bit(uint nr)
}
#endif
-static void clearinfoln(void)
-{
- move(xlines - 2, 0);
- clrtoeol();
-}
-
-#ifdef KEY_RESIZE
-/* Clear the old prompt */
-static void clearoldprompt(void)
-{
- clearinfoln();
- tolastln();
- addch('\n');
-}
-#endif
-
-/* Messages show up at the bottom */
-static inline void printmsg_nc(const char *msg)
-{
- tolastln();
- addstr(msg);
- addch('\n');
-}
-
-static void printmsg(const char *msg)
-{
- attron(COLOR_PAIR(cfg.curctx + 1));
- printmsg_nc(msg);
- attroff(COLOR_PAIR(cfg.curctx + 1));
-}
-
-static void printwait(const char *msg, int *presel)
-{
- printmsg(msg);
- if (presel) {
- *presel = MSGWAIT;
- if (ndents)
- xstrsncpy(g_ctx[cfg.curctx].c_name, pdents[cur].name, NAME_MAX + 1);
- }
-}
-
-/* Kill curses and display error before exiting */
-static void printerr(int linenum)
-{
- exitcurses();
- perror(xitoa(linenum));
- if (!g_state.picker && selpath)
- unlink(selpath);
- free(pselbuf);
- exit(1);
-}
-
-static inline bool xconfirm(int c)
-{
- return (c == 'y' || c == 'Y');
-}
-
-static int get_input(const char *prompt)
-{
- if (prompt)
- printmsg(prompt);
- cleartimeout();
-
- int r = getch();
-
-#ifdef KEY_RESIZE
- while (r == KEY_RESIZE) {
- if (prompt) {
- clearoldprompt();
- xlines = LINES;
- printmsg(prompt);
- }
-
- r = getch();
- }
-#endif
- settimeout();
- return r;
-}
-
-static int get_cur_or_sel(void)
-{
- if (selbufpos && ndents) {
- if (cfg.prefersel)
- return 's';
-
- int choice = get_input(messages[MSG_CUR_SEL_OPTS]);
-
- return ((choice == 'c' || choice == 's') ? choice : 0);
- }
-
- if (selbufpos)
- return 's';
-
- if (ndents)
- return 'c';
-
- return 0;
-}
-
-static void xdelay(useconds_t delay)
-{
- refresh();
- usleep(delay);
-}
-
-static char confirm_force(bool selection)
-{
- char str[64];
-
- snprintf(str, 64, messages[MSG_FORCE_RM],
- (selection ? xitoa(nselected) : "current"), (selection ? "(s)" : ""));
-
- int r = get_input(str);
-
- if (r == 27)
- return '\0'; /* cancel */
- if (r == 'y' || r == 'Y')
- return 'f'; /* forceful */
- return 'i'; /* interactive */
-}
-
/* Increase the limit on open file descriptors, if possible */
static rlim_t max_openfds(void)
{
@@ -1071,6 +944,58 @@ static void *xmemrchr(uchar *restrict s, uchar ch, size_t n)
#endif
}
+/* A very simplified implementation, changes path */
+static char *xdirname(char *path)
+{
+ char *base = xmemrchr((uchar *)path, '/', xstrlen(path));
+
+ if (base == path)
+ path[1] = '\0';
+ else
+ *base = '\0';
+
+ return path;
+}
+
+static char *xbasename(char *path)
+{
+ char *base = xmemrchr((uchar *)path, '/', xstrlen(path)); // NOLINT
+
+ return base ? base + 1 : path;
+}
+
+static char *xextension(const char *fname, size_t len)
+{
+ return xmemrchr((uchar *)fname, '.', len);
+}
+
+static inline bool getutil(char *util)
+{
+ return spawn("which", util, NULL, F_NORMAL | F_NOTRACE) == 0;
+}
+
+/*
+ * Updates out with "dir/name or "/name"
+ * Returns the number of bytes copied including the terminating NULL byte
+ */
+static size_t mkpath(const char *dir, const char *name, char *out)
+{
+ size_t len;
+
+ /* Handle absolute path */
+ if (name[0] == '/') // NOLINT
+ return xstrsncpy(out, name, PATH_MAX);
+
+ /* Handle root case */
+ if (istopdir(dir))
+ len = 1;
+ else
+ len = xstrsncpy(out, dir, PATH_MAX);
+
+ out[len - 1] = '/'; // NOLINT
+ return (xstrsncpy(out + len, name, PATH_MAX - len) + len);
+}
+
/* Assumes both the paths passed are directories */
static char *common_prefix(const char *path, char *prefix)
{
@@ -1174,37 +1099,139 @@ static char *abspath(const char *path, const char *cwd)
return resolved_path;
}
-/* A very simplified implementation, changes path */
-static char *xdirname(char *path)
+static int create_tmp_file(void)
{
- char *base = xmemrchr((uchar *)path, '/', xstrlen(path));
+ xstrsncpy(g_tmpfpath + tmpfplen - 1, messages[STR_TMPFILE], TMP_LEN_MAX - tmpfplen);
- if (base == path)
- path[1] = '\0';
- else
- *base = '\0';
+ int fd = mkstemp(g_tmpfpath);
- return path;
+ if (fd == -1) {
+ DPRINTF_S(strerror(errno));
+ }
+
+ return fd;
}
-static char *xbasename(char *path)
+static void clearinfoln(void)
{
- char *base = xmemrchr((uchar *)path, '/', xstrlen(path)); // NOLINT
+ move(xlines - 2, 0);
+ clrtoeol();
+}
- return base ? base + 1 : path;
+#ifdef KEY_RESIZE
+/* Clear the old prompt */
+static void clearoldprompt(void)
+{
+ clearinfoln();
+ tolastln();
+ addch('\n');
}
+#endif
-static int create_tmp_file(void)
+/* Messages show up at the bottom */
+static inline void printmsg_nc(const char *msg)
{
- xstrsncpy(g_tmpfpath + tmpfplen - 1, messages[STR_TMPFILE], TMP_LEN_MAX - tmpfplen);
+ tolastln();
+ addstr(msg);
+ addch('\n');
+}
- int fd = mkstemp(g_tmpfpath);
+static void printmsg(const char *msg)
+{
+ attron(COLOR_PAIR(cfg.curctx + 1));
+ printmsg_nc(msg);
+ attroff(COLOR_PAIR(cfg.curctx + 1));
+}
- if (fd == -1) {
- DPRINTF_S(strerror(errno));
+static void printwait(const char *msg, int *presel)
+{
+ printmsg(msg);
+ if (presel) {
+ *presel = MSGWAIT;
+ if (ndents)
+ xstrsncpy(g_ctx[cfg.curctx].c_name, pdents[cur].name, NAME_MAX + 1);
}
+}
- return fd;
+/* Kill curses and display error before exiting */
+static void printerr(int linenum)
+{
+ exitcurses();
+ perror(xitoa(linenum));
+ if (!g_state.picker && selpath)
+ unlink(selpath);
+ free(pselbuf);
+ exit(1);
+}
+
+static inline bool xconfirm(int c)
+{
+ return (c == 'y' || c == 'Y');
+}
+
+static int get_input(const char *prompt)
+{
+ if (prompt)
+ printmsg(prompt);
+ cleartimeout();
+
+ int r = getch();
+
+#ifdef KEY_RESIZE
+ while (r == KEY_RESIZE) {
+ if (prompt) {
+ clearoldprompt();
+ xlines = LINES;
+ printmsg(prompt);
+ }
+
+ r = getch();
+ }
+#endif
+ settimeout();
+ return r;
+}
+
+static int get_cur_or_sel(void)
+{
+ if (selbufpos && ndents) {
+ if (cfg.prefersel)
+ return 's';
+
+ int choice = get_input(messages[MSG_CUR_SEL_OPTS]);
+
+ return ((choice == 'c' || choice == 's') ? choice : 0);
+ }
+
+ if (selbufpos)
+ return 's';
+
+ if (ndents)
+ return 'c';
+
+ return 0;
+}
+
+static void xdelay(useconds_t delay)
+{
+ refresh();
+ usleep(delay);
+}
+
+static char confirm_force(bool selection)
+{
+ char str[64];
+
+ snprintf(str, 64, messages[MSG_FORCE_RM],
+ (selection ? xitoa(nselected) : "current"), (selection ? "(s)" : ""));
+
+ int r = get_input(str);
+
+ if (r == 27)
+ return '\0'; /* cancel */
+ if (r == 'y' || r == 'Y')
+ return 'f'; /* forceful */
+ return 'i'; /* interactive */
}
/* Writes buflen char(s) from buf to a file */
@@ -2395,8 +2422,8 @@ static int entrycmp(const void *va, const void *vb)
if (pb->blocks < pa->blocks)
return -1;
} else if (cfg.extnorder && !(pb->flags & DIR_OR_LINK_TO_DIR)) {
- char *extna = xmemrchr((uchar *)pa->name, '.', pa->nlen - 1);
- char *extnb = xmemrchr((uchar *)pb->name, '.', pb->nlen - 1);
+ char *extna = xextension(pa->name, pa->nlen - 1);
+ char *extnb = xextension(pb->name, pb->nlen - 1);
if (extna || extnb) {
if (!extna)
@@ -2650,6 +2677,19 @@ static int matches(const char *fltr)
return ndents;
}
+/*
+ * Return the position of the matching entry or 0 otherwise
+ * Note there's no NULL check for fname
+ */
+static int dentfind(const char *fname, int n)
+{
+ for (int i = 0; i < n; ++i)
+ if (xstrcmp(fname, pdents[i].name) == 0)
+ return i;
+
+ return 0;
+}
+
static int filterentries(char *path, char *lastname)
{
wchar_t *wln = (wchar_t *)alloca(sizeof(wchar_t) * REGEX_MAX);
@@ -3056,28 +3096,6 @@ static char *getreadline(const char *prompt)
#endif
/*
- * Updates out with "dir/name or "/name"
- * Returns the number of bytes copied including the terminating NULL byte
- */
-static size_t mkpath(const char *dir, const char *name, char *out)
-{
- size_t len;
-
- /* Handle absolute path */
- if (name[0] == '/') // NOLINT
- return xstrsncpy(out, name, PATH_MAX);
-
- /* Handle root case */
- if (istopdir(dir))
- len = 1;
- else
- len = xstrsncpy(out, dir, PATH_MAX);
-
- out[len - 1] = '/'; // NOLINT
- return (xstrsncpy(out + len, name, PATH_MAX - len) + len);
-}
-
-/*
* Create symbolic/hard link(s) to file(s) in selection list
* Returns the number of links created, -1 on error
*/
@@ -3889,11 +3907,6 @@ static char *get_output(char *buf, const size_t bytes, const char *file,
return NULL;
}
-static inline bool getutil(char *util)
-{
- return spawn("which", util, NULL, F_NORMAL | F_NOTRACE) == 0;
-}
-
static void pipetof(char *cmd, FILE *fout)
{
FILE *fin = popen(cmd, "r");
@@ -4977,19 +4990,6 @@ exit:
return n;
}
-/*
- * Return the position of the matching entry or 0 otherwise
- * Note there's no NULL check for fname
- */
-static int dentfind(const char *fname, int n)
-{
- for (int i = 0; i < n; ++i)
- if (xstrcmp(fname, pdents[i].name) == 0)
- return i;
-
- return 0;
-}
-
static void populate(char *path, char *lastname)
{
#ifdef DBGMODE
@@ -5346,7 +5346,7 @@ static void statusbar(char *path)
/* Get the file extension for regular files */
if (S_ISREG(pent->mode)) {
i = (int)(pent->nlen - 1);
- ptr = xmemrchr((uchar *)pent->name, '.', i);
+ ptr = xextension(pent->name, i);
if (ptr)
extnlen = i - (ptr - pent->name);
if (!ptr || extnlen > 5 || extnlen < 2)