/**
* @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 */