Initial commit
diff --git a/units.h b/units.h
new file mode 100644
index 0000000..11c3091
--- /dev/null
+++ b/units.h
@@ -0,0 +1,170 @@
+/*
+ * units, a program for units conversion
+ * Copyright (C) 1996, 1997, 1999, 2000, 2001, 2014, 2017
+ * Free Software Foundation, Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * This program was written by Adrian Mariano (adrianm@gnu.org)
+ */
+
+#include <math.h>
+#include <errno.h>
+
+/* Apparently popen and pclose require leading _ under windows */
+#if defined(_MSC_VER) || defined(__MINGW32__)
+# define popen _popen
+# define pclose _pclose
+#endif
+
+
+#ifdef NO_ISFINITE
+# if defined _WIN32 && defined _MSC_VER
+# define isfinite(x) (!_isnan(x) && _finite(x))
+# else
+# define isfinite(x) ( -DBL_MAX <= (x) && (x) <= DBL_MAX )
+# endif
+#endif
+
+#ifdef STRINGS_H
+# include <strings.h>
+#else
+# include <string.h>
+#endif
+
+#ifndef NO_STDLIB_H
+# include <stdlib.h>
+#else
+ char *malloc(), *realloc(), *getenv();
+#endif
+
+#ifndef strchr
+# ifdef NO_STRCHR
+# define strchr(a,b) index((a),(b))
+# else
+ char *strchr();
+# endif
+#endif /* !strchr */
+
+#define E_NORMAL 0
+#define E_PARSE 1
+#define E_PRODOVERFLOW 2
+#define E_REDUCE 3
+#define E_CIRCULARDEF 4
+#define E_BADSUM 5
+#define E_NOTANUMBER 6
+#define E_NOTROOT 7
+#define E_UNKNOWNUNIT 8
+#define E_FUNC 9 /* If errno is set after calling a function */
+#define E_BADFUNCTYPE 10
+#define E_BADFUNCARG 11
+#define E_NOTINDOMAIN 12
+#define E_BADFUNCDIMEN 13
+#define E_NOINVERSE 14
+#define E_PARSEMEM 15
+#define E_FUNARGDEF 16
+#define E_FILE 17
+#define E_BADFILE 18
+#define E_MEMORY 19
+#define E_BADNUM 20
+#define E_UNITEND 21
+#define E_LASTUNSET 22
+#define E_IRRATIONAL_EXPONENT 23
+#define E_BASE_NOTROOT 24
+#define E_DIMEXPONENT 25
+#define E_NOTAFUNC 26
+#define E_OVERFLOW 27
+#define E_UNDERFLOW 28
+
+extern char *errormsg[];
+
+/*
+ Data type used to store a single unit being operated on.
+
+ The numerator and denominator arrays contain lists of units
+ (strings) which are terminated by a null pointer. The special
+ string NULLUNIT is used to mark blank units that occur in the
+ middle of the list.
+*/
+
+extern char *NULLUNIT;
+
+#define MAXSUBUNITS 100 /* Size of internal unit reduction buffer */
+
+struct unittype {
+ char *numerator[MAXSUBUNITS];
+ char *denominator[MAXSUBUNITS];
+ double factor;
+};
+
+
+struct functype {
+ char *param;
+ char *def;
+ char *dimen;
+ double *domain_min, *domain_max;
+ int domain_min_open, domain_max_open;
+};
+
+struct pair {
+ double location, value;
+};
+
+struct func {
+ char *name;
+ struct functype forward;
+ struct functype inverse;
+ struct pair *table;
+ int tablelen;
+ char *tableunit;
+ struct func *next;
+ int skip_error_check; /* do not check for errors when running units -c */
+ int linenumber;
+ char *file; /* file where defined */
+};
+
+struct parseflag {
+ int oldstar; /* Does '*' have higher precedence than '/' */
+ int minusminus; /* Does '-' character give subtraction */
+};
+extern struct parseflag parserflags;
+
+extern struct unittype *parameter_value;
+extern char *function_parameter;
+
+extern int lastunitset;
+extern struct unittype lastunit;
+
+void *mymalloc(int bytes, const char *mesg);
+int hassubscript(const char *str);
+void initializeunit(struct unittype *theunit);
+void freeunit(struct unittype *theunit);
+void unitcopy(struct unittype *dest,struct unittype *src);
+int divunit(struct unittype *left, struct unittype *right);
+void invertunit(struct unittype *theunit);
+int multunit(struct unittype *left, struct unittype *right);
+int expunit(struct unittype *theunit, int power);
+int addunit(struct unittype *unita, struct unittype *unitb);
+int rootunit(struct unittype *inunit,int n);
+int unitpower(struct unittype *base, struct unittype *exponent);
+char *dupstr(const char *str);
+char *dupnstr(const char *string, int length);
+int unit2num(struct unittype *input);
+struct func *fnlookup(const char *str);
+int evalfunc(struct unittype *theunit, struct func *infunc, int inverse,
+ int allerror);
+int parseunit(struct unittype *output, const char *input, char **errstr,
+ int *errloc);
+