This is at least supported by FreeBSD's units(1) as well as by
systemd/Linux.

With a personal library like this:
$ cat ~/units.lib
assload         8 stone
butt            2 hogshead
buttload        6 seams
solarmass       1.98847e30 kg

I can convert my mass into more convenient units:

$ units -f '' -f ~/units.lib
622 units, 67 prefixes
You have: 93 kg
You want: assloads
        * 1.8306241
        / 0.54626178
You have: 93 kg
You want: solarmasses
        * 4.6769627e-29
        / 2.1381398e+28

Note that the imperial buttload is a unit of volume while the assload is a unit
of mass:
You have: buttload
You want: assload
conformability error
        1.6914754 m^3
        50.802345 kg

On the other hand, you need about 4^28 standard donkeys to lug the sun
around:
You have: solarmass
You want: assload
        * 3.9141303e+28
        / 2.554846e-29

OK?

diff --git units.1 units.1
index d7a45f729b3..916d1b03d32 100644
--- units.1
+++ units.1
@@ -79,6 +79,11 @@ The options are as follows:
 .Bl -tag -width Ds
 .It Fl f Ar filename
 Specifies the name of the units data file to load.
+This options may be specified multiple times.
+The standard units library is read if
+.Ar filename
+is the empty string.
+This allows extending the standard units library with a personal library.
 .It Fl q
 Suppresses prompting of the user for units and the display of statistics
 about the number of units loaded.
diff --git units.c units.c
index 98af5031fb1..488795c78cb 100644
--- units.c
+++ units.c
@@ -100,7 +100,6 @@ readunits(char *userfile)
        int len, linenum, i;
        FILE *unitfile;
 
-       unitcount = 0;
        linenum = 0;
 
        if (userfile) {
@@ -626,8 +625,7 @@ main(int argc, char **argv)
        struct unittype have, want;
        char havestr[81], wantstr[81];
        int optchar;
-       char *userfile = 0;
-       int quiet = 0;
+       int quiet = 0, units_read = 0;
 
        extern char *optarg;
        extern int optind;
@@ -638,7 +636,8 @@ main(int argc, char **argv)
        while ((optchar = getopt(argc, argv, "vqf:")) != -1) {
                switch (optchar) {
                case 'f':
-                       userfile = optarg;
+                       units_read = 1;
+                       readunits(*optarg == '\0' ? NULL : optarg);
                        break;
                case 'q':
                        quiet = 1;
@@ -662,7 +661,8 @@ main(int argc, char **argv)
        if (argc != 3 && argc != 2 && argc != 0)
                usage();
 
-       readunits(userfile);
+       if (!units_read)
+               readunits(NULL);
 
        if (pledge("stdio", NULL) == -1)
                err(1, "pledge");


-- 
I'm not entirely sure you are real.

Reply via email to