Skip to content
Snippets Groups Projects
Commit b93982cc authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Add/use BITFIELD macros for defining/using multi-bit bit-fields

parent f9ad15e8
No related branches found
No related tags found
No related merge requests found
Pipeline #7417 passed
......@@ -368,18 +368,16 @@ typedef struct { /* Time with time-zone */
} when_t;
// We encode Month/Day/Hour/Min/Sec into 26 bits:
#define SMB_DATE_MK_MASK(width, shift) (((1 << (width)) - 1) << shift)
#define SMB_DATE_MON_SHIFT 22
#define SMB_DATE_MON_MASK SMB_DATE_MK_MASK(4, SMB_DATE_MON_SHIFT)
#define SMB_DATE_DAY_SHIFT 17
#define SMB_DATE_DAY_MASK SMB_DATE_MK_MASK(5, SMB_DATE_DAY_SHIFT)
#define SMB_DATE_HR_SHIFT 12
#define SMB_DATE_HR_MASK SMB_DATE_MK_MASK(5, SMB_DATE_HR_SHIFT)
#define SMB_DATE_MIN_SHIFT 6
#define SMB_DATE_MIN_MASK SMB_DATE_MK_MASK(6, SMB_DATE_MIN_SHIFT)
#define SMB_DATE_SEC_SHIFT 0
#define SMB_DATE_SEC_MASK SMB_DATE_MK_MASK(6, SMB_DATE_SEC_SHIFT)
#define SMB_DATE_MASK (SMB_DATE_MON_MASK | SMB_DATE_DAY_MASK | SMB_DATE_HR_MASK | SMB_DATE_MIN_MASK | SMB_DATE_SEC_MASK)
#define SMB_DATE_MON_BITWIDTH 4
#define SMB_DATE_MON_BITPOS 22
#define SMB_DATE_DAY_BITWIDTH 5
#define SMB_DATE_DAY_BITPOS 17
#define SMB_DATE_HR_BITWIDTH 5
#define SMB_DATE_HR_BITPOS 12
#define SMB_DATE_MIN_BITWIDTH 6
#define SMB_DATE_MIN_BITPOS 6
#define SMB_DATE_SEC_BITWIDTH 6
#define SMB_DATE_SEC_BITPOS 0
typedef uint16_t smb_msg_attr_t;
......
......@@ -2118,6 +2118,13 @@ int smb_tzutc(int16_t zone)
return(tz);
}
#define SMB_DATE_MASK (\
BITFIELD_MASK(SMB_DATE_MON_BITWIDTH, SMB_DATE_MON_BITPOS) | \
BITFIELD_MASK(SMB_DATE_DAY_BITWIDTH, SMB_DATE_DAY_BITPOS) | \
BITFIELD_MASK(SMB_DATE_HR_BITWIDTH, SMB_DATE_HR_BITPOS) | \
BITFIELD_MASK(SMB_DATE_MIN_BITWIDTH, SMB_DATE_MIN_BITPOS) | \
BITFIELD_MASK(SMB_DATE_SEC_BITWIDTH, SMB_DATE_SEC_BITPOS))
/****************************************************************************/
/* Decode the 2 possible encoding of when_t (when_written) */
/****************************************************************************/
......@@ -2129,11 +2136,11 @@ time_t smb_time(when_t when)
return when.time;
tm.tm_year = when.year;
tm.tm_mon = (when.time & SMB_DATE_MON_MASK) >> SMB_DATE_MON_SHIFT;
tm.tm_mday = (when.time & SMB_DATE_DAY_MASK) >> SMB_DATE_DAY_SHIFT;
tm.tm_hour = (when.time & SMB_DATE_HR_MASK) >> SMB_DATE_HR_SHIFT;
tm.tm_min = (when.time & SMB_DATE_MIN_MASK) >> SMB_DATE_MIN_SHIFT;
tm.tm_sec = (when.time & SMB_DATE_SEC_MASK) >> SMB_DATE_SEC_SHIFT;
tm.tm_mon = BITFIELD_DECODE(when.time, SMB_DATE_MON_BITWIDTH, SMB_DATE_MON_BITPOS);
tm.tm_mday = BITFIELD_DECODE(when.time, SMB_DATE_DAY_BITWIDTH, SMB_DATE_DAY_BITPOS);
tm.tm_hour = BITFIELD_DECODE(when.time, SMB_DATE_HR_BITWIDTH, SMB_DATE_HR_BITPOS);
tm.tm_min = BITFIELD_DECODE(when.time, SMB_DATE_MIN_BITWIDTH, SMB_DATE_MIN_BITPOS);
tm.tm_sec = BITFIELD_DECODE(when.time, SMB_DATE_SEC_BITWIDTH, SMB_DATE_SEC_BITPOS);
return sane_mktime(&tm);
}
......@@ -2148,11 +2155,11 @@ when_t smb_when(time_t t, int16_t zone)
localtime_r(&t, &tm);
when.year = 1900 + tm.tm_year;
when.time = (tm.tm_mon + 1) << SMB_DATE_MON_SHIFT;
when.time |= tm.tm_mday << SMB_DATE_DAY_SHIFT;
when.time |= tm.tm_hour << SMB_DATE_HR_SHIFT;
when.time |= tm.tm_min << SMB_DATE_MIN_SHIFT;
when.time |= tm.tm_sec << SMB_DATE_SEC_SHIFT;
when.time = BITFIELD_ENCODE(tm.tm_mon + 1, SMB_DATE_MON_BITWIDTH, SMB_DATE_MON_BITPOS);
when.time |= BITFIELD_ENCODE(tm.tm_mday, SMB_DATE_DAY_BITWIDTH, SMB_DATE_DAY_BITPOS);
when.time |= BITFIELD_ENCODE(tm.tm_hour, SMB_DATE_HR_BITWIDTH, SMB_DATE_HR_BITPOS);
when.time |= BITFIELD_ENCODE(tm.tm_min, SMB_DATE_MIN_BITWIDTH, SMB_DATE_MIN_BITPOS);
when.time |= BITFIELD_ENCODE(tm.tm_sec, SMB_DATE_SEC_BITWIDTH, SMB_DATE_SEC_BITPOS);
when.zone = zone;
return when;
......
......@@ -402,6 +402,12 @@ typedef struct {
/* Handy Integer Macros */
/************************/
/* Multi-bit bit-fields with "defined behavior" */
#define BITFIELD_MAX(width) ((1 << (width)) - 1)
#define BITFIELD_MASK(width, pos) (BITFIELD_MAX(width) << (pos))
#define BITFIELD_ENCODE(val, width, pos) (((val) & BITFIELD_MAX(width)) << (pos))
#define BITFIELD_DECODE(val, width, pos) (((val) & BITFIELD_MASK(width, pos)) >> (pos))
/* Data Block Length Alignment Macro (returns required padding length for proper alignment) */
#define PAD_LENGTH_FOR_ALIGNMENT(len,blk) (((len)%(blk))==0 ? 0 : (blk)-((len)%(blk)))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment