Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 Nov 2012 03:39:21 +0000 (UTC)
From:      Greg Lehey <grog@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r243049 - head/bin/df
Message-ID:  <201211150339.qAF3dLel008022@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: grog
Date: Thu Nov 15 03:39:21 2012
New Revision: 243049
URL: http://svnweb.freebsd.org/changeset/base/243049

Log:
  Add , (comma) option to print sizes grouped and separated by thousands
  using the non-monetary separator returned by localeconv(3), typically
  a comma or period.
  
  MFC after:  14 days

Modified:
  head/bin/df/df.1
  head/bin/df/df.c

Modified: head/bin/df/df.1
==============================================================================
--- head/bin/df/df.1	Thu Nov 15 03:22:50 2012	(r243048)
+++ head/bin/df/df.1	Thu Nov 15 03:39:21 2012	(r243049)
@@ -66,16 +66,14 @@ flag.
 This is implied for file systems specified on the command line.
 .It Fl b
 Use 512-byte blocks rather than the default.
-Note that
-this overrides the
+This overrides the
 .Ev BLOCKSIZE
 specification from the environment.
 .It Fl c
 Display a grand total.
 .It Fl g
 Use 1073741824-byte (1-Gbyte) blocks rather than the default.
-Note that
-this overrides the
+This overrides the
 .Ev BLOCKSIZE
 specification from the environment.
 .It Fl H
@@ -97,16 +95,16 @@ are always printed in base 10.
 Include statistics on the number of free inodes.
 .It Fl k
 Use 1024-byte (1-Kbyte) blocks rather than the default.
-Note that
-this overrides the
+This overrides the
 .Ev BLOCKSIZE
-specification from the environment.
+specification from the environment and the
+.Fl P
+option.
 .It Fl l
 Only display information about locally-mounted file systems.
 .It Fl m
 Use 1048576-byte (1-Mbyte) blocks rather than the default.
-Note that
-this overrides the
+This overrides the
 .Ev BLOCKSIZE
 specification from the environment.
 .It Fl n
@@ -120,9 +118,12 @@ will not request new statistics from the
 with the possibly stale statistics that were previously obtained.
 .It Fl P
 Use POSIX compliant output of 512-byte blocks rather than the default.
-Note that this overrides the
+This overrides the
 .Ev BLOCKSIZE
 specification from the environment.
+The
+.Fl k
+option overrides this option.
 .It Fl t
 Only print out statistics for file systems of the specified types.
 More than one type may be specified in a comma separated list.
@@ -148,6 +149,13 @@ command can be used to find out the type
 that are available on the system.
 .It Fl T
 Include file system type.
+.It Fl ,
+(Comma) Print sizes grouped and separated by thousands using the
+non-monetary separator returned by
+.Xr localeconv 3 ,
+typically a comma or period.
+If no locale is set, or the locale does not have a non-monetary separator, this
+option has no effect.
 .El
 .Sh ENVIRONMENT
 .Bl -tag -width BLOCKSIZE
@@ -165,9 +173,21 @@ is set, the block counts will be display
 .Xr getfsstat 2 ,
 .Xr statfs 2 ,
 .Xr getmntinfo 3 ,
+.Xr localeconv 3 ,
 .Xr fstab 5 ,
 .Xr mount 8 ,
 .Xr quot 8
+.Sh STANDARDS
+With the exception of most options,
+the
+.Nm
+utility conforms to
+.St -p1003.1-2004 ,
+which defines only the
+.Fl k , P
+and
+.Fl t
+options.
 .Sh HISTORY
 A
 .Nm

Modified: head/bin/df/df.c
==============================================================================
--- head/bin/df/df.c	Thu Nov 15 03:22:50 2012	(r243048)
+++ head/bin/df/df.c	Thu Nov 15 03:39:21 2012	(r243049)
@@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
 #include <ufs/ufs/ufsmount.h>
 #include <err.h>
 #include <libutil.h>
+#include <locale.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -95,6 +96,7 @@ imax(int a, int b)
 }
 
 static int	aflag = 0, cflag, hflag, iflag, kflag, lflag = 0, nflag, Tflag;
+static int	thousands;
 static struct	ufs_args mdev;
 
 int
