#ifndef H_ED_BITS_20030122152510
#define H_ED_BITS_20030122152510

#ifdef __cplusplus
extern "C"
{
#endif

/* ---------------------------------------------------------------------
   (c) ED 2002-2003
   Project      : CLIB
   Function     : Gestion des bits
   Module       : BITS
   File         : BITS.H
   Created      : 29-05-2002
   Modified     : 12-09-2003
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   Log

   0.0 29-05-2002 Creation
   1.0 29-05-2002 Remplace BIT8() par BIT_8()
   1.1 22-01-2003 Ajoute BIT_4()
   1.2 11-02-2003 Ajoute BIT_2()
   1.3 12-09-2003 Ajoute mVAL()

   --------------------------------------------------------------------- */

/* constants =========================================================== */
#define BITS_VER "1.3"
#define BITS_ID "BITS (c) ED 2003"

/* Attention : not portable if ulong is > 32-bit */
#define BITS_NB_MAX 32

/* Attention, type 'ulong' */
#define BIT(bit) (1UL<<(bit))

#define bit31 BIT(31)           /* 0x80000000UL */
#define bit30 BIT(30)           /* 0x40000000UL */
#define bit29 BIT(29)           /* 0x20000000UL */
#define bit28 BIT(28)           /* 0x10000000UL */
#define bit27 BIT(27)           /* 0x08000000UL */
#define bit26 BIT(26)           /* 0x04000000UL */
#define bit25 BIT(25)           /* 0x02000000UL */
#define bit24 BIT(24)           /* 0x01000000UL */
#define bit23 BIT(23)           /* 0x00800000UL */
#define bit22 BIT(22)           /* 0x00400000UL */
#define bit21 BIT(21)           /* 0x00200000UL */
#define bit20 BIT(20)           /* 0x00100000UL */
#define bit19 BIT(19)           /* 0x00080000UL */
#define bit18 BIT(18)           /* 0x00040000UL */
#define bit17 BIT(17)           /* 0x00020000UL */
#define bit16 BIT(16)           /* 0x00010000UL */

#ifndef bit0
#define bit15 BIT(15)           /* 0x00008000U  */
#define bit14 BIT(14)           /* 0x00004000   */
#define bit13 BIT(13)           /* 0x00002000   */
#define bit12 BIT(12)           /* 0x00001000   */
#define bit11 BIT(11)           /* 0x00000800   */
#define bit10 BIT(10)           /* 0x00000400   */
#define bit9  BIT(9 )           /* 0x00000200   */
#define bit8  BIT(8 )           /* 0x00000100   */
#define bit7  BIT(7 )           /* 0x00000080   */
#define bit6  BIT(6 )           /* 0x00000040   */
#define bit5  BIT(5 )           /* 0x00000020   */
#define bit4  BIT(4 )           /* 0x00000010   */
#define bit3  BIT(3 )           /* 0x00000008   */
#define bit2  BIT(2 )           /* 0x00000004   */
#define bit1  BIT(1 )           /* 0x00000002   */
#define bit0  BIT(0 )           /* 0x00000001   */
#endif

/* macros ============================================================== */

#define BITS_sid() (BITS_ID)
#define BITS_sver() ((char const *)BITS_VER)

#define BIT_2(a,b) \
   (((a)?bit1:0)   \
   |((b)?bit0:0))

#define BIT_4(a,b,c,d) \
   (((a)?bit3:0)       \
   |((b)?bit2:0)       \
   |((c)?bit1:0)       \
   |((d)?bit0:0))

#define BIT_8(a,b,c,d,e,f,g,h) \
   (((a)?bit7:0)               \
   |((b)?bit6:0)               \
   |((c)?bit5:0)               \
   |((d)?bit4:0)               \
   |((e)?bit3:0)               \
   |((f)?bit2:0)               \
   |((g)?bit1:0)               \
   |((h)?bit0:0))

/* mask set/clear/toggle */
#define mSET(d_, m_) ((d_) |=  (m_))
#define mCLR(d_, m_) ((d_) &= ~(m_))
#define mTGL(d_, m_) ((d_) ^=  (m_))

/* binary mask update */
#define mUPDATE(sts, byte, bit) \
               (sts) ? mSET((byte), (bit)) : mCLR((byte), (bit))

/* binary mask sts get */
#define mGET(d, m) \
   (!!((d) & (m)))

/* binary mask value get
   d ::= data
   w ::= width
   l ::= LSB
 */
#define mVAL(d, w, l)\
   (((d) >> (l)) & (((w) == BITS_NB_MAX) ? -1 : (BIT (w) - 1)))

#ifdef __cplusplus
}
#endif

#endif                          /* H_ED_BITS_20030122152510 */
/* GUARD (c) ED 2000-2002 Dec 16 2002 Ver. 1.4 */
