Patch from J.W.Janssen <JanWillem.Janssen@lxtreme.nl> to provide
color ls support, modifed by me to behave properly when not running output to a terminal (i.e. 'ls | more') -Erik
This commit is contained in:
parent
3ec5c692ec
commit
3ad0bd9563
@ -145,6 +145,14 @@ static const int SPLIT_SUBDIR = 2;
|
|||||||
#ifdef CONFIG_FEATURE_LS_FILETYPES
|
#ifdef CONFIG_FEATURE_LS_FILETYPES
|
||||||
#define APPCHAR(mode) ("\0|\0\0/\0\0\0\0\0@\0=\0\0\0" [TYPEINDEX(mode)])
|
#define APPCHAR(mode) ("\0|\0\0/\0\0\0\0\0@\0=\0\0\0" [TYPEINDEX(mode)])
|
||||||
#endif
|
#endif
|
||||||
|
/* colored LS support by JaWi, janwillem.janssen@lxtreme.nl */
|
||||||
|
#ifdef CONFIG_FEATURE_LS_COLOR
|
||||||
|
static int show_color = 0;
|
||||||
|
#define COLOR(mode) ("\000\043\043\043\042\000\043\043"\
|
||||||
|
"\000\000\044\000\043\000\000\040" [TYPEINDEX(mode)])
|
||||||
|
#define ATTR(mode) ("\00\00\01\00\01\00\01\00"\
|
||||||
|
"\00\00\01\00\01\00\00\01" [TYPEINDEX(mode)])
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* a directory entry and its stat info are stored here
|
* a directory entry and its stat info are stored here
|
||||||
@ -221,6 +229,31 @@ static void newline(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
#ifdef CONFIG_FEATURE_LS_COLOR
|
||||||
|
static char fgcolor(mode_t mode)
|
||||||
|
{
|
||||||
|
/* Check wheter the file is existing (if so, color it red!) */
|
||||||
|
if ( errno == ENOENT ) {
|
||||||
|
errno = 0;
|
||||||
|
return '\037';
|
||||||
|
}
|
||||||
|
if ( LIST_EXEC && S_ISREG( mode )
|
||||||
|
&& ( mode & ( S_IXUSR | S_IXGRP | S_IXOTH ) ) )
|
||||||
|
return COLOR(0xF000); /* File is executable ... */
|
||||||
|
return COLOR(mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
static char bgcolor(mode_t mode)
|
||||||
|
{
|
||||||
|
if ( LIST_EXEC && S_ISREG( mode )
|
||||||
|
&& ( mode & ( S_IXUSR | S_IXGRP | S_IXOTH ) ) )
|
||||||
|
return ATTR(0xF000); /* File is executable ... */
|
||||||
|
return ATTR(mode);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
#ifdef CONFIG_FEATURE_LS_FILETYPES
|
#ifdef CONFIG_FEATURE_LS_FILETYPES
|
||||||
static char append_char(mode_t mode)
|
static char append_char(mode_t mode)
|
||||||
@ -682,18 +715,41 @@ static int list_single(struct dnode *dn)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case LIST_FILENAME:
|
case LIST_FILENAME:
|
||||||
|
#ifdef CONFIG_FEATURE_LS_COLOR
|
||||||
|
if (show_color && !lstat(dn->fullname, &info)) {
|
||||||
|
printf( "\033[%d;%dm", bgcolor(info.st_mode),
|
||||||
|
fgcolor(info.st_mode) );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
printf("%s", dn->name);
|
printf("%s", dn->name);
|
||||||
|
#ifdef CONFIG_FEATURE_LS_COLOR
|
||||||
|
if (show_color) {
|
||||||
|
printf( "\033[0m" );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
column += strlen(dn->name);
|
column += strlen(dn->name);
|
||||||
break;
|
break;
|
||||||
case LIST_SYMLINK:
|
case LIST_SYMLINK:
|
||||||
if (S_ISLNK(dn->dstat.st_mode)) {
|
if (S_ISLNK(dn->dstat.st_mode)) {
|
||||||
char *lpath = xreadlink(dn->fullname);
|
char *lpath = xreadlink(dn->fullname);
|
||||||
if (lpath) {
|
if (lpath) {
|
||||||
printf(" -> %s", lpath);
|
printf(" -> ");
|
||||||
#ifdef CONFIG_FEATURE_LS_FILETYPES
|
#if defined(BB_FEATURE_LS_FILETYPES) || defined(CONFIG_FEATURE_LS_COLOR)
|
||||||
if (!stat(dn->fullname, &info)) {
|
if (!stat(dn->fullname, &info)) {
|
||||||
append = append_char(info.st_mode);
|
append = append_char(info.st_mode);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_FEATURE_LS_COLOR
|
||||||
|
if (show_color) {
|
||||||
|
printf( "\033[%d;%dm", bgcolor(info.st_mode),
|
||||||
|
fgcolor(info.st_mode) );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
printf("%s", lpath);
|
||||||
|
#ifdef CONFIG_FEATURE_LS_COLOR
|
||||||
|
if (show_color) {
|
||||||
|
printf( "\033[0m" );
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
column += strlen(lpath) + 4;
|
column += strlen(lpath) + 4;
|
||||||
free(lpath);
|
free(lpath);
|
||||||
@ -747,6 +803,11 @@ extern int ls_main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
nfiles=0;
|
nfiles=0;
|
||||||
|
|
||||||
|
#ifdef CONFIG_FEATURE_LS_COLOR
|
||||||
|
if (isatty(fileno(stdout)))
|
||||||
|
show_color = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* process options */
|
/* process options */
|
||||||
while ((opt = getopt(argc, argv, "1AaCdgilnsx"
|
while ((opt = getopt(argc, argv, "1AaCdgilnsx"
|
||||||
#ifdef CONFIG_FEATURE_AUTOWIDTH
|
#ifdef CONFIG_FEATURE_AUTOWIDTH
|
||||||
|
Loading…
x
Reference in New Issue
Block a user