Author: eadler
Date: Thu Apr 21 05:24:47 2016
New Revision: 298388
URL: https://svnweb.freebsd.org/changeset/base/298388

Log:
  Bring a little more compability with GNU units 2.12
  - notionally support a 'history file' flag. This doesn't do much now,
    but is there to prevent scripts written against GNU units from
    breaking
  - correctly gracefully quit rather than exit (this will make it easier
    to support a history file in the future)
  - remove the "t" flag from fopen which was there to support windows. We
    have not supported windows since at the latest, the introduction of
    capsicum.

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 Apr 21 04:33:07 2016        (r298387)
+++ head/usr.bin/units/units.1  Thu Apr 21 05:24:47 2016        (r298388)
@@ -8,6 +8,7 @@
 .Sh SYNOPSIS
 .Nm
 .Op Fl f Ar filename
+.Op Fl H Ar filename
 .Op Fl qvUV
 .Op Ar from-unit to-unit
 .Sh OPTIONS
@@ -17,6 +18,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 H Ar filename No , Fl -historyfile Ar filename
+Ignored, for compatibility with GNU units.
 .It Fl e , Fl -exponential
 Behave as if -o '%6e' was typed.
 .It Fl q No , Fl -quiet

Modified: head/usr.bin/units/units.c
==============================================================================
--- head/usr.bin/units/units.c  Thu Apr 21 04:33:07 2016        (r298387)
+++ head/usr.bin/units/units.c  Thu Apr 21 05:24:47 2016        (r298388)
@@ -33,10 +33,8 @@ static const char rcsid[] =
 
 #include <sys/capsicum.h>
 
-#define        _PATH_UNITSLIB  "/usr/share/misc/definitions.units"
-
 #ifndef UNITSFILE
-#define UNITSFILE _PATH_UNITSLIB
+#define UNITSFILE "/usr/share/misc/definitions.units"
 #endif
 
 #define MAXUNITS 1000
@@ -47,6 +45,7 @@ static const char rcsid[] =
 #define PRIMITIVECHAR '!'
 
 static const char *powerstring = "^";
+static const char *numfmt = "%.8g";
 
 static struct {
        char *uname;
@@ -128,12 +127,12 @@ readunits(const char *userfile)
        linenum = 0;
 
        if (userfile) {
-               unitfile = fopen(userfile, "rt");
+               unitfile = fopen(userfile, "r");
                if (!unitfile)
                        errx(1, "unable to open units file '%s'", userfile);
        }
        else {
-               unitfile = fopen(UNITSFILE, "rt");
+               unitfile = fopen(UNITSFILE, "r");
                if (!unitfile) {
                        char *direc, *env;
                        char filename[1000];
@@ -255,7 +254,7 @@ showunit(struct unittype * theunit)
        int printedslash;
        int counter = 1;
 
-       printf("%.8g", theunit->factor);
+       printf(numfmt, theunit->factor);
        if (theunit->offset)
                printf("&%.8g", theunit->offset);
        for (ptr = theunit->numerator; *ptr; ptr++) {
@@ -723,7 +722,7 @@ static void 
 usage(void)
 {
        fprintf(stderr,
-               "usage: units [-f unitsfile] [-UVq] [from-unit to-unit]\n");
+               "usage: units [-f unitsfile] [-H historyfile] [-UVq] [from-unit 
to-unit]\n");
        exit(3);
 }
 
@@ -731,6 +730,7 @@ static struct option longopts[] = {
        {"help", no_argument, NULL, 'h'},
        {"exponential", no_argument, NULL, 'e'},
        {"file", required_argument, NULL, 'f'},
+       {"history", required_argument, NULL, 'H'},
        {"output-format", required_argument, NULL, 'o'},
        {"quiet", no_argument, NULL, 'q'},
        {"terse", no_argument, NULL, 't'},
@@ -749,15 +749,19 @@ main(int argc, char **argv)
        int optchar;
        bool quiet;
        bool readfile;
+       bool quit;
        History *inhistory;
        EditLine *el;
        HistEvent ev;
        int inputsz;
+       char const * history_file;
 
        quiet = false;
        readfile = false;
-       outputformat = "%.8g";
-       while ((optchar = getopt_long(argc, argv, "+ehf:oqtvUV", longopts, 
NULL)) != -1) {
+       history_file = NULL;
+       outputformat = numfmt;
+       quit = false;
+       while ((optchar = getopt_long(argc, argv, "+ehf:oqtvHUV", longopts, 
NULL)) != -1) {
                switch (optchar) {
                case 'e':
                        outputformat = "%6e";
@@ -769,6 +773,9 @@ main(int argc, char **argv)
                        else
                                readunits(optarg);
                        break;
+               case 'H':
+                       history_file = optarg;
+                       break;
                case 'q':
                        quiet = true;
                        break;
@@ -833,31 +840,41 @@ main(int argc, char **argv)
                if (!quiet)
                        printf("%d units, %d prefixes\n", unitcount,
                            prefixcount);
-               for (;;) {
+               while (!quit) {
                        do {
                                initializeunit(&have);
                                if (!quiet)
                                        promptstr = "You have: ";
                                havestr = el_gets(el, &inputsz);
-                               if (havestr == NULL)
-                                       exit(0);
+                               if (havestr == NULL) {
+                                       quit = true;
+                                       break;
+                               }
                                if (inputsz > 0)
                                        history(inhistory, &ev, H_ENTER,
                                        havestr);
                        } while (addunit(&have, havestr, 0, 1) ||
                            completereduce(&have));
+                       if (quit) {
+                               break;
+                       }
                        do {
                                initializeunit(&want);
                                if (!quiet)
                                        promptstr = "You want: ";
                                wantstr = el_gets(el, &inputsz);
-                               if (wantstr == NULL)
-                                       exit(0);
+                               if (wantstr == NULL) {
+                                       quit = true;
+                                       break;
+                               }
                                if (inputsz > 0)
                                        history(inhistory, &ev, H_ENTER,
                                        wantstr);
                        } while (addunit(&want, wantstr, 0, 1) ||
                            completereduce(&want));
+                       if (quit) {
+                               break;
+                       }
                        showanswer(&have, &want);
                }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to