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.
This commit is contained in:
Eitan Adler 2016-04-21 05:24:47 +00:00
parent 0bae19ba15
commit c706c470e4
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=298388
2 changed files with 34 additions and 14 deletions

View File

@ -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

View File

@ -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);
}