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);
+