enum {
RING_COUNT_MUL = 1,
RING_COUNT_MAX = 8,
RING_COUNT_MASK = RING_COUNT_MAX - 1),
VOLUME_MUL = RING_COUNT_MAX,
VOLUME_MAX = 8,
VOLUME_MASK = (VOLUME_MAX - 1) * VOLUME_MUL,
MELODY_MUL = VOLUME_MUL * VOLUME_MAX,
MELODY_MAX = 16,
MELODY_MASK = (MELODY_MAX - 1) * MELODY_MUL,
MIC_MUL = MELODY_MUL * MELODY_MAX,
MIC_MAX = 8,
MIC_MASK = (MIC_MAX - 1) * MIC_MUL
}; // дальше надоело
#define GET_VAL(field) GET_FIELD( Gsm_Audio, field##_MASK, field##_MUL)
#define SET_VAL(field,val) SET_FIELD( Gsm_Audio, field##_MASK, field##_MUL, val)
#define GET_FIELD(data,mask,mult) (((data) & (mask)) / mult)
#define SET_FIELD(data,mask,mult,val) ( ((data) & ~(mask)) | ((val) * (mult)) & (mask))
unsigned long Gsm_Audio;
unsigned long get_volume()
{
return GET_VAL(VOLUME);
}
void set_volume(unsigned long v)
{
return SET_VAL(VOLUME,v);
}
gcc -E foo.c -o foo.i
# 1 "foo.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "foo.c"
enum {
RING_COUNT_MUL = 1,
RING_COUNT_MAX = 8,
RING_COUNT_MASK = RING_COUNT_MAX - 1),
VOLUME_MUL = RING_COUNT_MAX,
VOLUME_MAX = 8,
VOLUME_MASK = (VOLUME_MAX - 1) * VOLUME_MUL,
MELODY_MUL = VOLUME_MUL * VOLUME_MAX,
MELODY_MAX = 16,
MELODY_MASK = (MELODY_MAX - 1) * MELODY_MUL,
MIC_MUL = MELODY_MUL * MELODY_MAX,
MIC_MAX = 8,
MIC_MASK = (MIC_MAX - 1) * MIC_MUL
};
# 28 "m.c"
unsigned long Gsm_Audio;
unsigned long get_volume()
{
return (((Gsm_Audio) & (VOLUME_MASK)) / VOLUME_MUL);
}
void set_volume(unsigned long v)
{
return ( ((Gsm_Audio) & ~(VOLUME_MASK)) | ((v) * (VOLUME_MUL)) & (VOLUME_MASK));
}