diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nnn.c | 151 |
1 files changed, 83 insertions, 68 deletions
@@ -3360,59 +3360,38 @@ static char *coolsize(off_t size) return size_buf; } -static char get_ind(mode_t mode, bool perms, uchar *pair) +/* Convert a mode field into "ls -l" type perms field. */ +static char *get_lsperms(mode_t mode) { + static const char * const rwx[] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"}; + static char bits[11] = {'\0'}; + switch (mode & S_IFMT) { case S_IFREG: - if (perms) - return '-'; - if (mode & 0100) { - *pair = C_EXE; - return '*'; - } - *pair = C_FIL; - return '\0'; + bits[0] = '-'; + break; case S_IFDIR: - if (perms) - return 'd'; - *pair = C_DIR; - return '/'; + bits[0] = 'd'; + break; case S_IFLNK: - return perms ? 'l' : '@'; + bits[0] = 'l'; + break; case S_IFSOCK: - if (perms) - return 's'; - *pair = C_SOC; - return '='; + bits[0] = 's'; + break; case S_IFIFO: - if (perms) - return 'p'; - *pair = C_PIP; - return '|'; + bits[0] = 'p'; + break; case S_IFBLK: - if (perms) - return 'b'; - *pair = C_BLK; - return '\0'; + bits[0] = 'b'; + break; case S_IFCHR: - if (perms) - return 'c'; - *pair = C_CHR; - return '\0'; + bits[0] = 'c'; + break; default: - if (!perms) - *pair = C_UND; - return '?'; + bits[0] = '?'; + break; } -} - -/* Convert a mode field into "ls -l" type perms field. */ -static char *get_lsperms(mode_t mode) -{ - static const char * const rwx[] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"}; - static char bits[11] = {'\0'}; - - bits[0] = get_ind(mode, TRUE, NULL); xstrsncpy(&bits[1], rwx[(mode >> 6) & 7], 4); xstrsncpy(&bits[4], rwx[(mode >> 3) & 7], 4); @@ -3439,30 +3418,63 @@ static void print_time(const time_t *timep) static void printent(const struct entry *ent, uint namecols, bool sel) { uchar pair = 0; - char ind = get_ind(ent->mode, FALSE, &pair); + char ind = '\0'; int attrs = sel ? A_REVERSE : 0; - if (g_state.ctxcolor) { - if (ind == '@') { - if (ent->flags & DIR_OR_LINK_TO_DIR) - ind = '/'; - attrs |= A_DIM; - } else if (ent->flags & HARD_LINK) - attrs |= A_DIM; - } else { - if (ind == '@') { - if (ent->flags & DIR_OR_LINK_TO_DIR) { - ind = '/'; - attrs |= A_BOLD; - } - pair = (ent->flags & SYM_ORPHAN) ? C_ORP : C_LNK; - } else if (!ent->size && (pair == C_FIL || pair == C_EXE)) + switch (ent->mode & S_IFMT) { + case S_IFREG: + if (ent->mode & 0100) { + pair = C_EXE; + ind = '*'; + } + + if (ent->flags & HARD_LINK) + pair = C_HRD; + + if (!ent->size) pair = C_UND; - else if (pair == C_DIR) + else if (!pair) + pair = C_FIL; + break; + case S_IFDIR: + pair = C_DIR; + attrs |= A_BOLD; + ind = '/'; + break; + case S_IFLNK: + if (ent->flags & DIR_OR_LINK_TO_DIR) { attrs |= A_BOLD; - else if (ent->flags & HARD_LINK) - pair = C_HRD; - else if (ent->flags & FILE_MISSING) + ind = '/'; + } else + ind = '@'; + + if (g_state.ctxcolor) + attrs |= A_DIM; + else + pair = (ent->flags & SYM_ORPHAN) ? C_ORP : C_LNK; + break; + case S_IFSOCK: + pair = C_SOC; + ind = '='; + break; + case S_IFIFO: + pair = C_PIP; + ind = '|'; + break; + case S_IFBLK: + pair = C_BLK; + break; + case S_IFCHR: + pair = C_CHR; + break; + default: + pair = C_UND; + ind = '?'; + break; + } + + if (!g_state.ctxcolor) { + if (ent->flags & FILE_MISSING) pair = C_MIS; if (pair && fcolors[pair]) @@ -3532,6 +3544,7 @@ static void printent_long(const struct entry *ent, uint namecols, bool sel) pair = C_EXE; ind2 = '*'; } + if (ent->flags & HARD_LINK) { pair = C_HRD; ln = TRUE; @@ -3589,17 +3602,19 @@ static void printent_long(const struct entry *ent, uint namecols, bool sel) break; } - if (ent->flags & FILE_MISSING) - pair = C_MIS; - addstr(" "); if (!(ln && g_state.ctxcolor)) { attroff(A_DIM); attrs ^= A_DIM; - if (!g_state.ctxcolor && pair && fcolors[pair]) { - attrs |= COLOR_PAIR(pair); - attron(attrs); + if (!g_state.ctxcolor) { + if (ent->flags & FILE_MISSING) + pair = C_MIS; + + if (pair && fcolors[pair]) { + attrs |= COLOR_PAIR(pair); + attron(attrs); + } } } #ifndef NOLOCALE |