+ void *memory;
+
+ if (size == 0) {
+ adios(EX_SOFTWARE, NULL, "Tried to malloc 0 bytes");
+ }
+
+ memory = malloc(size);
+ if (!memory) {
+ adios(EX_OSERR, NULL, "Malloc failed");
+ }
+
+ return memory;
+}
+
+/*
+** Safely call realloc
+*/
+void *
+mh_xrealloc(void *ptr, size_t size)
+{
+ void *memory;
+
+ /* Some non-POSIX realloc()s don't cope with realloc(NULL,sz) */
+ if (!ptr) {
+ return mh_xcalloc((size_t) 1, size);
+ }
+ if (size == 0) {
+ adios(EX_SOFTWARE, NULL, "Tried to realloc 0 bytes");
+ }
+
+ memory = realloc(ptr, size);
+ if (!memory) {
+ adios(EX_OSERR, NULL, "Realloc failed");
+ }
+
+ return memory;
+}
+
+/*
+** Safely call calloc
+*/
+void *
+mh_xcalloc(size_t nmemb, size_t size)
+{
+ void *memory;
+
+ if (nmemb == 0 || size == 0) {
+ adios(EX_SOFTWARE, NULL, "Tried to calloc 0 bytes");
+ }
+
+ if ((memory = calloc(nmemb, size))) {
+ return memory;
+ } else {
+ adios(EX_OSERR, NULL, "calloc failed");
+ }
+}
+
+/*
+** Return the present working directory, if the current directory does not
+** exist, or is too long, make / the pwd.
+*/
+char *
+pwd(void)
+{
+ char *cp;
+ static char curwd[PATH_MAX];
+
+ if (!getcwd(curwd, PATH_MAX)) {
+ admonish(NULL, "unable to determine working directory");
+ if (!mypath || !*mypath ||
+ (strcpy(curwd, mypath), chdir(curwd)) == -1) {
+ strcpy(curwd, "/");
+ chdir(curwd);
+ }
+ return curwd;
+ }
+
+ if ((cp = curwd + strlen(curwd) - 1) > curwd && *cp == '/') {
+ /* strip trailing slash */
+ *cp = '\0';
+ }
+
+ return curwd;
+}
+
+/*
+** add -- If "s1" is NULL, this routine just creates a
+** -- copy of "s2" into newly malloc'ed memory.
+** -- (use getcpy() instead in this case)
+** --
+** -- If "s1" is not NULL, then copy the concatenation
+** -- of "s1" and "s2" (note the order) into newly
+** -- malloc'ed memory. Then free "s1".
+*/
+char *
+add(char *s2, char *s1)
+{
+ char *cp;
+ size_t len1 = 0, len2 = 0;
+
+ if (s1) {
+ len1 = strlen(s1);
+ }
+ if (s2) {
+ len2 = strlen(s2);
+ }