Add q-flag to ls(1)

of course, UTF-8-aware. ;)
This commit is contained in:
FRIGN 2015-02-17 18:59:01 +01:00
parent ef23f966c5
commit 6b719faade
3 changed files with 35 additions and 5 deletions

2
README
View File

@ -40,7 +40,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support,
=* ln yes none =* ln yes none
=* logger yes none =* logger yes none
=* logname yes none =* logname yes none
= ls no -C, -R, -q, -u = ls no -C, -R, -u
=* md5sum non-posix none =* md5sum non-posix none
=* mkdir yes none =* mkdir yes none
=* mkfifo yes none =* mkfifo yes none

6
ls.1
View File

@ -1,4 +1,4 @@
.Dd January 20, 2015 .Dd February 17, 2015
.Dt LS 1 .Dt LS 1
.Os sbase .Os sbase
.Sh NAME .Sh NAME
@ -6,7 +6,7 @@
.Nd list directory contents .Nd list directory contents
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Op Fl 1acdFHhiLlrtU .Op Fl 1acdFHhiLlqrtU
.Op Ar file ... .Op Ar file ...
.Sh DESCRIPTION .Sh DESCRIPTION
.Nm .Nm
@ -36,6 +36,8 @@ themselves.
.It Fl l .It Fl l
List detailed information about each file, including their type, permissions, List detailed information about each file, including their type, permissions,
links, owner, group, size, and last file status/modification time. links, owner, group, size, and last file status/modification time.
.It Fl q
Replace non-printable characters in filenames with '?'.
.It Fl r .It Fl r
Reverse the sort order. Reverse the sort order.
.It Fl t .It Fl t

32
ls.c
View File

@ -10,6 +10,7 @@
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#include "utf.h"
#include "util.h" #include "util.h"
struct entry { struct entry {
@ -32,6 +33,7 @@ static int hflag = 0;
static int iflag = 0; static int iflag = 0;
static int Lflag = 0; static int Lflag = 0;
static int lflag = 0; static int lflag = 0;
static int qflag = 0;
static int rflag = 0; static int rflag = 0;
static int tflag = 0; static int tflag = 0;
static int Uflag = 0; static int Uflag = 0;
@ -174,9 +176,10 @@ static void
lsdir(const char *path) lsdir(const char *path)
{ {
DIR *dp; DIR *dp;
Rune r;
struct entry ent, *ents = NULL; struct entry ent, *ents = NULL;
struct dirent *d; struct dirent *d;
size_t i, n = 0; size_t i, j, k, n = 0, len;
char *cwd, *p; char *cwd, *p;
cwd = agetcwd(); cwd = agetcwd();
@ -201,6 +204,28 @@ lsdir(const char *path)
} else { } else {
ents = erealloc(ents, ++n * sizeof(*ents)); ents = erealloc(ents, ++n * sizeof(*ents));
p = estrdup(d->d_name); 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); mkent(&ents[n - 1], p, tflag || Fflag || lflag || iflag, Lflag);
} }
} }
@ -231,7 +256,7 @@ ls(const struct entry *ent)
static void static void
usage(void) usage(void)
{ {
eprintf("usage: %s [-1acdFHhiLlrtU] [file ...]\n", argv0); eprintf("usage: %s [-1acdFHhiLlqrtU] [file ...]\n", argv0);
} }
int int
@ -271,6 +296,9 @@ main(int argc, char *argv[])
case 'l': case 'l':
lflag = 1; lflag = 1;
break; break;
case 'q':
qflag = 1;
break;
case 'r': case 'r':
rflag = 1; rflag = 1;
break; break;