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:
Christopher Haster
2025-01-05 00:11:02 -06:00
parent ab160d7feb
commit 1746819c7c
+22 -15
View File
@@ -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);
} }