Added lfsr_compat_* for shared compat flag code
Well, renamed lfsr_rcompat_* really. But this avoids making rcompat
special and treats all rcompat/wcompat/ocompat logic as specializations
of the shared lfsr_compat_* logic.
No code changes:
code stack ctx
before: 38084 2608 752
after: 38084 (+0.0%) 2608 (+0.0%) 752 (+0.0%)
This commit is contained in:
@@ -13451,20 +13451,20 @@ static inline bool lfsr_ocompat_isincompat(lfsr_ocompat_t ocompat) {
|
|||||||
//
|
//
|
||||||
// little-endian, truncated bits must be assumed zero
|
// little-endian, truncated bits must be assumed zero
|
||||||
|
|
||||||
#define LFSR_DATA_RCOMPAT(_rcompat) \
|
#define LFSR_DATA_COMPAT(_compat) \
|
||||||
LFSR_DATA_BUF(((uint8_t[]){ \
|
LFSR_DATA_BUF(((uint8_t[]){ \
|
||||||
(((_rcompat) >> 0) & 0xff), \
|
(((_compat) >> 0) & 0xff), \
|
||||||
(((_rcompat) >> 8) & 0xff)}), 2)
|
(((_compat) >> 8) & 0xff)}), 2)
|
||||||
|
|
||||||
static int lfsr_data_readrcompat(lfs_t *lfs, lfsr_data_t *data,
|
static int lfsr_data_readcompat(lfs_t *lfs, lfsr_data_t *data,
|
||||||
lfsr_rcompat_t *rcompat) {
|
uint16_t *compat) {
|
||||||
// allow truncated rcompat flags
|
// allow truncated compat flags
|
||||||
uint8_t buf[2] = {0};
|
uint8_t buf[2] = {0};
|
||||||
lfs_ssize_t d = lfsr_data_read(lfs, data, buf, 2);
|
lfs_ssize_t d = lfsr_data_read(lfs, data, buf, 2);
|
||||||
if (d < 0) {
|
if (d < 0) {
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
*rcompat = lfs_fromle16_(buf);
|
*compat = lfs_fromle16_(buf);
|
||||||
|
|
||||||
// if any out-of-range flags are set, set the internal overflow bit,
|
// if any out-of-range flags are set, set the internal overflow bit,
|
||||||
// this is a compromise in correctness and and compat-flag complexity
|
// this is a compromise in correctness and and compat-flag complexity
|
||||||
@@ -13478,7 +13478,7 @@ static int lfsr_data_readrcompat(lfs_t *lfs, lfsr_data_t *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (b != 0x00) {
|
if (b != 0x00) {
|
||||||
*rcompat |= LFSR_RCOMPAT_OVERFLOW;
|
*compat |= 0x8000;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -13487,18 +13487,25 @@ static int lfsr_data_readrcompat(lfs_t *lfs, lfsr_data_t *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// all the compat parsing is basically the same, so try to reuse code
|
// all the compat parsing is basically the same, so try to reuse code
|
||||||
#define LFSR_DATA_WCOMPAT(_wcompat) LFSR_DATA_RCOMPAT(_wcompat)
|
#define LFSR_DATA_RCOMPAT(_rcompat) LFSR_DATA_COMPAT(_rcompat)
|
||||||
|
|
||||||
static int lfsr_data_readwcompat(lfs_t *lfs, lfsr_data_t *data,
|
static inline int lfsr_data_readrcompat(lfs_t *lfs, lfsr_data_t *data,
|
||||||
lfsr_wcompat_t *wcompat) {
|
lfsr_rcompat_t *rcompat) {
|
||||||
return lfsr_data_readrcompat(lfs, data, wcompat);
|
return lfsr_data_readcompat(lfs, data, rcompat);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define LFSR_DATA_OCOMPAT(_ocompat) LFSR_DATA_RCOMPAT(_ocompat)
|
#define LFSR_DATA_WCOMPAT(_wcompat) LFSR_DATA_COMPAT(_wcompat)
|
||||||
|
|
||||||
static int lfsr_data_readocompat(lfs_t *lfs, lfsr_data_t *data,
|
static inline int lfsr_data_readwcompat(lfs_t *lfs, lfsr_data_t *data,
|
||||||
|
lfsr_wcompat_t *wcompat) {
|
||||||
|
return lfsr_data_readcompat(lfs, data, wcompat);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LFSR_DATA_OCOMPAT(_ocompat) LFSR_DATA_COMPAT(_ocompat)
|
||||||
|
|
||||||
|
static inline int lfsr_data_readocompat(lfs_t *lfs, lfsr_data_t *data,
|
||||||
lfsr_ocompat_t *ocompat) {
|
lfsr_ocompat_t *ocompat) {
|
||||||
return lfsr_data_readrcompat(lfs, data, ocompat);
|
return lfsr_data_readcompat(lfs, data, ocompat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user