add() first parameter (s2) is now const
[mmh] / sbr / utils.c
index b0e8274..ef0ee97 100644 (file)
 #define MAXMSGS 256
 
 /*
-** Safely call malloc
-*/
-void *
-mh_xmalloc(size_t size)
-{
-       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 *
@@ -49,35 +31,49 @@ mh_xrealloc(void *ptr, size_t size)
 
        /* Some non-POSIX realloc()s don't cope with realloc(NULL,sz) */
        if (!ptr) {
-               return mh_xcalloc((size_t) 1, size);
+               return mh_xcalloc(1, size);
        }
-
-       if (size == 0)
+       if (size == 0) {
                adios(EX_SOFTWARE, NULL, "Tried to realloc 0 bytes");
+       }
 
        memory = realloc(ptr, size);
-       if (!memory)
+       if (!memory) {
                adios(EX_OSERR, NULL, "Realloc failed");
+       }
 
        return memory;
 }
 
 /*
- * Safely call calloc
- */
+** Safely call calloc
+*/
 void *
 mh_xcalloc(size_t nmemb, size_t size)
 {
-    void *memory;
+       void *memory;
+
+       if (nmemb == 0  ||  size == 0) {
+               adios(EX_SOFTWARE, NULL, "Tried to calloc 0 bytes");
+       }
 
-    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");
+       }
+}
 
-    if ((memory = calloc(nmemb, size))) {
-        return memory;
-    } else {
-        adios(EX_OSERR, NULL, "calloc failed");
-    }
+/*
+** Free a pointer and set it to NULL.
+*/
+void
+mh_free0(void * ptr)
+{
+       void ** p;
+       p = ptr;
+       free(*p);
+       *p = NULL;
 }
 
 /*
@@ -111,34 +107,37 @@ pwd(void)
 /*
 ** add   -- If "s1" is NULL, this routine just creates a
 **       -- copy of "s2" into newly malloc'ed memory.
-**       -- (use getcpy() instead in this case)
+**       -- (use mh_xstrdup() 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)
+add(const char *s2, char *s1)
 {
        char *cp;
        size_t len1 = 0, len2 = 0;
 
-       if (s1)
+       if (s1) {
                len1 = strlen(s1);
-       if (s2)
+       }
+       if (s2) {
                len2 = strlen(s2);
+       }
 
-       cp = mh_xmalloc(len1 + len2 + 1);
+       cp = mh_xcalloc(len1 + len2 + 1, sizeof(char));
 
        /* Copy s1 and free it */
        if (s1) {
                memcpy(cp, s1, len1);
-               free(s1);
+               mh_free0(&s1);
        }
 
        /* Copy s2 */
-       if (s2)
+       if (s2) {
                memcpy(cp + len1, s2, len2);
+       }
 
        /* Now NULL terminate the string */
        cp[len1 + len2] = '\0';
@@ -159,20 +158,23 @@ create_folder(char *folder, int autocreate, void (*done_callback)(int))
        char *cp;
 
        if (stat(folder, &st) == -1) {
-               if (errno != ENOENT)
+               if (errno != ENOENT) {
                        adios(EX_IOERR, folder, "error on folder");
+               }
                if (autocreate == 0) {
                        /* ask before creating folder */
                        cp = concat("Create folder \"", folder, "\"? ", NULL);
-                       if (!getanswer(cp))
+                       if (!getanswer(cp)) {
                                done_callback(EX_CANTCREAT);
-                       free(cp);
+                       }
+                       mh_free0(&cp);
                } else if (autocreate == -1) {
                        /* do not create, so exit */
                        done_callback(EX_CANTCREAT);
                }
-               if (!makedir(folder))
+               if (!makedir(folder)) {
                        adios(EX_CANTCREAT, NULL, "unable to create folder %s", folder);
+               }
        }
 }
 
@@ -186,11 +188,13 @@ num_digits(int n)
        int ndigits = 0;
 
        /* Sanity check */
-       if (n < 0)
+       if (n < 0) {
                adios(EX_SOFTWARE, NULL, "oops, num_digits called with negative value");
+       }
 
-       if (n == 0)
+       if (n == 0) {
                return 1;
+       }
 
        while (n) {
                n /= 10;
@@ -208,8 +212,25 @@ num_digits(int n)
 void
 app_msgarg(struct msgs_array *msgs, char *cp)
 {
-       if(msgs->size >= msgs->max)
+       if(msgs->size >= msgs->max) {
                msgs->msgs = mh_xrealloc(msgs->msgs,
                                (msgs->max+=MAXMSGS)*sizeof(*msgs->msgs));
+       }
        msgs->msgs[msgs->size++] = cp;
 }
+
+/*
+** mh_xstrdup() is a wrapper of strdup() to replace getcpy().  It returns
+** a copy of its argument if this is nonnull; otherwise, it returns a
+** string of length 0.
+*/
+char *
+mh_xstrdup(char * s)
+{
+       char * tmp;
+       tmp = strdup(s ? s : "");
+       if (!tmp) {
+               adios(EX_OSERR, "strdup", "can't copy string");
+       }
+       return tmp;
+}