X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Futils.c;h=ef0ee9738676d018b9c191f3d339cf89593b04ff;hp=297ad45c2ac5b3fcfa9367860805e362e1f028ac;hb=eb650f703c26232c0ccce00c9b3dd3f6b6d51dd4;hpb=d4f5f9d551c05931478fcdfb5cd4ac06b419eeda diff --git a/sbr/utils.c b/sbr/utils.c index 297ad45..ef0ee97 100644 --- a/sbr/utils.c +++ b/sbr/utils.c @@ -11,6 +11,9 @@ #include #include #include +#include +#include +#include /* ** We allocate space for messages (msgs array) @@ -19,44 +22,58 @@ #define MAXMSGS 256 /* -** Safely call malloc +** Safely call realloc */ void * -mh_xmalloc(size_t size) +mh_xrealloc(void *ptr, size_t size) { void *memory; - if (size == 0) - adios(NULL, "Tried to malloc 0 bytes"); + /* Some non-POSIX realloc()s don't cope with realloc(NULL,sz) */ + if (!ptr) { + return mh_xcalloc(1, size); + } + if (size == 0) { + adios(EX_SOFTWARE, NULL, "Tried to realloc 0 bytes"); + } - memory = malloc(size); - if (!memory) - adios(NULL, "Malloc failed"); + memory = realloc(ptr, size); + if (!memory) { + adios(EX_OSERR, NULL, "Realloc failed"); + } return memory; } /* -** Safely call realloc +** Safely call calloc */ void * -mh_xrealloc(void *ptr, size_t size) +mh_xcalloc(size_t nmemb, size_t size) { void *memory; - /* Some non-POSIX realloc()s don't cope with realloc(NULL,sz) */ - if (!ptr) { - return mh_xmalloc(size); + if (nmemb == 0 || size == 0) { + adios(EX_SOFTWARE, NULL, "Tried to calloc 0 bytes"); } - if (size == 0) - adios(NULL, "Tried to realloc 0 bytes"); - - memory = realloc(ptr, size); - if (!memory) - adios(NULL, "Realloc failed"); + if ((memory = calloc(nmemb, size))) { + return memory; + } else { + adios(EX_OSERR, NULL, "calloc failed"); + } +} - return memory; +/* +** Free a pointer and set it to NULL. +*/ +void +mh_free0(void * ptr) +{ + void ** p; + p = ptr; + free(*p); + *p = NULL; } /* @@ -66,7 +83,7 @@ mh_xrealloc(void *ptr, size_t size) char * pwd(void) { - register char *cp; + char *cp; static char curwd[PATH_MAX]; if (!getcwd(curwd, PATH_MAX)) { @@ -90,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'; @@ -138,20 +158,23 @@ create_folder(char *folder, int autocreate, void (*done_callback)(int)) char *cp; if (stat(folder, &st) == -1) { - if (errno != ENOENT) - adios(folder, "error on folder"); + 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)) - done_callback(1); - free(cp); + if (!getanswer(cp)) { + done_callback(EX_CANTCREAT); + } + mh_free0(&cp); } else if (autocreate == -1) { /* do not create, so exit */ - done_callback(1); + done_callback(EX_CANTCREAT); + } + if (!makedir(folder)) { + adios(EX_CANTCREAT, NULL, "unable to create folder %s", folder); } - if (!makedir(folder)) - adios(NULL, "unable to create folder %s", folder); } } @@ -165,11 +188,13 @@ num_digits(int n) int ndigits = 0; /* Sanity check */ - if (n < 0) - adios(NULL, "oops, num_digits called with negative value"); + 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; @@ -187,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; +}