00001 #ifndef _RPMUTIL_H
00002 #define _RPMUTIL_H
00003
00004 #include <unistd.h>
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)
00020 # define RPM_GNUC_EXTENSION __extension__
00021 #else
00022 # define RPM_GNUC_EXTENSION
00023 #endif
00024
00025
00026
00027 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
00028 #define RPM_GNUC_PURE \
00029 __attribute__((__pure__))
00030 #define RPM_GNUC_MALLOC \
00031 __attribute__((__malloc__))
00032 #else
00033 #define RPM_GNUC_PURE
00034 #define RPM_GNUC_MALLOC
00035 #endif
00036
00037 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
00038 #define RPM_GNUC_ALLOC_SIZE(x) __attribute__((__alloc_size__(x)))
00039 #define RPM_GNUC_ALLOC_SIZE2(x,y) __attribute__((__alloc_size__(x,y)))
00040 #else
00041 #define RPM_GNUC_ALLOC_SIZE(x)
00042 #define RPM_GNUC_ALLOC_SIZE2(x,y)
00043 #endif
00044
00045 #if __GNUC__ >= 4
00046 #define RPM_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
00047 #else
00048 #define RPM_GNUC_NULL_TERMINATED
00049 #endif
00050
00051 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
00052 #define RPM_GNUC_PRINTF( format_idx, arg_idx ) \
00053 __attribute__((__format__ (__printf__, format_idx, arg_idx)))
00054 #define RPM_GNUC_SCANF( format_idx, arg_idx ) \
00055 __attribute__((__format__ (__scanf__, format_idx, arg_idx)))
00056 #define RPM_GNUC_FORMAT( arg_idx ) \
00057 __attribute__((__format_arg__ (arg_idx)))
00058 #define RPM_GNUC_NORETURN \
00059 __attribute__((__noreturn__))
00060 #define RPM_GNUC_CONST \
00061 __attribute__((__const__))
00062 #define RPM_GNUC_UNUSED \
00063 __attribute__((__unused__))
00064 #define RPM_GNUC_NO_INSTRUMENT \
00065 __attribute__((__no_instrument_function__))
00066 #else
00067 #define RPM_GNUC_PRINTF( format_idx, arg_idx )
00068 #define RPM_GNUC_SCANF( format_idx, arg_idx )
00069 #define RPM_GNUC_FORMAT( arg_idx )
00070 #define RPM_GNUC_NORETURN
00071 #define RPM_GNUC_CONST
00072 #define RPM_GNUC_UNUSED
00073 #define RPM_GNUC_NO_INSTRUMENT
00074 #endif
00075
00076 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
00077 #define RPM_GNUC_DEPRECATED \
00078 __attribute__((__deprecated__))
00079 #else
00080 #define RPM_GNUC_DEPRECATED
00081 #endif
00082
00083 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)
00084 #define RPM_GNUC_MAY_ALIAS __attribute__((may_alias))
00085 #define RPM_GNUC_NONNULL( ... ) \
00086 __attribute__((__nonnull__ (__VA_ARGS__)))
00087 #else
00088 #define RPM_GNUC_MAY_ALIAS
00089 #define RPM_GNUC_NONNULL( ... )
00090 #endif
00091
00092 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
00093 #define RPM_GNUC_WARN_UNUSED_RESULT \
00094 __attribute__((warn_unused_result))
00095 #else
00096 #define RPM_GNUC_WARN_UNUSED_RESULT
00097 #endif
00098
00099 #if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)
00100 # define RPM_GNUC_INTERNAL __attribute__((visibility("hidden")))
00101 #else
00102 # define RPM_GNUC_INTERNAL
00103 #endif
00104
00105
00106
00107 #ifdef __cplusplus
00108 # define RPM_BEGIN_DECLS extern "C" {
00109 # define RPM_END_DECLS }
00110 #else
00111 # define RPM_BEGIN_DECLS
00112 # define RPM_END_DECLS
00113 #endif
00114
00115
00116 RPM_GNUC_MALLOC RPM_GNUC_ALLOC_SIZE(1)
00117 void * rmalloc(size_t size);
00118
00119 RPM_GNUC_MALLOC RPM_GNUC_ALLOC_SIZE2(1,2)
00120 void * rcalloc(size_t nmemb, size_t size);
00121
00122 RPM_GNUC_ALLOC_SIZE(2)
00123 void * rrealloc(void *ptr, size_t size);
00124
00125 char * rstrdup(const char *str);
00126
00127
00128 void * rfree(void *ptr);
00129
00141 typedef void * (*rpmMemFailFunc) (size_t size, void *data);
00142
00149 void * rpmSetMemFail(rpmMemFailFunc func, void *data);
00150
00151 #endif