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>