diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2020-09-14 00:39:37 +0200 |
---|---|---|
committer | laforge <laforge@osmocom.org> | 2020-09-14 11:53:46 +0000 |
commit | f6db7653270f4c926cd64f2597f19fd657520ae8 (patch) | |
tree | 5bf1357d008f30a7b1e1e6520ea31a0fed179894 /include | |
parent | 6862cd38a59685d15f9940fcf3882607081e3261 (diff) |
bitXXgen: add osmo_loadXXbe_ext_2() to get right-adjusted values
As shown in the recently added bitgen_test.c, using osmo_loadXXbe_ext() with a
smaller n produces results aligned on the most significant bytes, which is
cumbersome, since it does not return a previously stored value. This problem
exists only for the big-endian functions, the little-endian osmo_loadXXle_ext()
properly return values adjusted on the least significant octets.
Add osmo_loadXXbe_ext_2() variants that properly right-adjust the returned
value. Prominently highlight this behavior in API doc. Test the new functions
in bitgen_test.c.
For example, this eases handling of 24bit integers (e.g. loaded from buffer to
uint32_t, and stored into buffer from uint32_t). Also explicitly show this 24
bit case in bitgen_test.c
Change-Id: I2806df6f0f7bf1ad705d52fa386d4525b892b928
Diffstat (limited to 'include')
-rw-r--r-- | include/osmocom/core/bitXXgen.h.tpl | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/include/osmocom/core/bitXXgen.h.tpl b/include/osmocom/core/bitXXgen.h.tpl index 7e0ecd7f..258fccb6 100644 --- a/include/osmocom/core/bitXXgen.h.tpl +++ b/include/osmocom/core/bitXXgen.h.tpl @@ -24,7 +24,7 @@ #include <osmocom/core/utils.h> -/*! load unaligned n-byte integer (little-endian encoding) into uintXX_t +/*! load unaligned n-byte integer (little-endian encoding) into uintXX_t, into the least significant octets. * \param[in] p Buffer where integer is stored * \param[in] n Number of bytes stored in p * \returns XX bit unsigned integer @@ -39,7 +39,9 @@ static inline uintXX_t osmo_loadXXle_ext(const void *p, uint8_t n) return r; } -/*! load unaligned n-byte integer (big-endian encoding) into uintXX_t +/*! load unaligned n-byte integer (big-endian encoding) into uintXX_t, into the MOST significant octets. + * WARNING: for n < sizeof(uintXX_t), the result is not returned in the least significant octets, as one might expect. + * To always return the same value as fed to osmo_storeXXbe_ext() before, use osmo_loadXXbe_ext_2(). * \param[in] p Buffer where integer is stored * \param[in] n Number of bytes stored in p * \returns XX bit unsigned integer @@ -54,6 +56,21 @@ static inline uintXX_t osmo_loadXXbe_ext(const void *p, uint8_t n) return r; } +/*! load unaligned n-byte integer (big-endian encoding) into uintXX_t, into the least significant octets. + * \param[in] p Buffer where integer is stored + * \param[in] n Number of bytes stored in p + * \returns XX bit unsigned integer + */ +static inline uintXX_t osmo_loadXXbe_ext_2(const void *p, uint8_t n) +{ + uint8_t i; + uintXX_t r = 0; + const uint8_t *q = (uint8_t *)p; + OSMO_ASSERT(n <= sizeof(r)); + for(i = 0; i < n; r |= ((uintXX_t)q[i] << (XX - 8* (1 + i + (sizeof(r) - n)))), i++); + return r; +} + /*! store unaligned n-byte integer (little-endian encoding) from uintXX_t * \param[in] x unsigned XX bit integer |