csomh / source-git / rpm

Forked from source-git/rpm 4 years ago
Clone
2ff057
#ifndef _RPMUTIL_H
2ff057
#define _RPMUTIL_H
2ff057
2ff057
#include <unistd.h>
2ff057
2ff057
/** \file rpmio/rpmutil.h
2ff057
 *
2ff057
 * Miscellaneous utility macros:
2ff057
 * - portability wrappers for various gcc extensions like __attribute__()
2ff057
 * - ...
2ff057
 *
2ff057
 * Copied from glib, names replaced to avoid clashing with glib.
2ff057
 *
2ff057
 */
2ff057
2ff057
/* Here we provide RPM_GNUC_EXTENSION as an alias for __extension__,
2ff057
 * where this is valid. This allows for warningless compilation of
2ff057
 * "long long" types even in the presence of '-ansi -pedantic'. 
2ff057
 */
2ff057
#if     __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)
2ff057
#  define RPM_GNUC_EXTENSION __extension__
2ff057
#else
2ff057
#  define RPM_GNUC_EXTENSION
2ff057
#endif
2ff057
2ff057
/* Provide macros to feature the GCC function attribute.
2ff057
 */
2ff057
#if    __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
2ff057
#define RPM_GNUC_PURE                            \
2ff057
  __attribute__((__pure__))
2ff057
#define RPM_GNUC_MALLOC    			\
2ff057
  __attribute__((__malloc__))
2ff057
#else
2ff057
#define RPM_GNUC_PURE
2ff057
#define RPM_GNUC_MALLOC
2ff057
#endif
2ff057
2ff057
#if     (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
2ff057
#define RPM_GNUC_ALLOC_SIZE(x) __attribute__((__alloc_size__(x)))
2ff057
#define RPM_GNUC_ALLOC_SIZE2(x,y) __attribute__((__alloc_size__(x,y)))
2ff057
#else
2ff057
#define RPM_GNUC_ALLOC_SIZE(x)
2ff057
#define RPM_GNUC_ALLOC_SIZE2(x,y)
2ff057
#endif
2ff057
2ff057
#if     __GNUC__ >= 4
2ff057
#define RPM_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
2ff057
#else
2ff057
#define RPM_GNUC_NULL_TERMINATED
2ff057
#endif
2ff057
2ff057
#if     __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
2ff057
#define RPM_GNUC_PRINTF( format_idx, arg_idx )    \
2ff057
  __attribute__((__format__ (__printf__, format_idx, arg_idx)))
2ff057
#define RPM_GNUC_SCANF( format_idx, arg_idx )     \
2ff057
  __attribute__((__format__ (__scanf__, format_idx, arg_idx)))
2ff057
#define RPM_GNUC_FORMAT( arg_idx )                \
2ff057
  __attribute__((__format_arg__ (arg_idx)))
2ff057
#define RPM_GNUC_NORETURN                         \
2ff057
  __attribute__((__noreturn__))
2ff057
#define RPM_GNUC_CONST                            \
2ff057
  __attribute__((__const__))
2ff057
#define RPM_GNUC_UNUSED                           \
2ff057
  __attribute__((__unused__))
2ff057
#define RPM_GNUC_NO_INSTRUMENT			\
2ff057
  __attribute__((__no_instrument_function__))
2ff057
#else   /* !__GNUC__ */
2ff057
#define RPM_GNUC_PRINTF( format_idx, arg_idx )
2ff057
#define RPM_GNUC_SCANF( format_idx, arg_idx )
2ff057
#define RPM_GNUC_FORMAT( arg_idx )
2ff057
#define RPM_GNUC_NORETURN
2ff057
#define RPM_GNUC_CONST
2ff057
#define RPM_GNUC_UNUSED
2ff057
#define RPM_GNUC_NO_INSTRUMENT
2ff057
#endif  /* !__GNUC__ */
2ff057
2ff057
#if    __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
2ff057
#define RPM_GNUC_DEPRECATED                            \
2ff057
  __attribute__((__deprecated__))
2ff057
#else
2ff057
#define RPM_GNUC_DEPRECATED
2ff057
#endif /* __GNUC__ */
2ff057
2ff057
#if     __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)
2ff057
#define RPM_GNUC_MAY_ALIAS __attribute__((may_alias))
2ff057
#define RPM_GNUC_NONNULL( ... )	\
2ff057
  __attribute__((__nonnull__ (__VA_ARGS__)))
2ff057
#else
2ff057
#define RPM_GNUC_MAY_ALIAS
2ff057
#define RPM_GNUC_NONNULL( ... )
2ff057
#endif
2ff057
2ff057
#if    __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
2ff057
#define RPM_GNUC_WARN_UNUSED_RESULT 		\
2ff057
  __attribute__((warn_unused_result))
2ff057
#else
2ff057
#define RPM_GNUC_WARN_UNUSED_RESULT
2ff057
#endif /* __GNUC__ */
2ff057
2ff057
#if    __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)
2ff057
#  define RPM_GNUC_INTERNAL __attribute__((visibility("hidden")))
2ff057
#else
2ff057
#  define RPM_GNUC_INTERNAL
2ff057
#endif
2ff057
2ff057
2ff057
/* Guard C code in headers, while including them from C++ */
2ff057
#ifdef  __cplusplus
2ff057
# define RPM_BEGIN_DECLS  extern "C" {
2ff057
# define RPM_END_DECLS    }
2ff057
#else
2ff057
# define RPM_BEGIN_DECLS
2ff057
# define RPM_END_DECLS
2ff057
#endif
2ff057
2ff057
#ifdef __cplusplus
2ff057
extern "C" {
2ff057
#endif
2ff057
2ff057
/* Rpm specific allocators which never return NULL but terminate on failure */
2ff057
RPM_GNUC_MALLOC RPM_GNUC_ALLOC_SIZE(1)
2ff057
void * rmalloc(size_t size);
2ff057
2ff057
RPM_GNUC_MALLOC RPM_GNUC_ALLOC_SIZE2(1,2)
2ff057
void * rcalloc(size_t nmemb, size_t size);
2ff057
2ff057
RPM_GNUC_ALLOC_SIZE(2)
2ff057
void * rrealloc(void *ptr, size_t size);
2ff057
2ff057
char * rstrdup(const char *str);
2ff057
2ff057
/* Rpm specific free() which returns NULL */
2ff057
void * rfree(void *ptr);
2ff057
2ff057
/** \ingroup rpmutil
2ff057
 * Memory allocation failure callback prototype. When registered through
2ff057
 * rpmSetMemFail(), this gets called if memory allocation through rmalloc()
2ff057
 * and friends fails. If the application can somehow recover memory here,
2ff057
 * it can return a newly allocated memory block of requested size, otherwise
2ff057
 * it must return NULL after performing it's own shutdown deeds or 
2ff057
 * terminate itself.
2ff057
 * @param size		Size of allocation request in bytes
2ff057
 * @param data		User data (or NULL)
2ff057
 * @return		Allocated memory block of requested size or NULL
2ff057
 */
2ff057
typedef void * (*rpmMemFailFunc) (size_t size, void *data);
2ff057
2ff057
/** \ingroup rpmutil
2ff057
 * Set memory allocation failure callback.
2ff057
 * @param func		Allocation failure callback function
2ff057
 * @param data		User data (or NULL)
2ff057
 * @return		Previous callback function
2ff057
 */
2ff057
rpmMemFailFunc rpmSetMemFail(rpmMemFailFunc func, void *data);
2ff057
2ff057
#ifdef __cplusplus
2ff057
}
2ff057
#endif
2ff057
2ff057
#endif /* _RPMUTIL_H */