/**
 * @file op_libiberty.h
 * Wrapper for libiberty - always use this instead of
 * libiberty.h
 *
 * @remark Copyright 2002 OProfile authors
 * @remark Read the file COPYING
 *
 * @author John Levon
 * @author Philippe Elie
 */

#ifndef OP_LIBIBERTY_H
#define OP_LIBIBERTY_H

#include <stddef.h>

#include "config.h"

#ifdef MALLOC_ATTRIBUTE_OK
#define OP_ATTRIB_MALLOC	__attribute__((malloc))
#else
#define OP_ATTRIB_MALLOC
#endif

#ifdef HAVE_LIBIBERTY_H
#include <libiberty.h>
#else

#ifdef __cplusplus
extern "C" {
#endif

/* some system have a libiberty.a but no libiberty.h so we must provide
 * ourself the missing proto */
#ifndef HAVE_LIBIBERTY_H

/* Set the program name used by xmalloc.  */
void xmalloc_set_program_name(char const *);

/* Allocate memory without fail.  If malloc fails, this will print a
   message to stderr (using the name set by xmalloc_set_program_name,
   if any) and then call xexit.  */
void * xmalloc(size_t) OP_ATTRIB_MALLOC;

/* Reallocate memory without fail.  This works like xmalloc.  Note,
   realloc type functions are not suitable for attribute malloc since
   they may return the same address across multiple calls. */
void * xrealloc(void *, size_t);

/* Allocate memory without fail and set it to zero.  This works like xmalloc */
void * xcalloc(size_t, size_t) OP_ATTRIB_MALLOC;

/* Copy a string into a memory buffer without fail.  */
char * xstrdup(char const *) OP_ATTRIB_MALLOC;

/**
 * Duplicates a region of memory without fail.  First, alloc_size bytes
 * are allocated, then copy_size bytes from input are copied into
 * it, and the new memory is returned.  If fewer bytes are copied than were
 * allocated, the remaining memory is zeroed.
 */
void * xmemdup(void const *, size_t, size_t) OP_ATTRIB_MALLOC;

#endif	/* !HAVE_LIBIBERTY_H */

#ifdef ANDROID
#define xmalloc(s)      malloc(s)
#define xrealloc(p,s)   realloc(p,s)
#define xstrdup(str)    strdup(str)
#define xmalloc_set_program_name(n)
#endif


#ifdef __cplusplus
}
#endif

#endif /* !HAVE_LIBIBERTY_H */

#endif /* OP_LIBIBERTY_H */