svn commit: r268792 - head/usr.bin/units

Eitan Adler eadler at FreeBSD.org
Thu Jul 17 06:54:13 UTC 2014


Author: eadler
Date: Thu Jul 17 06:54:12 2014
New Revision: 268792
URL: http://svnweb.freebsd.org/changeset/base/268792

Log:
  units(1): Add support for output-format
  	Add support for the output-format argument.  This also exposes subtle
  	rounding differences between GNU units and our units.

Modified:
  head/usr.bin/units/units.1
  head/usr.bin/units/units.c

Modified: head/usr.bin/units/units.1
==============================================================================
--- head/usr.bin/units/units.1	Thu Jul 17 06:36:22 2014	(r268791)
+++ head/usr.bin/units/units.1	Thu Jul 17 06:54:12 2014	(r268792)
@@ -17,6 +17,8 @@ The following options are available:
 Show an overview of options
 .It Fl f Ar filename No , Fl -file Ar filename
 Specify the name of the units data file to load.
+.It Fl e , Fl -exponential
+Behave as if -o '%6e' was typed.
 .It Fl q No , Fl -quiet
 Suppress prompting of the user for units and the display of statistics
 about the number of units loaded.
@@ -33,6 +35,8 @@ from other programs for easy to parse re
 .It Fl v No , Fl -verbose
 Print the units in the conversion output.
 Be more verbose in general.
+.It Fl o Ar format No , Fl -output-format Ar format
+Select the output format string by which numbers are printed.
 .It Fl V No , Fl -version
 Print the version number, usage, and then exit.
 .It Ar from-unit to-unit

Modified: head/usr.bin/units/units.c
==============================================================================
--- head/usr.bin/units/units.c	Thu Jul 17 06:36:22 2014	(r268791)
+++ head/usr.bin/units/units.c	Thu Jul 17 06:54:12 2014	(r268792)
@@ -75,6 +75,7 @@ static int unitcount;
 static int prefixcount;
 static bool verbose = false;
 static bool terse = false;
+static const char * outputformat;
 static const char * havestr;
 static const char * wantstr;
 
@@ -649,6 +650,7 @@ static void 
 showanswer(struct unittype * have, struct unittype * want)
 {
 	double ans;
+	char* oformat;
 
 	if (compareunits(have, want)) {
 		printf("conformability error\n");
@@ -668,11 +670,16 @@ showanswer(struct unittype * have, struc
 	else if (have->offset != want->offset) {
 		if (want->quantity)
 			printf("WARNING: conversion of non-proportional quantities.\n");
-		if (have->quantity)
-			printf("\t%.8g\n",
+		if (have->quantity) {
+			asprintf(&oformat, "\t%s\n", outputformat);
+			printf(oformat,
 			    (have->factor + have->offset-want->offset)/want->factor);
+			free(oformat);
+		}
 		else {
-			printf("\t (-> x*%.8g %+.8g)\n\t (<- y*%.8g %+.8g)\n",
+			asprintf(&oformat, "\t (-> x*%sg %sg)\n\t (<- y*%sg %sg)\n",
+			    outputformat, outputformat, outputformat, outputformat);
+			printf(oformat,
 			    have->factor / want->factor,
 			    (have->offset-want->offset)/want->factor,
 			    want->factor / have->factor,
@@ -681,17 +688,33 @@ showanswer(struct unittype * have, struc
 	}
 	else {
 		ans = have->factor / want->factor;
-		if (verbose)
-			printf("\t%s = %.8g * %s\n", havestr, ans, wantstr);
-		else if (terse) 
-			printf("%.8g\n", ans);
-		else 
-			printf("\t* %.8g\n", ans);
 
-		if (verbose)
-			printf("\t%s = (1 / %.8g) * %s\n", havestr, 1/ans,  wantstr);
-		else if (!terse)
-			printf("\t/ %.8g\n", 1/ans);
+		if (verbose) {
+			printf("\t%s = ", havestr);
+			printf(outputformat, ans);
+			printf(" * %s", wantstr);
+			printf("\n");
+		}
+		else if (terse) {
+			printf(outputformat, ans);
+			printf("\n");
+		}
+		else {
+			printf("\t* ");
+			printf(outputformat, ans);
+			printf("\n");
+		}
+
+		if (verbose) {
+			printf("\t%s = (1 / ", havestr);
+			printf(outputformat, 1/ans);
+			printf(") * %s\n", wantstr);
+		}
+		else if (!terse) {
+			printf("\t/ ");
+			printf(outputformat, 1/ans);
+			printf("\n");
+		}
 	}
 }
 
@@ -706,7 +729,9 @@ usage(void)
 
 static struct option longopts[] = {
 	{"help", no_argument, NULL, 'h'},
+	{"exponential", no_argument, NULL, 'e'},
 	{"file", required_argument, NULL, 'f'},
+	{"output-format", required_argument, NULL, 'o'},
 	{"quiet", no_argument, NULL, 'q'},
 	{"terse", no_argument, NULL, 't'},
 	{"unitsfile", no_argument, NULL, 'U'},
@@ -731,8 +756,12 @@ main(int argc, char **argv)
 
 	quiet = false;
 	readfile = false;
-	while ((optchar = getopt_long(argc, argv, "+hf:qtvUV", longopts, NULL)) != -1) {
+	outputformat = "%.8g";
+	while ((optchar = getopt_long(argc, argv, "+ehf:oqtvUV", longopts, NULL)) != -1) {
 		switch (optchar) {
+		case 'e':
+			outputformat = "%6e";
+			break;
 		case 'f':
 			readfile = true;
 			if (strlen(optarg) == 0)
@@ -746,6 +775,9 @@ main(int argc, char **argv)
 		case 't':
 			terse = true;
 			break;
+		case 'o':
+			outputformat = optarg;
+			break;
 		case 'v':
 			verbose = true;
 			break;


More information about the svn-src-all mailing list