Archived
1
0
Fork 0

xalloc.c: cleaning up and better error messages.

This commit is contained in:
Henrik Hautakoski 2010-11-24 21:50:02 +01:00
parent 3cdbc3aa57
commit 5dd6f89946

View file

@ -14,87 +14,78 @@
#include "util.h" #include "util.h"
#include "xalloc.h" #include "xalloc.h"
#define CHECK(expr) \
if (!(expr)) \
goto bail
#define CHECK_SET_ERRNO(expr, no) \
if (!(expr)) { \
errno = no; \
goto bail; \
}
#ifdef __DEBUG__ #ifdef __DEBUG__
# define CHECK_INPUT(s) CHECK_SET_ERRNO(s, EINVAL) # define CHECK_INPUT(s, prefix) \
if (!(s)) \
die(prefix ": Invalid argument '%s'\n", #s)
#else #else
# define CHECK_INPUT(s) # define CHECK_INPUT(s, prefix)
#endif #endif
void* xmalloc(size_t size) { void* xmalloc(size_t size) {
CHECK_INPUT(size); void *ptr;
void *ptr = malloc(size); CHECK_INPUT(size, "xmalloc");
CHECK(ptr);
ptr = malloc(size);
if (!ptr)
die("xmalloc: %s, tried to allocate %lu bytes",
strerror(errno), (unsigned long) size);
return ptr; return ptr;
bail:
die_errno("xmalloc");
} }
void* xmallocz(size_t size) { void* xmallocz(size_t size) {
CHECK_INPUT(size); void *ptr;
void *ptr = malloc(size); CHECK_INPUT(size, "xmallocz");
CHECK(ptr);
ptr = malloc(size);
if (!ptr)
die_errno("xmallocz");
memset(ptr, 0, size); memset(ptr, 0, size);
return ptr; return ptr;
bail:
die_errno("xmallocz");
} }
void* xrealloc(void *ptr, size_t size) { void* xrealloc(void *ptr, size_t size) {
CHECK_INPUT(size); void *new;
CHECK_INPUT(size, "xrealloc");
ptr = realloc(ptr, size); new = realloc(ptr, size);
CHECK(ptr); if (!new)
return ptr; die("xrealloc: Can't resize memory block (%s) on '%p' with size '%lu'",
bail: strerror(errno), ptr, (unsigned long) size);
die_errno("xrealloc"); return new;
} }
char* xstrdup(const char *s) { char* xstrdup(const char *s) {
CHECK_INPUT(s); size_t len;
char *dest;
size_t len = strlen(s) + 1; CHECK_INPUT(s, "xstrdup");
char *dest = xmalloc(len);
CHECK(dest); len = strlen(s) + 1;
dest = xmalloc(len);
memcpy(dest, s, len); memcpy(dest, s, len);
return dest; return dest;
bail:
die_errno("xstrdup");
} }
void* xmemdup(const void *src, size_t size) { void* xmemdup(const void *src, size_t size) {
CHECK_INPUT(src); void *dest;
void *dest = malloc(size); CHECK_INPUT(src, "xmemdup");
CHECK(dest);
dest = xmalloc(size);
memcpy(dest, src, size); memcpy(dest, src, size);
return dest; return dest;
bail:
die_errno("xmemdup");
} }
void xfree(void *ptr) { void xfree(void *ptr) {
CHECK_INPUT(ptr); CHECK_INPUT(ptr, "xfree");
free(ptr); free(ptr);
return;
bail:
die_errno("xfree");
} }