mirror of
https://github.com/systemd/systemd.git
synced 2024-10-28 11:55:44 +03:00
util-lib: add accessors for unaligned native endian words
This commit is contained in:
parent
c9d81ae858
commit
c917a32122
@ -109,3 +109,21 @@ static inline void unaligned_write_le64(void *_u, uint64_t a) {
|
||||
unaligned_write_le32(u, (uint32_t) a);
|
||||
unaligned_write_le32(u + 4, (uint32_t) (a >> 32));
|
||||
}
|
||||
|
||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||
#define unaligned_read_ne16 unaligned_read_be16
|
||||
#define unaligned_read_ne32 unaligned_read_be32
|
||||
#define unaligned_read_ne64 unaligned_read_be64
|
||||
|
||||
#define unaligned_write_ne16 unaligned_write_be16
|
||||
#define unaligned_write_ne32 unaligned_write_be32
|
||||
#define unaligned_write_ne64 unaligned_write_be64
|
||||
#else
|
||||
#define unaligned_read_ne16 unaligned_read_le16
|
||||
#define unaligned_read_ne32 unaligned_read_le32
|
||||
#define unaligned_read_ne64 unaligned_read_le64
|
||||
|
||||
#define unaligned_write_ne16 unaligned_write_le16
|
||||
#define unaligned_write_ne32 unaligned_write_le32
|
||||
#define unaligned_write_ne64 unaligned_write_le64
|
||||
#endif
|
||||
|
@ -159,7 +159,31 @@ static void test_le(void) {
|
||||
assert_se(memcmp(&scratch[7], &data[7], sizeof(uint64_t)) == 0);
|
||||
}
|
||||
|
||||
static void test_ne(void) {
|
||||
uint16_t x = 4711;
|
||||
uint32_t y = 123456;
|
||||
uint64_t z = 9876543210;
|
||||
|
||||
/* Note that we don't bother actually testing alignment issues in this function, after all the _ne() functions
|
||||
* are just aliases for the _le() or _be() implementations, which we test extensively above. Hence, in this
|
||||
* function, just ensure that they map to the right version on the local architecture. */
|
||||
|
||||
assert_se(unaligned_read_ne16(&x) == 4711);
|
||||
assert_se(unaligned_read_ne32(&y) == 123456);
|
||||
assert_se(unaligned_read_ne64(&z) == 9876543210);
|
||||
|
||||
unaligned_write_ne16(&x, 1);
|
||||
unaligned_write_ne32(&y, 2);
|
||||
unaligned_write_ne64(&z, 3);
|
||||
|
||||
assert_se(x == 1);
|
||||
assert_se(y == 2);
|
||||
assert_se(z == 3);
|
||||
}
|
||||
|
||||
int main(int argc, const char *argv[]) {
|
||||
test_be();
|
||||
test_le();
|
||||
test_ne();
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user