/*
 * placed in the public domain by Uwe Ohse, uwe@ohse.de.
 */
#ifndef attributes_h
#define attributes_h

#ifdef __GNUC__
# ifdef __GNUC_MINOR__
#   define GNUC_MINIMUM(maj, min) \
   ((__GNUC__ > (maj)) || (__GNUC__ == (maj) && __GNUC_MINOR__ >= (min)))
# endif
#endif
#ifndef GNUC_MINIMUM
# define GNUC_MINIMUM(maj, min) 0
#endif                                         

/* gcc.info sagt, noreturn wäre ab 2.5 verfügbar. HPUX-gcc 2.5.8
 * kann es noch nicht - what's this?
 */
#if GNUC_MINIMUM(2,6)
# define attribute_noreturn  __attribute__((__noreturn__))
#else
# define attribute_noreturn
#endif

#if GNUC_MINIMUM(3,0)
# define attribute_pure  __attribute__((__pure__))
# define attribute_malloc  __attribute__((__malloc__))
#else
# define attribute_pure
# define attribute_malloc
#endif

#if GNUC_MINIMUM(2,5)
#  define attribute_const  __attribute__((__const__))
#else
# define attribute_const
#endif
	/* 
	 * checked Formatstring (Argument Nr. "formatnr"). Der erste 
	 * Parameter des Formatstrings ist Argument Nr. "firstargnr".
	 * für vprintf und co, wo das nicht möglich ist, ist firstargnr
	 * auf 0 zu setzen -> nur Formatstring wird geprüft.
	 */
#if GNUC_MINIMUM(2,3) 
# define attribute_printf(formatnr,firstargnr)  \
	__attribute__((__format__ (printf,formatnr,firstargnr)))
#else
# define attribute_printf(x,y)
#endif

/* die beiden folgenden werden nur definiert, wenn die Funktionalität
 * verfügbar ist. "#define dies [leer]" macht hier keinen Sinn, weil 
 * der entsprechende Code nie ausgeführt würde. 
 * Also: Mit Vorsicht benutzen.
 */
#if GNUC_MINIMUM(2,5)
#  define attribute_constructor  __attribute__((__constructor__))
#  define attribute_destructor  __attribute__((__destructor__))
#endif

#if GNUC_MINIMUM(2,7)
# define attribute_unused __attribute__((__unused__))
#else
# define attribute_unused
#endif

#define attribute_inline __inline__

#if GNUC_MINIMUM(2,7) /* doesn't work reliable before, IIRC */
# define attribute_regparm(x) __attribute__((__regparm__((x))))
#else
# define attribute_regparm(x)
#endif
#if GNUC_MINIMUM(2,7)
# define attribute_stdcall __attribute__((__stdcall__))
#else
# define attribute_stdcall
#endif

#if GNUC_MINIMUM(3,1)
# define attribute_noinline __attribute__((__noinline__))
# define attribute_deprecated __attribute__((__deprecated__))
#else
# define attribute_noinline
# define attribute_deprecated
#endif

#if GNUC_MINIMUM(3,3)
# define attribute_all_nonnull __attribute__((__nonnull__))
# define attribute_nonnull(x) __attribute__((__nonnull__((x))))
# define attribute_check_result __attribute__((__warn_unused_result__))
#else
# define attribute_all_nonnull
# define attribute_nonnull(x)
# define attribute_check_result
#endif

#if GNUC_MINIMUM(3,0) 
#else
# define __builtin_expect(x,y) (x)
#endif
#define attribute_expect(x,y) __builtin_expect((x),(y))

#define EXPECT(x,y)           attribute_expect((x),(y))


#endif
