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
From da7bfffbe6d9f02421899b42b410301ad5718c54 Mon Sep 17 00:00:00 2001
From: Evan Gates <[email protected]>
Date: Wed, 5 Oct 2016 10:57:38 -0700
Subject: [PATCH] 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 c23b1d3e881a3799527274e5cd43f47ddb6803bd Mon Sep 17 00:00:00 2001
From: Evan Gates <[email protected]>
Date: Wed, 5 Oct 2016 14:43:30 -0700
Subject: [PATCH] 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 | 56 +++++++++++++++++++++++++++++++-------------------------
 1 file changed, 31 insertions(+), 25 deletions(-)

diff --git a/ls.c b/ls.c
index b5c4b00..139014e 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,12 @@ 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 = qflag ? makeprint(dir->name) : dir->name;
 
        if (!(dp = opendir(dir->name))) {
                ret = 1;
                weprintf("opendir %s%s:", path, dir->name);
-               return;
+               goto cleanup;
        }
        if (chdir(dir->name) < 0)
                eprintf("chdir %s:", dir->name);
@@ -279,7 +281,7 @@ lsdir(const char *path, const struct entry *dir)
                qsort(ents, n, sizeof(*ents), entcmp);
 
        if (path[0] || showdirs)
-               printf("%s%s:\n", path, dir->name);
+               printf("%s%s:\n", path, name);
        for (i = 0; i < n; i++)
                output(&ents[i]);
 
@@ -303,6 +305,10 @@ lsdir(const char *path, const struct entry *dir)
        for (i = 0; i < n; ++i)
                free(ents[i].name);
        free(ents);
+
+cleanup:
+       if (qflag)
+               free(name);
 }
 
 static int
-- 
2.10.0

Reply via email to