diff options
Diffstat (limited to 'src/common/mempattern.c')
-rw-r--r-- | src/common/mempattern.c | 73 |
1 files changed, 64 insertions, 9 deletions
diff --git a/src/common/mempattern.c b/src/common/mempattern.c index acf6eac..2ea7e50 100644 --- a/src/common/mempattern.c +++ b/src/common/mempattern.c @@ -14,15 +14,51 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <config.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/resource.h> -#include <config.h> #include <stdarg.h> +#include "mempattern.h" +#include "common/log.h" #include "common/slab/alloc-common.h" +static void *mm_malloc(void *ctx, size_t n) +{ + UNUSED(ctx); + return malloc(n); +} + +void mm_ctx_init(mm_ctx_t *mm) +{ + mm->ctx = NULL; + mm->alloc = mm_malloc; + mm->free = free; +} + +void* xmalloc(size_t l) +{ + void *p = malloc(l); + if (p == NULL) { + log_server_fatal("Failed to allocate %zu bytes.\n", l); + abort(); + } + return p; +} + +void *xrealloc(void *p, size_t l) +{ + p = realloc(p, l); + if (p == NULL) { + log_server_fatal("Failed to reallocate to %zu bytes from %p.\n", + l, p); + abort(); + } + return p; +} + int mreserve(char **p, size_t tlen, size_t min, size_t allow, size_t *reserved) { @@ -31,7 +67,7 @@ int mreserve(char **p, size_t tlen, size_t min, size_t allow, size_t *reserved) if (maxlen < min) { return -2; /* size_t overflow */ } - + /* Meet target size but trim excessive amounts. */ if (*reserved < min || *reserved > maxlen) { void *trimmed = realloc(*p, maxlen * tlen); @@ -42,7 +78,7 @@ int mreserve(char **p, size_t tlen, size_t min, size_t allow, size_t *reserved) return -1; } } - + return 0; } @@ -51,21 +87,21 @@ char* sprintf_alloc(const char *fmt, ...) int size = 100; char *p = NULL, *np = NULL; va_list ap; - + if ((p = malloc(size)) == NULL) return NULL; - + while (1) { - + /* Try to print in the allocated space. */ va_start(ap, fmt); int n = vsnprintf(p, size, fmt, ap); va_end(ap); - + /* If that worked, return the string. */ if (n > -1 && n < size) return p; - + /* Else try again with more space. */ if (n > -1) { /* glibc 2.1 */ size = n+1; /* precisely what is needed */ @@ -79,11 +115,30 @@ char* sprintf_alloc(const char *fmt, ...) p = np; } } - + /* Should never get here. */ return p; } +char* strcdup(const char *s1, const char *s2) +{ + if (!s1 || !s2) { + return NULL; + } + + size_t slen = strlen(s1); + size_t s2len = strlen(s2); + size_t nlen = slen + s2len + 1; + char* dst = malloc(nlen); + if (dst == NULL) { + return NULL; + } + + memcpy(dst, s1, slen); + strncpy(dst + slen, s2, s2len + 1); // With trailing '\0' + return dst; +} + #ifdef MEM_DEBUG /* * ((destructor)) attribute executes this function after main(). |