From 09b34e9cf9c2b59e2ac3f89ce417b8d5ec9b5e97 Mon Sep 17 00:00:00 2001 From: schwarze Date: Sat, 7 Oct 2023 11:51:08 +0000 Subject: [PATCH] Improve horizontal alignment in long format when printing minor device numbers greater than 999 by measuring the two widths needed for device numbers just like it is already done for other numbers. In the output, this only changes whitespace, but not the text. Ugly formatting reported by Crystal Kolipe . OK millert. Also tested by Crystal Kolipe. --- bin/ls/ls.c | 24 ++++++++++++++++++++---- bin/ls/ls.h | 5 +++-- bin/ls/print.c | 11 ++++------- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/bin/ls/ls.c b/bin/ls/ls.c index 125512ba6e7..056b1176596 100644 --- a/bin/ls/ls.c +++ b/bin/ls/ls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ls.c,v 1.54 2020/10/07 21:03:09 millert Exp $ */ +/* $OpenBSD: ls.c,v 1.55 2023/10/07 11:51:08 schwarze Exp $ */ /* $NetBSD: ls.c,v 1.18 1996/07/09 09:16:29 mycroft Exp $ */ /* @@ -436,6 +436,7 @@ display(FTSENT *p, FTSENT *list) unsigned long long btotal; blkcnt_t maxblock; ino_t maxinode; + unsigned int maxmajor, maxminor; int bcfile, flen, glen, ulen, maxflags, maxgroup, maxuser, maxlen; int entries, needstats; int width; @@ -449,6 +450,7 @@ display(FTSENT *p, FTSENT *list) btotal = maxblock = maxinode = maxlen = maxnlink = 0; bcfile = 0; maxuser = maxgroup = maxflags = 0; + maxmajor = maxminor = 0; maxsize = 0; for (cur = list, entries = 0; cur != NULL; cur = cur->fts_link) { if (cur->fts_info == FTS_ERR || cur->fts_info == FTS_NS) { @@ -523,9 +525,13 @@ display(FTSENT *p, FTSENT *list) (void)strlcpy(np->group, group, glen + 1); if (S_ISCHR(sp->st_mode) || - S_ISBLK(sp->st_mode)) + S_ISBLK(sp->st_mode)) { bcfile = 1; - + if (maxmajor < major(sp->st_rdev)) + maxmajor = major(sp->st_rdev); + if (maxminor < minor(sp->st_rdev)) + maxminor = minor(sp->st_rdev); + } if (f_flags) { np->flags = &np->data[ulen + 1 + glen + 1]; (void)strlcpy(np->flags, flags, flen + 1); @@ -551,7 +557,6 @@ display(FTSENT *p, FTSENT *list) d.entries = entries; d.maxlen = maxlen; if (needstats) { - d.bcfile = bcfile; d.btotal = btotal; (void)snprintf(buf, sizeof(buf), "%llu", (unsigned long long)maxblock); @@ -570,6 +575,17 @@ display(FTSENT *p, FTSENT *list) d.s_size = strlen(buf); } else d.s_size = FMT_SCALED_STRSIZE-2; /* no - or '\0' */ + d.s_major = d.s_minor = 3; + if (bcfile) { + (void)snprintf(buf, sizeof(buf), "%u", maxmajor); + d.s_major = strlen(buf); + (void)snprintf(buf, sizeof(buf), "%u", maxminor); + d.s_minor = strlen(buf); + if (d.s_size <= d.s_major + 2 + d.s_minor) + d.s_size = d.s_major + 2 + d.s_minor; + else + d.s_major = d.s_size - 2 - d.s_minor; + } d.s_user = maxuser; } diff --git a/bin/ls/ls.h b/bin/ls/ls.h index 1feebd9324a..7f654f5881e 100644 --- a/bin/ls/ls.h +++ b/bin/ls/ls.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ls.h,v 1.9 2013/05/30 16:34:32 guenther Exp $ */ +/* $OpenBSD: ls.h,v 1.10 2023/10/07 11:51:08 schwarze Exp $ */ /* $NetBSD: ls.h,v 1.7 1995/03/21 09:06:33 cgd Exp $ */ /* @@ -55,7 +55,6 @@ extern int f_typedir; /* add type character for directories */ typedef struct { FTSENT *list; unsigned long long btotal; - int bcfile; int entries; int maxlen; int s_block; @@ -64,6 +63,8 @@ typedef struct { int s_inode; int s_nlink; int s_size; + int s_major; + int s_minor; int s_user; } DISPLAY; diff --git a/bin/ls/print.c b/bin/ls/print.c index 646b4277b81..ce3b82d109b 100644 --- a/bin/ls/print.c +++ b/bin/ls/print.c @@ -1,4 +1,4 @@ -/* $OpenBSD: print.c,v 1.39 2020/10/07 21:03:09 millert Exp $ */ +/* $OpenBSD: print.c,v 1.40 2023/10/07 11:51:08 schwarze Exp $ */ /* $NetBSD: print.c,v 1.15 1996/12/11 03:25:39 thorpej Exp $ */ /* @@ -110,12 +110,9 @@ printlong(DISPLAY *dp) if (f_flags) (void)printf("%-*s ", dp->s_flags, np->flags); if (S_ISCHR(sp->st_mode) || S_ISBLK(sp->st_mode)) - (void)printf("%3u, %3u ", - major(sp->st_rdev), minor(sp->st_rdev)); - else if (dp->bcfile) - (void)printf("%*s%*lld ", - 8 - dp->s_size, "", dp->s_size, - (long long)sp->st_size); + (void)printf("%*u, %*u ", + dp->s_major, major(sp->st_rdev), + dp->s_minor, minor(sp->st_rdev)); else printsize(dp->s_size, sp->st_size); if (f_accesstime) -- 2.20.1