@@ -111,12 +113,12 @@ main(int argc, char *argv[])
 	int ch, rv;
 
 	fstype = "ufs";
-
+	(void)setlocale(LC_ALL, "");
 	memset(&totalbuf, 0, sizeof(totalbuf));
 	totalbuf.f_bsize = DEV_BSIZE;
 	strlcpy(totalbuf.f_mntfromname, "total", MNAMELEN);
 	vfslist = NULL;
-	while ((ch = getopt(argc, argv, "abcgHhiklmnPt:T")) != -1)
+	while ((ch = getopt(argc, argv, "abcgHhiklmnPt:T,")) != -1)
 		switch (ch) {
 		case 'a':
 			aflag = 1;
@@ -180,6 +182,9 @@ main(int argc, char *argv[])
 		case 'T':
 			Tflag = 1;
 			break;
+		case ',':
+			thousands = 1;
+			break;
 		case '?':
 		default:
 			usage();
@@ -410,10 +415,18 @@ prtstat(struct statfs *sfsp, struct maxw
 	static int headerlen, timesthrough = 0;
 	static const char *header;
 	int64_t used, availblks, inodes;
+	const char *format;
 
 	if (++timesthrough == 1) {
 		mwp->mntfrom = imax(mwp->mntfrom, (int)strlen("Filesystem"));
 		mwp->fstype = imax(mwp->fstype, (int)strlen("Type"));
+		if (thousands) {		/* make space for commas */
+		    mwp->total += (mwp->total - 1) / 3;
+		    mwp->used  += (mwp->used - 1) / 3;
+		    mwp->avail += (mwp->avail - 1) / 3;
+		    mwp->iused += (mwp->iused - 1) / 3;
+		    mwp->ifree += (mwp->ifree - 1) / 3;
+		}
 		if (hflag) {
 			header = "   Size";
 			mwp->total = mwp->used = mwp->avail =
@@ -428,7 +441,7 @@ prtstat(struct statfs *sfsp, struct maxw
 		(void)printf("%-*s", mwp->mntfrom, "Filesystem");
 		if (Tflag)
 			(void)printf("  %-*s", mwp->fstype, "Type");
-		(void)printf(" %-*s %*s %*s Capacity", mwp->total, header,
+		(void)printf(" %*s %*s %*s Capacity", mwp->total, header,
 		    mwp->used, "Used", mwp->avail, "Avail");
 		if (iflag) {
 			mwp->iused = imax(hflag ? 0 : mwp->iused,
@@ -448,7 +461,11 @@ prtstat(struct statfs *sfsp, struct maxw
 	if (hflag) {
 		prthuman(sfsp, used);
 	} else {
-		(void)printf(" %*jd %*jd %*jd",
+		if (thousands)
+		    format = " %*j'd %*j'd %*j'd";
+		else
+		    format = " %*jd %*jd %*jd";
+		(void)printf(format,
 		    mwp->total, fsbtoblk(sfsp->f_blocks,
 		    sfsp->f_bsize, blocksize),
 		    mwp->used, fsbtoblk(used, sfsp->f_bsize, blocksize),
@@ -465,7 +482,11 @@ prtstat(struct statfs *sfsp, struct maxw
 			prthumanvalinode(used);
 			prthumanvalinode(sfsp->f_ffree);
 		} else {
-			(void)printf(" %*jd %*jd", mwp->iused, (intmax_t)used,
+			if (thousands)
+			    format = " %*j'd %*j'd";
+			else
+			    format = " %*jd %*jd";
+			(void)printf(format, mwp->iused, (intmax_t)used,
 			    mwp->ifree, (intmax_t)sfsp->f_ffree);
 		}
 		(void)printf(" %4.0f%% ", inodes == 0 ? 100.0 :
@@ -542,7 +563,7 @@ usage(void)
 {
 
 	(void)fprintf(stderr,
-"usage: df [-b | -g | -H | -h | -k | -m | -P] [-acilnT] [-t type] [file | filesystem ...]\n");
+"usage: df [-b | -g | -H | -h | -k | -m | -P] [-acilnT] [-t type] [-,] [file | filesystem ...]\n");
 	exit(EX_USAGE);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201211150339.qAF3dLel008022>