]> diplodocus.org Git - nmh/blobdiff - sbr/utils.c
mhshow.man: more detail on use of -part and -type switches
[nmh] / sbr / utils.c
index 7f0760a0aefa46430c0f96352454b36392e22b45..c6f75e07379e3c47878359c7eb88c6a4485a945f 100644 (file)
 #include <h/utils.h>
 #include <fcntl.h>
 
+/* sbr/signals.c */
+extern int setup_signal_handlers();
+
+/* sbr/m_mktemp.c */
+extern void remove_registered_files_atexit();
+
+
 /*
  * We allocate space for messages (msgs array)
  * this number of elements at a time.
@@ -57,6 +64,24 @@ mh_xrealloc(void *ptr, size_t size)
     return memory;
 }
 
+/*
+ * Safely call calloc
+ */
+void *
+mh_xcalloc(size_t nmemb, size_t size)
+{
+    void *memory;
+
+    if (nmemb == 0  ||  size == 0)
+        adios(NULL, "Tried to calloc 0 bytes");
+
+    if ((memory = calloc(nmemb, size))) {
+        return memory;
+    } else {
+        adios(NULL, "calloc failed");
+    }
+}
+
 /*
  * Return the present working directory, if the current directory does not
  * exist, or is too long, make / the pwd.
@@ -72,7 +97,9 @@ pwd(void)
         if (!mypath || !*mypath
                 || (strcpy (curwd, mypath), chdir (curwd)) == -1) {
             strcpy (curwd, "/");
-            chdir (curwd);
+            if (chdir (curwd) < 0) {
+                advise (curwd, "chdir");
+            }
         }
         return curwd;
     }
@@ -317,3 +344,68 @@ nmh_strcasestr (const char *s1, const char *s2) {
 
     return NULL;
 }
+
+
+int
+nmh_init(const char *argv0, int read_context) {
+    if (! setlocale(LC_ALL, "")) {
+        admonish(NULL, "setlocale failed, check your LC_ALL, LC_CTYPE, and "
+                 "LANG environment variables");
+    }
+
+    invo_name = r1bindex ((char *) argv0, '/');
+
+    if (setup_signal_handlers()) {
+        admonish("sigaction", "unable to set up signal handlers");
+    }
+
+    /* POSIX atexit() does not define any error conditions. */
+    if (atexit(remove_registered_files_atexit)) {
+        admonish("atexit", "unable to register atexit function");
+    }
+
+    if (read_context) {
+        context_read();
+        return OK;
+    } else {
+        int status = context_foil(NULL);
+        if (status != OK) {
+            advise("", "failed to create minimal profile/conext");
+        }
+        return status;
+    }
+}
+
+
+/* Returns copy of argument str with all characters converted to upper
+   case, and trimmed whitespace (see cpytrim()) . */
+char *
+upcase (const char *str) {
+    char *up = cpytrim (str);
+    char *cp;
+
+    for (cp = up; *cp; ++cp) { *cp = toupper ((unsigned char) *cp); }
+
+    return up;
+}
+
+
+/*
+ * Scan for any 8-bit characters.  Return 1 if they exist.
+ *
+ * Scan up until the given endpoint (but not the actual endpoint itself).
+ * If the endpoint is NULL, scan until a '\0' is reached.
+ */
+
+int
+contains8bit(const char *start, const char *end)
+{
+    if (! start)
+       return 0;
+
+    while (*start != '\0' && (!end || (start < end)))
+       if (! isascii((unsigned char) *start++))
+           return 1;
+
+    return 0;
+}