sbase

suckless unix tools
git clone git://git.suckless.org/sbase
Log | Files | Refs | README | LICENSE

commit 9fdef90feb79e900278e759866fc1c2b6235791a
parent 787d99d896e06b2383da763df695b9e9496bdff5
Author: Quentin Rameau <quinq@quinq.eu.org>
Date:   Wed, 18 Mar 2015 19:26:42 +0100

ls: add -f and -S options

Diffstat:
MREADME | 2+-
Mls.1 | 16++++++++++++++--
Mls.c | 26+++++++++++++++++++++-----
3 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/README b/README @@ -42,7 +42,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support, =*| ln yes none =*| logger yes none =*| logname yes none -# ls no (-C), -S, -f, (-m), (-s), (-x) +#* ls no (-C), (-m), (-s), (-x) =*| md5sum non-posix none =*| mkdir yes none =*| mkfifo yes none diff --git a/ls.1 b/ls.1 @@ -1,4 +1,4 @@ -.Dd February 21, 2015 +.Dd March 18, 2015 .Dt LS 1 .Os sbase .Sh NAME @@ -6,7 +6,7 @@ .Nd list directory contents .Sh SYNOPSIS .Nm -.Op Fl 1AacdFHhiLlnqrtUu +.Op Fl 1AacdFfHhiLlnqrStUu .Op Ar file ... .Sh DESCRIPTION .Nm @@ -25,6 +25,16 @@ modification time for sorting or printing. List directories themselves, not their contents. .It Fl F Append a file type indicator to all special files. +.It Fl f +Like +.Fl U +but turns on +.Fl a +and disables +.Fl r , +.Fl S +and +.Fl t . .It Fl H List information about the targets of symbolic links specified on the command line instead of the links themselves. @@ -52,6 +62,8 @@ List directory content recursively. The flag is set implicitly. .It Fl r Reverse the sort order. +.It Fl S +Sort files by size (in decreasing order). .It Fl t Sort files by last file status/modification time instead of by name. .It Fl U diff --git a/ls.c b/ls.c @@ -29,6 +29,7 @@ static int aflag = 0; static int cflag = 0; static int dflag = 0; static int Fflag = 0; +static int fflag = 0; static int Hflag = 0; static int hflag = 0; static int iflag = 0; @@ -38,6 +39,7 @@ static int nflag = 0; static int pflag = 0; static int qflag = 0; static int Rflag = 0; +static int Sflag = 0; static int rflag = 0; static int tflag = 0; static int Uflag = 0; @@ -176,12 +178,15 @@ output(const struct entry *ent) static int entcmp(const void *va, const void *vb) { + int cmp = 0; const struct entry *a = va, *b = vb; - if (tflag) - return b->t - a->t; - else - return strcmp(a->name, b->name); + if (Sflag) + cmp = b->size - a->size; + else if (tflag) + cmp = b->t - a->t; + + return cmp ? cmp : strcmp(a->name, b->name); } static void @@ -289,6 +294,11 @@ main(int argc, char *argv[]) case 'd': dflag = 1; break; + case 'f': + aflag = 1; + fflag = 1; + Uflag = 1; + break; case 'F': Fflag = 1; break; @@ -321,9 +331,15 @@ main(int argc, char *argv[]) Rflag = 1; break; case 'r': - rflag = 1; + if (!fflag) + rflag = 1; + break; + case 'S': + Sflag = 1; + tflag = 0; break; case 't': + Sflag = 0; tflag = 1; break; case 'U':