From c23b1d3e881a3799527274e5cd43f47ddb6803bd Mon Sep 17 00:00:00 2001 From: Evan Gates 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