macros.h revision 772a217e4c61292cb7d4a00253ad8dc6dcfda825
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch#ifndef __MACROS_H
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define __MACROS_H
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch/* several useful macros, mostly from glib.h */
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#ifndef NULL
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define NULL ((void *)0)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#endif
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#ifndef FALSE
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define FALSE (0)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#endif
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#ifndef TRUE
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define TRUE (!FALSE)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#endif
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define BITS_IN_UINT (CHAR_BIT * sizeof(unsigned int))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define MEM_ALIGN(size) \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch (((size) + MEM_ALIGN_SIZE-1) & ~((unsigned int) MEM_ALIGN_SIZE-1))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch/* Don't use simply MIN/MAX, as they're often defined elsewhere in include
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch files that are included after this file generating tons of warnings. */
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define I_MIN(a, b) (((a) < (b)) ? (a) : (b))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define I_MAX(a, b) (((a) > (b)) ? (a) : (b))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#undef CLAMP
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#undef NVL
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define NVL(str, nullstr) ((str) != NULL ? (str) : (nullstr))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define POINTER_TO_INT(p) ((int) (p))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define POINTER_TO_UINT(p) ((unsigned int) (size_t) (p))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define INT_TO_POINTER(i) ((void *) (i))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define UINT_TO_POINTER(u) ((void *) (u))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch/* Define VA_COPY() to do the right thing for copying va_list variables. */
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#ifndef VA_COPY
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# if defined (__GNUC__) && defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define VA_COPY(ap1, ap2) (*(ap1) = *(ap2))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# elif defined (VA_COPY_AS_ARRAY)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define VA_COPY(ap1, ap2) i_memmove ((ap1), (ap2), sizeof (va_list))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# else /* va_list is a pointer */
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define VA_COPY(ap1, ap2) ((ap1) = (ap2))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# endif /* va_list is a pointer */
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#endif
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch/* Provide convenience macros for handling structure
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch * fields through their offsets.
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch */
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define STRUCT_OFFSET(struct_p, member) \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch ((long) ((char *) &((struct_p)->member) - (char *) (struct_p)))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define STRUCT_MEMBER_P(struct_p, struct_offset) \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch ((void *) ((char *) (struct_p) + (long) (struct_offset)))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define STRUCT_MEMBER(member_type, struct_p, struct_offset) \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch (*(member_type *) G_STRUCT_MEMBER_P((struct_p), (struct_offset)))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch/* Provide simple macro statement wrappers (adapted from Perl):
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch STMT_START { statements; } STMT_END;
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch can be used as a single statement, as in
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (x) STMT_START { ... } STMT_END; else ...
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch For gcc we will wrap the statements within `({' and `})' braces.
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch For SunOS they will be wrapped within `if (1)' and `else (void) 0',
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch and otherwise within `do' and `while (0)'. */
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#if !(defined (STMT_START) && defined (STMT_END))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define STMT_START (void)(
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define STMT_END )
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# else
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# if (defined (sun) || defined (__sun__))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define STMT_START if (1)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define STMT_END else (void)0
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# else
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define STMT_START do
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define STMT_END while (0)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# endif
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# endif
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#endif
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch/* Provide macros to feature the GCC function attribute. */
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define __attr_format__(format_idx, arg_idx) \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __attribute__((format (printf, format_idx, arg_idx)))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define __attr_format_arg__(arg_idx) \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __attribute__((format_arg (arg_idx)))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define __attr_unused__ __attribute__((unused))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define __attr_noreturn__ __attribute__((noreturn))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define __attr_const__ __attribute__((const))
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#else
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define __attr_format__(format_idx, arg_idx)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define __attr_format_arg__(arg_idx)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define __attr_unused__
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define __attr_noreturn__
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define __attr_const__
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define __attr_unused__
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#endif
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch/* Wrap the gcc __PRETTY_FUNCTION__ and __FUNCTION__ variables with
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch macros, so we can refer to them as strings unconditionally. */
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#ifdef __GNUC__
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define GNUC_FUNCTION __FUNCTION__
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define GNUC_PRETTY_FUNCTION __PRETTY_FUNCTION__
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#else
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define GNUC_FUNCTION ""
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define GNUC_PRETTY_FUNCTION ""
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#endif
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch/* Provide macros for error handling. */
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#ifdef DISABLE_CHECKS
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define i_assert(expr)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define return_if_fail(expr)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch# define return_val_if_fail(expr,val)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#elif defined (__GNUC__) && !defined (__STRICT_ANSI__)
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define i_assert(expr) STMT_START{ \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (!(expr)) \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch i_panic("file %s: line %d (%s): assertion failed: (%s)", \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __FILE__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __LINE__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __PRETTY_FUNCTION__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch #expr); }STMT_END
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define return_if_fail(expr) STMT_START{ \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (!(expr)) \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch { \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch i_warning("file %s: line %d (%s): assertion `%s' failed.", \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __FILE__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __LINE__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __PRETTY_FUNCTION__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch #expr); \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch return; \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch }; }STMT_END
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define return_val_if_fail(expr,val) STMT_START{ \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (!(expr)) \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch { \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch i_warning("file %s: line %d (%s): assertion `%s' failed.", \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __FILE__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __LINE__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __PRETTY_FUNCTION__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch #expr); \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch return val; \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch }; }STMT_END
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#else /* !__GNUC__ */
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define i_assert(expr) STMT_START{ \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (!(expr)) \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch i_panic("file %s: line %d: assertion failed: (%s)", \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __FILE__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __LINE__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch #expr); }STMT_END
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define return_if_fail(expr) STMT_START{ \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (!(expr)) \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch { \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch i_warning("file %s: line %d: assertion `%s' failed.", \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __FILE__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __LINE__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch #expr); \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch return; \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch }; }STMT_END
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#define return_val_if_fail(expr, val) STMT_START{ \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch if (!(expr)) \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch { \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch i_warning("file %s: line %d: assertion `%s' failed.", \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __FILE__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch __LINE__, \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch #expr); \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch return val; \
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch }; }STMT_END
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#endif
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch#endif
2cbbe9b4829adb184c83dbf780316f4144559054Stephan Bosch