1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-11-21 07:15:49 +00:00

ls: Make -, apply to -s as well as -l.

While here, remove a bogus comment about a gcc bug.  The bug was in ls,
which used an incorrect format string, and in libc, which accepted it.

MFC after:	1 week
Reviewed by:	brooks
Differential Revision:	https://reviews.freebsd.org/D46067
This commit is contained in:
Dag-Erling Smørgrav 2024-07-24 22:06:39 +02:00
parent 096dfa338d
commit 647d4a8caf
4 changed files with 27 additions and 10 deletions

View File

@ -29,7 +29,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.Dd February 21, 2024
.Dd July 22, 2024
.Dt LS 1
.Os
.Sh NAME
@ -434,6 +434,8 @@ output is not to a terminal.
.It Fl ,
(Comma) When the
.Fl l
or
.Fl s
option is set, print file sizes grouped and separated by thousands using the
non-monetary separator returned by
.Xr localeconv 3 ,

View File

@ -969,7 +969,8 @@ display(const FTSENT *p, FTSENT *list, int options)
d.maxlen = maxlen;
if (needstats) {
d.btotal = btotal;
d.s_block = snprintf(NULL, 0, "%lu", howmany(maxblock, blocksize));
d.s_block = snprintf(NULL, 0, f_thousands ? "%'ld" : "%ld",
howmany(maxblock, blocksize));
d.s_flags = maxflags;
d.s_label = maxlabelstr;
d.s_group = maxgroup;

View File

@ -221,7 +221,7 @@ printlong(const DISPLAY *dp)
(void)printf("%*ju ",
dp->s_inode, (uintmax_t)sp->st_ino);
if (f_size)
(void)printf("%*jd ",
(void)printf(f_thousands ? "%'*jd " : "%*jd ",
dp->s_block, howmany(sp->st_blocks, blocksize));
strmode(sp->st_mode, buf);
aclmode(buf, p);
@ -400,7 +400,7 @@ printaname(const FTSENT *p, u_long inodefield, u_long sizefield)
chcnt += printf("%*ju ",
(int)inodefield, (uintmax_t)sp->st_ino);
if (f_size)
chcnt += printf("%*jd ",
chcnt += printf(f_thousands ? "%'*jd " : "%*jd ",
(int)sizefield, howmany(sp->st_blocks, blocksize));
#ifdef COLORLS
if (f_color)
@ -753,12 +753,10 @@ printsize(size_t width, off_t bytes)
humanize_number(buf, sizeof(buf), (int64_t)bytes, "",
HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL);
(void)printf("%*s ", (u_int)width, buf);
} else if (f_thousands) { /* with commas */
/* This format assignment needed to work round gcc bug. */
const char *format = "%*j'd ";
(void)printf(format, (u_int)width, bytes);
} else
(void)printf("%*jd ", (u_int)width, bytes);
} else {
(void)printf(f_thousands ? "%'*jd " : "%*jd ",
(u_int)width, bytes);
}
}
/*

View File

@ -800,6 +800,21 @@ s_flag_body()
done
}
atf_test_case scomma_flag
scomma_flag_head()
{
atf_set "descr" "Verify that -s, prints out the size with ',' delimiters"
}
scomma_flag_body()
{
export LC_ALL=en_US.UTF-8
atf_check -e ignore dd if=/dev/urandom of=file bs=65536 count=64
blocks=$(stat -f "%b" file)
cblocks=$(printf "%'d" $blocks)
atf_check -e empty -o match:"$cblocks[[:space:]]+file" ls -s, file
}
atf_test_case t_flag
t_flag_head()
{
@ -972,6 +987,7 @@ atf_init_test_cases()
atf_add_test_case q_flag_and_w_flag
atf_add_test_case r_flag
atf_add_test_case s_flag
atf_add_test_case scomma_flag
atf_add_test_case t_flag
atf_add_test_case u_flag
atf_add_test_case v_flag