diff --git a/bin/ls/extern.h b/bin/ls/extern.h index 4b27be666580..31e2cedb9340 100644 --- a/bin/ls/extern.h +++ b/bin/ls/extern.h @@ -43,13 +43,13 @@ int revnamecmp __P((const FTSENT *, const FTSENT *)); int statcmp __P((const FTSENT *, const FTSENT *)); int revstatcmp __P((const FTSENT *, const FTSENT *)); -void prcopy __P((char *, char *, int)); void printcol __P((DISPLAY *)); void printlong __P((DISPLAY *)); void printscol __P((DISPLAY *)); void usage __P((void)); -int len_octal __P((char *, int)); -int prn_octal __P((char *)); +int len_octal __P((const char *, int)); +int prn_octal __P((const char *)); +int prn_printable __P((const char *)); #ifdef COLORLS void parsecolors __P((char *cs)); void colorquit __P((int)); diff --git a/bin/ls/ls.c b/bin/ls/ls.c index 69b8d774b042..4b48ef93a90a 100644 --- a/bin/ls/ls.c +++ b/bin/ls/ls.c @@ -566,8 +566,6 @@ display(p, list) continue; } } - if (f_nonprint) - prcopy(cur->fts_name, cur->fts_name, cur->fts_namelen); if (cur->fts_namelen > maxlen) maxlen = cur->fts_namelen; if (f_octal || f_octal_escape) { diff --git a/bin/ls/ls.h b/bin/ls/ls.h index 3da163d95319..3f929e7095cc 100644 --- a/bin/ls/ls.h +++ b/bin/ls/ls.h @@ -48,6 +48,7 @@ extern int f_inode; /* print inode */ extern int f_longform; /* long listing format */ extern int f_octal; /* print unprintables in octal */ extern int f_octal_escape; /* like f_octal but use C escapes if possible */ +extern int f_nonprint; /* show unprintables as ? */ extern int f_sectime; /* print the real time for all files */ extern int f_size; /* list size in short listing */ extern int f_statustime; /* use time of last mode change */ diff --git a/bin/ls/print.c b/bin/ls/print.c index 736754abe292..a407283506e7 100644 --- a/bin/ls/print.c +++ b/bin/ls/print.c @@ -112,6 +112,21 @@ printscol(dp) } } +/* + * print name in current style + */ +static int +printname(name) + const char *name; +{ + if (f_octal || f_octal_escape) + return prn_octal(name); + else if (f_nonprint) + return prn_printable(name); + else + return printf("%s", name); +} + void printlong(dp) DISPLAY *dp; @@ -166,8 +181,7 @@ printlong(dp) if (f_color) color_printed = colortype(sp->st_mode); #endif - if (f_octal || f_octal_escape) (void)prn_octal(p->fts_name); - else (void)printf("%s", p->fts_name); + (void)printname(p->fts_name); #ifdef COLORLS if (f_color && color_printed) endcolor(0); @@ -278,8 +292,7 @@ printaname(p, inodefield, sizefield) if (f_color) color_printed = colortype(sp->st_mode); #endif - chcnt += (f_octal || f_octal_escape) ? prn_octal(p->fts_name) - : printf("%s", p->fts_name); + chcnt += printname(p->fts_name); #ifdef COLORLS if (f_color && color_printed) endcolor(0); @@ -494,9 +507,6 @@ printlink(p) return; } path[lnklen] = '\0'; - if (f_octal || f_octal_escape) { - (void)printf(" -> "); - (void)prn_octal(path); - } - else (void)printf(" -> %s", path); + (void)printf(" -> "); + printname(path); } diff --git a/bin/ls/util.c b/bin/ls/util.c index 7239d9776abf..1f839c59d02b 100644 --- a/bin/ls/util.c +++ b/bin/ls/util.c @@ -56,17 +56,19 @@ static const char rcsid[] = #include "ls.h" #include "extern.h" -void -prcopy(src, dest, len) - char *src, *dest; - int len; +int +prn_printable(s) + const char *s; { - unsigned char ch; + unsigned char c; + int n; - while (len--) { - ch = *src++; - *dest++ = isprint(ch) ? ch : '?'; - } + for (n = 0; (c = *s) != '\0'; ++s, ++n) + if (isprint(c)) + putchar(c); + else + putchar('?'); + return n; } /* @@ -84,7 +86,7 @@ prcopy(src, dest, len) int len_octal(s, len) - char *s; + const char *s; int len; { int r = 0; @@ -96,7 +98,7 @@ len_octal(s, len) int prn_octal(s) - char *s; + const char *s; { unsigned char ch; int len = 0;