/*
 * memory wrappers
 *
 * Copyright (c) Artem Bityutskiy, 2007, 2008
 * Copyright 2001, 2002 Red Hat, Inc.
 *           2001 David A. Schleef <ds@lineo.com>
 *           2002 Axis Communications AB
 *           2001, 2002 Erik Andersen <andersen@codepoet.org>
 *           2004 University of Szeged, Hungary
 *           2006 KaiGai Kohei <kaigai@ak.jp.nec.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
 * the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#ifndef __MTD_UTILS_XALLOC_H__
#define __MTD_UTILS_XALLOC_H__

#include <stdarg.h>
#include <stdlib.h>
#include <string.h>

/*
 * Mark these functions as unused so that gcc does not emit warnings
 * when people include this header but don't use every function.
 */

__attribute__((unused))
static void *xmalloc(size_t size)
{
	void *ptr = malloc(size);

	if (ptr == NULL && size != 0)
		sys_errmsg_die("out of memory");
	return ptr;
}

__attribute__((unused))
static void *xcalloc(size_t nmemb, size_t size)
{
	void *ptr = calloc(nmemb, size);

	if (ptr == NULL && nmemb != 0 && size != 0)
		sys_errmsg_die("out of memory");
	return ptr;
}

__attribute__((unused))
static void *xzalloc(size_t size)
{
	return xcalloc(1, size);
}

__attribute__((unused))
static void *xrealloc(void *ptr, size_t size)
{
	ptr = realloc(ptr, size);
	if (ptr == NULL && size != 0)
		sys_errmsg_die("out of memory");
	return ptr;
}

__attribute__((unused))
static char *xstrdup(const char *s)
{
	char *t;

	if (s == NULL)
		return NULL;
	t = strdup(s);
	if (t == NULL)
		sys_errmsg_die("out of memory");
	return t;
}

#ifdef _GNU_SOURCE

__attribute__((unused))
static int xasprintf(char **strp, const char *fmt, ...)
{
	int cnt;
	va_list ap;

	va_start(ap, fmt);
	cnt = vasprintf(strp, fmt, ap);
	va_end(ap);

	if (cnt == -1)
		sys_errmsg_die("out of memory");

	return cnt;
}
#endif

#endif /* !__MTD_UTILS_XALLOC_H__ */
