On Wed, Oct 5, 2016 at 2:48 PM, Evan Gates <[email protected]> wrote:
> sbase-ls_-lq.diff: respect -q flag when using -l flag
> sbase-ls_-qR.diff: respect -q flag when printing directory headings with -R 
> flag

Updated versions. Add "ls: " to commit messages and malloc later/free
earlier in lsdir (thanks quinq).
From 6f7c1ebc00a40d65715bb0417b65e6b2c1a03acb Mon Sep 17 00:00:00 2001
From: Evan Gates <[email protected]>
Date: Wed, 5 Oct 2016 10:57:38 -0700
Subject: [PATCH] ls: fix ls -lq to respect -q flag

---
 ls.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ls.c b/ls.c
index b5c4b00..7c80d56 100644
--- a/ls.c
+++ b/ls.c
@@ -207,7 +207,7 @@ output(const struct entry *ent)
                printf("%10s ", humansize(ent->size));
        else
                printf("%10lu ", (unsigned long)ent->size);
-       printf("%s %s%s", buf, ent->name, indicator(ent->mode));
+       printf("%s %s%s", buf, name, indicator(ent->mode));
        if (S_ISLNK(ent->mode)) {
                if ((len = readlink(ent->name, buf, sizeof(buf) - 1)) < 0)
                        eprintf("readlink %s:", ent->name);
-- 
2.10.0

From f6bb38c2f9f773542a241f5d95090eeb28f56e0b Mon Sep 17 00:00:00 2001
From: Evan Gates <[email protected]>
Date: Wed, 5 Oct 2016 14:43:30 -0700
Subject: [PATCH] ls: respect -q when printing directory names with -R

break out the non printable character to ? code into a makeprint()
function so it can be used both in output() and lsdir()
---
 ls.c | 57 +++++++++++++++++++++++++++++++--------------------------
 1 file changed, 31 insertions(+), 26 deletions(-)

diff --git a/ls.c b/ls.c
index b5c4b00..0cc33d1 100644
--- a/ls.c
+++ b/ls.c
@@ -113,6 +113,27 @@ indicator(mode_t mode)
        return "";
 }
 
+static char *
+makeprint(char *name)
+{
+       char *c, *u, *print = emalloc(strlen(name) + 1);
+       Rune r;
+       size_t l;
+
+       for (c = print, u = name; *u; u += l) {
+               l = chartorune(&r, u);
+               if (isprintrune(r)) {
+                       memcpy(c, u, l);
+                       c += l;
+               } else {
+                       *c++ = '?';
+               }
+       }
+       *c = '\0';
+
+       return print;
+}
+
 static void
 output(const struct entry *ent)
 {
@@ -120,28 +141,9 @@ output(const struct entry *ent)
        struct passwd *pw;
        struct tm *tm;
        ssize_t len;
-       size_t l;
-       char *name, *c, *u, *fmt, buf[BUFSIZ],
-            pwname[_SC_LOGIN_NAME_MAX], grname[_SC_LOGIN_NAME_MAX],
-            mode[] = "----------";
-       Rune r;
-
-       if (qflag) {
-               name = emalloc(strlen(ent->name) + 1);
-
-               for (c = name, u = ent->name; *u; u += l) {
-                       l = chartorune(&r, u);
-                       if (isprintrune(r)) {
-                               memcpy(c, u, l);
-                               c += l;
-                       } else {
-                               *c++ = '?';
-                       }
-               }
-               *c = '\0';
-       } else {
-               name = ent->name;
-       }
+       char *fmt, buf[BUFSIZ], pwname[_SC_LOGIN_NAME_MAX],
+            grname[_SC_LOGIN_NAME_MAX], mode[] = "----------",
+            *name = qflag ? makeprint(ent->name) : ent->name;
 
        if (iflag)
                printf("%lu ", (unsigned long)ent->ino);
@@ -250,12 +252,11 @@ lsdir(const char *path, const struct entry *dir)
        struct entry *ent, *ents = NULL;
        struct dirent *d;
        size_t i, n = 0;
-       char prefix[PATH_MAX];
+       char prefix[PATH_MAX], *name;
 
        if (!(dp = opendir(dir->name))) {
                ret = 1;
                weprintf("opendir %s%s:", path, dir->name);
-               return;
        }
        if (chdir(dir->name) < 0)
                eprintf("chdir %s:", dir->name);
@@ -278,8 +279,12 @@ lsdir(const char *path, const struct entry *dir)
        if (!Uflag)
                qsort(ents, n, sizeof(*ents), entcmp);
 
-       if (path[0] || showdirs)
-               printf("%s%s:\n", path, dir->name);
+       if (path[0] || showdirs) {
+               name = qflag ? makeprint(dir->name) : dir->name;
+               printf("%s%s:\n", path, name);
+               if (qflag)
+                       free(name);
+       }
        for (i = 0; i < n; i++)
                output(&ents[i]);
 
-- 
2.10.0

Reply via email to