util-linux/include/xalloc.h
Sami Kerola aba9e76e25 include/xalloc: use multiline function declarations
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>
2019-08-21 15:00:16 +02:00

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