There are two things happening in this commit. 1) Move each function attribute to it's own line 2) move function return value after attributes so that function inputs and outputs are on same line. Signed-off-by: Sami Kerola <kerolasa@iki.fi>
142 lines
2.8 KiB
C
142 lines
2.8 KiB
C
/*
|
|
* Copyright (C) 2010 Davidlohr Bueso <dave@gnu.org>
|
|
*
|
|
* This file may be redistributed under the terms of the
|
|
* GNU Lesser General Public License.
|
|
*
|
|
* General memory allocation wrappers for malloc, realloc, calloc and strdup
|
|
*/
|
|
|
|
#ifndef UTIL_LINUX_XALLOC_H
|
|
#define UTIL_LINUX_XALLOC_H
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "c.h"
|
|
|
|
#ifndef XALLOC_EXIT_CODE
|
|
# define XALLOC_EXIT_CODE EXIT_FAILURE
|
|
#endif
|
|
|
|
static inline
|
|
__attribute__((__noreturn__))
|
|
void __err_oom(const char *file, unsigned int line)
|
|
{
|
|
err(XALLOC_EXIT_CODE, "%s: %u: cannot allocate memory", file, line);
|
|
}
|
|
|
|
#define err_oom() __err_oom(__FILE__, __LINE__)
|
|
|
|
static inline
|
|
__ul_alloc_size(1)
|
|
__ul_returns_nonnull
|
|
void *xmalloc(const size_t size)
|
|
{
|
|
void *ret = malloc(size);
|
|
|
|
if (!ret && size)
|
|
err(XALLOC_EXIT_CODE, "cannot allocate %zu bytes", size);
|
|
return ret;
|
|
}
|
|
|
|
static inline
|
|
__ul_alloc_size(2)
|
|
__ul_returns_nonnull
|
|
void *xrealloc(void *ptr, const size_t size)
|
|
{
|
|
void *ret = realloc(ptr, size);
|
|
|
|
if (!ret && size)
|
|
err(XALLOC_EXIT_CODE, "cannot allocate %zu bytes", size);
|
|
return ret;
|
|
}
|
|
|
|
static inline
|
|
__ul_calloc_size(1, 2)
|
|
__ul_returns_nonnull
|
|
void *xcalloc(const size_t nelems, const size_t size)
|
|
{
|
|
void *ret = calloc(nelems, size);
|
|
|
|
if (!ret && size && nelems)
|
|
err(XALLOC_EXIT_CODE, "cannot allocate %zu bytes", size);
|
|
return ret;
|
|
}
|
|
|
|
static inline
|
|
__attribute__((warn_unused_result))
|
|
__ul_returns_nonnull
|
|
char *xstrdup(const char *str)
|
|
{
|
|
char *ret;
|
|
|
|
assert(str);
|
|
|
|
ret = strdup(str);
|
|
|
|
if (!ret)
|
|
err(XALLOC_EXIT_CODE, "cannot duplicate string");
|
|
return ret;
|
|
}
|
|
|
|
static inline
|
|
__attribute__((warn_unused_result))
|
|
__ul_returns_nonnull
|
|
char *xstrndup(const char *str, size_t size)
|
|
{
|
|
char *ret;
|
|
|
|
assert(str);
|
|
|
|
ret = strndup(str, size);
|
|
|
|
if (!ret)
|
|
err(XALLOC_EXIT_CODE, "cannot duplicate string");
|
|
return ret;
|
|
}
|
|
|
|
|
|
static inline
|
|
__attribute__((__format__(printf, 2, 3)))
|
|
int xasprintf(char **strp, const char *fmt, ...)
|
|
{
|
|
int ret;
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
ret = vasprintf(&(*strp), fmt, args);
|
|
va_end(args);
|
|
if (ret < 0)
|
|
err(XALLOC_EXIT_CODE, "cannot allocate string");
|
|
return ret;
|
|
}
|
|
|
|
static inline
|
|
__attribute__((__format__(printf, 2, 0)))
|
|
int xvasprintf(char **strp, const char *fmt, va_list ap)
|
|
{
|
|
int ret = vasprintf(&(*strp), fmt, ap);
|
|
if (ret < 0)
|
|
err(XALLOC_EXIT_CODE, "cannot allocate string");
|
|
return ret;
|
|
}
|
|
|
|
|
|
static inline
|
|
__attribute__((warn_unused_result))
|
|
char *xgethostname(void)
|
|
{
|
|
char *name;
|
|
size_t sz = get_hostname_max() + 1;
|
|
|
|
name = xmalloc(sizeof(char) * sz);
|
|
|
|
if (gethostname(name, sz) != 0) {
|
|
free(name);
|
|
return NULL;
|
|
}
|
|
name[sz - 1] = '\0';
|
|
return name;
|
|
}
|
|
|
|
#endif
|