home *** CD-ROM | disk | FTP | other *** search
- /*
- * MACROS.H commonly useful macros
- */
-
- #ifndef _MACROS_H
- #define _MACROS_H
-
- #ifdef __GNUC__
- /* with GNUC we will use safe versions, these may look like that they
- * have overhead, but they do not -- trust me!
- */
-
- /* absolute value for any type of number */
- #define abs(a) \
- ({typedef _ta = (a); \
- _ta _a = (a); \
- _a < ((_ta)0) ? -(_a) : _a; })
-
- /* maximum and minumum for any type of number */
- #define max(a,b) \
- ({typedef _ta = (a), _tb = (b); \
- _ta _a = (a); _tb _b = (b); \
- _a > _b ? _a : _b; })
- #define min(a,b) \
- ({typedef _ta = (a), _tb = (b); \
- _ta _a = (a); _tb _b = (b); \
- _a < _b ? _a : _b; })
-
- /* swap any objects (even identically typed structs!) */
- /* WARNING: not safe */
- #define swap(a,b) \
- ({typedef _ta = (a); \
- _ta _t; \
- _t = (a); (a) = (b); (b) = _t; })
-
- #else /* be careful !! */
-
- /* absolute value for any type of number */
- #define abs(x) ((x)<0?(-(x)):(x))
-
- /* maximum and minumum for any type of number */
- #define max(x,y) (((x)>(y))?(x):(y))
- #define min(x,y) (((x)<(y))?(x):(y))
-
- /* swap any objects which can be XORed */
- #define swap(a,b) ((a)=(a)^((b)=(b)^((a)=(a)^(b))))
-
- #endif /* __GNUC__ */
-
- /* lo and hi byte of a word */
- #define lobyte(x) (((unsigned char *)&(x))[1])
- #define hibyte(x) (((unsigned char *)&(x))[0])
-
- /* lo and hi word of a long */
- #define loword(x) (((unsigned short *)&(x))[1])
- #define hiword(x) (((unsigned short *)&(x))[0])
-
- #endif /* _MACROS_H */
-