sbase

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

commit 6b719faade262dcac1d9c1e67d3412148d084207
parent ef23f966c538007948e26ea39956fdafd94c9b16
Author: FRIGN <dev@frign.de>
Date:   Tue, 17 Feb 2015 18:59:01 +0100

Add q-flag to ls(1)

of course, UTF-8-aware. ;)

Diffstat:
MREADME | 2+-
Mls.1 | 6++++--
Mls.c | 32++++++++++++++++++++++++++++++--
3 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/README b/README @@ -40,7 +40,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support, =* ln yes none =* logger yes none =* logname yes none -= ls no -C, -R, -q, -u += ls no -C, -R, -u =* md5sum non-posix none =* mkdir yes none =* mkfifo yes none diff --git a/ls.1 b/ls.1 @@ -1,4 +1,4 @@ -.Dd January 20, 2015 +.Dd February 17, 2015 .Dt LS 1 .Os sbase .Sh NAME @@ -6,7 +6,7 @@ .Nd list directory contents .Sh SYNOPSIS .Nm -.Op Fl 1acdFHhiLlrtU +.Op Fl 1acdFHhiLlqrtU .Op Ar file ... .Sh DESCRIPTION .Nm @@ -36,6 +36,8 @@ themselves. .It Fl l List detailed information about each file, including their type, permissions, links, owner, group, size, and last file status/modification time. +.It Fl q +Replace non-printable characters in filenames with '?'. .It Fl r Reverse the sort order. .It Fl t diff --git a/ls.c b/ls.c @@ -10,6 +10,7 @@ #include <time.h> #include <unistd.h> +#include "utf.h" #include "util.h" struct entry { @@ -32,6 +33,7 @@ static int hflag = 0; static int iflag = 0; static int Lflag = 0; static int lflag = 0; +static int qflag = 0; static int rflag = 0; static int tflag = 0; static int Uflag = 0; @@ -174,9 +176,10 @@ static void lsdir(const char *path) { DIR *dp; + Rune r; struct entry ent, *ents = NULL; struct dirent *d; - size_t i, n = 0; + size_t i, j, k, n = 0, len; char *cwd, *p; cwd = agetcwd(); @@ -201,6 +204,28 @@ lsdir(const char *path) } else { ents = erealloc(ents, ++n * sizeof(*ents)); p = estrdup(d->d_name); + if (qflag) { + len = strlen(p); + for (i = 1, j = 0; j + i <= len;) { + if (!fullrune(p + j, i)) { + i++; + continue; + } + charntorune(&r, p + j, i); + if (isprintrune(r)) { + j += i; + i = 1; + continue; + } + p[j] = '?'; + for (k = j + 1; k < len - i + 2; k++) { + p[k] = p[k + i - 1]; + } + len -= i - 1; + j += 1; + i = 1; + } + } mkent(&ents[n - 1], p, tflag || Fflag || lflag || iflag, Lflag); } } @@ -231,7 +256,7 @@ ls(const struct entry *ent) static void usage(void) { - eprintf("usage: %s [-1acdFHhiLlrtU] [file ...]\n", argv0); + eprintf("usage: %s [-1acdFHhiLlqrtU] [file ...]\n", argv0); } int @@ -271,6 +296,9 @@ main(int argc, char *argv[]) case 'l': lflag = 1; break; + case 'q': + qflag = 1; + break; case 'r': rflag = 1; break;