diff options
-rw-r--r-- | nnn.c | 116 |
1 files changed, 64 insertions, 52 deletions
@@ -41,8 +41,8 @@ #define CONTROL(c) ((c) ^ 0x40) #define TOUPPER(ch) \ (((ch) >= 'a' && (ch) <= 'z') ? ((ch) - 'a' + 'A') : (ch)) -#define MAX_LEN 1024 -#define cur(flag) (flag ? CURSR : EMPTY) +#define MAX_CMD_LEN (PATH_MAX << 1) +#define CURSYM(flag) (flag ? CURSR : EMPTY) struct assoc { char *regex; /* Regex to match on filename */ @@ -82,12 +82,12 @@ struct key { #include "config.h" -struct entry { +typedef struct entry { char name[PATH_MAX]; mode_t mode; time_t t; off_t size; -}; +} *pEntry; /* Global context */ struct entry *dents; @@ -96,7 +96,6 @@ int idle; char *opener = NULL; char *fallback_opener = NULL; char *copier = NULL; -char size_buf[12]; /* Buffer to hold human readable size */ const char* size_units[] = {"B", "K", "M", "G", "T", "P", "E", "Z", "Y"}; /* @@ -281,12 +280,12 @@ int entrycmp(const void *va, const void *vb) { if (mtimeorder) - return ((struct entry *)vb)->t - ((struct entry *)va)->t; + return ((pEntry)vb)->t - ((pEntry)va)->t; if (sizeorder) - return ((struct entry *)vb)->size - ((struct entry *)va)->size; + return ((pEntry)vb)->size - ((pEntry)va)->size; - return xstricmp(((struct entry *)va)->name, ((struct entry *)vb)->name); + return xstricmp(((pEntry)va)->name, ((pEntry)vb)->name); } void @@ -442,6 +441,7 @@ void (*printptr)(struct entry *ent, int active) = &printent; char* coolsize(off_t size) { + static char size_buf[12]; /* Buffer to hold human readable size */ int i = 0; long double fsize = (double)size; @@ -467,21 +467,29 @@ printent_long(struct entry *ent, int active) attron(A_REVERSE); if (S_ISDIR(ent->mode)) - printw("%s%-17.17s %s/\n", cur(active), buf, ent->name); + printw("%s%-17.17s / %s/\n", + CURSYM(active), buf, ent->name); else if (S_ISLNK(ent->mode)) - printw("%s%-17.17s %s@\n", cur(active), buf, ent->name); + printw("%s%-17.17s @ %s@\n", + CURSYM(active), buf, ent->name); else if (S_ISSOCK(ent->mode)) - printw("%s%-17.17s %s=\n", cur(active), buf, ent->name); + printw("%s%-17.17s = %s=\n", + CURSYM(active), buf, ent->name); else if (S_ISFIFO(ent->mode)) - printw("%s%-17.17s %s|\n", cur(active), buf, ent->name); + printw("%s%-17.17s | %s|\n", + CURSYM(active), buf, ent->name); else if (S_ISBLK(ent->mode)) - printw("%s%-17.17s b %s\n", cur(active), buf, ent->name); + printw("%s%-17.17s b %s\n", + CURSYM(active), buf, ent->name); else if (S_ISCHR(ent->mode)) - printw("%s%-17.17s c %s\n", cur(active), buf, ent->name); + printw("%s%-17.17s c %s\n", + CURSYM(active), buf, ent->name); else if (ent->mode & S_IXUSR) - printw("%s%-17.17s %8.8s %s*\n", cur(active), buf, coolsize(ent->size), ent->name); + printw("%s%-17.17s %8.8s* %s*\n", CURSYM(active), + buf, coolsize(ent->size), ent->name); else - printw("%s%-17.17s %8.8s %s\n", cur(active), buf, coolsize(ent->size), ent->name); + printw("%s%-17.17s %8.8s %s\n", CURSYM(active), + buf, coolsize(ent->size), ent->name); if (active) attroff(A_REVERSE); @@ -585,10 +593,9 @@ populate(char *path, char *oldpath, char *fltr) void redraw(char *path) { - char cwd[PATH_MAX], cwdresolved[PATH_MAX]; - size_t ncols; - int nlines, odd; - int i; + static char cwd[PATH_MAX]; + static int nlines, odd; + static int i; nlines = MIN(LINES - 4, ndents); @@ -606,17 +613,12 @@ redraw(char *path) DPRINTF_S(path); /* No text wrapping in cwd line */ - ncols = COLS; - if (ncols > PATH_MAX) - ncols = PATH_MAX; - strlcpy(cwd, path, ncols); - cwd[ncols - strlen(CWD) - 1] = '\0'; - if (!realpath(path, cwdresolved)) { + if (!realpath(path, cwd)) { printmsg("Cannot resolve path"); return; } - printw(CWD "%s\n\n", cwdresolved); + printw(CWD "%s\n\n", cwd); /* Print listing */ odd = ISODD(nlines); @@ -648,9 +650,10 @@ redraw(char *path) else if (dents[cur].mode & S_IXUSR) ind = '*'; - ind - ? sprintf(cwd, "%d items [%s%c]", ndents, dents[cur].name, ind) - : sprintf(cwd, "%d items [%s]", ndents, dents[cur].name); + ind ? sprintf(cwd, "%d items [%s%c]", + ndents, dents[cur].name, ind) + : sprintf(cwd, "%d items [%s]", + ndents, dents[cur].name); printmsg(cwd); } else @@ -661,8 +664,8 @@ redraw(char *path) void browse(char *ipath, char *ifilter) { - char path[PATH_MAX], oldpath[PATH_MAX], newpath[PATH_MAX]; - char fltr[LINE_MAX]; + static char path[PATH_MAX], oldpath[PATH_MAX], newpath[PATH_MAX]; + static char fltr[LINE_MAX]; char *bin, *dir, *tmp, *run, *env; struct stat sb; regex_t re; @@ -671,6 +674,7 @@ browse(char *ipath, char *ifilter) strlcpy(path, ipath, sizeof(path)); strlcpy(fltr, ifilter, sizeof(fltr)); oldpath[0] = '\0'; + newpath[0] = '\0'; begin: r = populate(path, oldpath, fltr); if (r == -1) { @@ -736,43 +740,47 @@ nochange: strlcpy(fltr, ifilter, sizeof(fltr)); goto begin; case S_IFREG: + { + static char cmd[MAX_CMD_LEN]; + static char *runvi = "vi"; + static int status; + static FILE *fp; + /* If default mime opener is set, use it */ if (opener) { - char cmd[MAX_LEN]; - int status; - - snprintf(cmd, MAX_LEN, "%s \"%s\" > /dev/null 2>&1", - opener, newpath); + snprintf(cmd, MAX_CMD_LEN, + "%s \"%s\" > /dev/null 2>&1", + opener, newpath); status = system(cmd); continue; } /* Try custom applications */ bin = openwith(newpath); - char *execvi = "vi"; if (bin == NULL) { - /* If a custom handler application is not set, open - plain text files with vi, then try fallback_opener */ - FILE *fp; - char cmd[MAX_LEN]; - int status; - - snprintf(cmd, MAX_LEN, "file \"%s\"", newpath); + /* If a custom handler application is + not set, open plain text files with + vi, then try fallback_opener */ + snprintf(cmd, MAX_CMD_LEN, + "file \"%s\"", newpath); fp = popen(cmd, "r"); if (fp == NULL) goto nochange; - if (fgets(cmd, MAX_LEN, fp) == NULL) { + if (fgets(cmd, MAX_CMD_LEN, fp) == NULL) { pclose(fp); goto nochange; } pclose(fp); if (strstr(cmd, "ASCII text") != NULL) - bin = execvi; + bin = runvi; else if (fallback_opener) { - snprintf(cmd, MAX_LEN, "%s \"%s\" > /dev/null 2>&1", - fallback_opener, newpath); + snprintf(cmd, MAX_CMD_LEN, + "%s \"%s\" > \ + /dev/null 2>&1", + fallback_opener, + newpath); status = system(cmd); continue; } else { @@ -784,6 +792,7 @@ nochange: spawn(bin, newpath, NULL); initcurses(); continue; + } default: printmsg("Unsupported file"); goto nochange; @@ -872,7 +881,8 @@ nochange: goto begin; case SEL_DETAIL: showdetail = !showdetail; - showdetail ? (printptr = &printent_long) : (printptr = &printent); + showdetail ? (printptr = &printent_long) + : (printptr = &printent); /* Save current */ if (ndents > 0) mkpath(path, dents[cur].name, oldpath, sizeof(oldpath)); @@ -901,9 +911,11 @@ nochange: char abspath[PATH_MAX]; if (strcmp(path, "/") == 0) - snprintf(abspath, PATH_MAX, "/%s", dents[cur].name); + snprintf(abspath, PATH_MAX, "/%s", + dents[cur].name); else - snprintf(abspath, PATH_MAX, "%s/%s", path, dents[cur].name); + snprintf(abspath, PATH_MAX, "%s/%s", + path, dents[cur].name); spawn(copier, abspath, NULL); printmsg(abspath); } else if (!copier) |