From 9e20c351d8c1131a070a7e833cbd08642f21acc1 Mon Sep 17 00:00:00 2001 From: Arnold Loubriat Date: Mon, 2 Sep 2024 21:45:45 +0200 Subject: [PATCH] Add `endian.h` --- src/header/endian/cbindgen.toml | 7 ++++ src/header/endian/mod.rs | 64 +++++++++++++++++++++++++++++++++ src/header/mod.rs | 1 + tests/Makefile | 1 + tests/endian.c | 46 ++++++++++++++++++++++++ tests/expected/endian.stderr | 0 tests/expected/endian.stdout | 0 7 files changed, 119 insertions(+) create mode 100644 src/header/endian/cbindgen.toml create mode 100644 src/header/endian/mod.rs create mode 100644 tests/endian.c create mode 100644 tests/expected/endian.stderr create mode 100644 tests/expected/endian.stdout diff --git a/src/header/endian/cbindgen.toml b/src/header/endian/cbindgen.toml new file mode 100644 index 0000000000..622cf7f13a --- /dev/null +++ b/src/header/endian/cbindgen.toml @@ -0,0 +1,7 @@ +sys_includes = ["stdint.h"] +include_guard = "_RELIBC_ENDIAN_H" +trailer = "#include " +language = "C" +style = "Tag" +no_includes = true +cpp_compat = true diff --git a/src/header/endian/mod.rs b/src/header/endian/mod.rs new file mode 100644 index 0000000000..7b39dd6b96 --- /dev/null +++ b/src/header/endian/mod.rs @@ -0,0 +1,64 @@ +//! endian.h implementation for Redox, following +//! https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/endian.h.html + +use crate::platform::types::*; + +#[no_mangle] +extern "C" fn be16toh(x: uint16_t) -> uint16_t { + uint16_t::from_be(x) +} + +#[no_mangle] +extern "C" fn be32toh(x: uint32_t) -> uint32_t { + uint32_t::from_be(x) +} + +#[no_mangle] +extern "C" fn be64toh(x: uint64_t) -> uint64_t { + uint64_t::from_be(x) +} + +#[no_mangle] +extern "C" fn htobe16(x: uint16_t) -> uint16_t { + x.to_be() +} + +#[no_mangle] +extern "C" fn htobe32(x: uint32_t) -> uint32_t { + x.to_be() +} + +#[no_mangle] +extern "C" fn htobe64(x: uint64_t) -> uint64_t { + x.to_be() +} + +#[no_mangle] +extern "C" fn htole16(x: uint16_t) -> uint16_t { + x.to_le() +} + +#[no_mangle] +extern "C" fn htole32(x: uint32_t) -> uint32_t { + x.to_le() +} + +#[no_mangle] +extern "C" fn htole64(x: uint64_t) -> uint64_t { + x.to_le() +} + +#[no_mangle] +extern "C" fn le16toh(x: uint16_t) -> uint16_t { + uint16_t::from_le(x) +} + +#[no_mangle] +extern "C" fn le32toh(x: uint32_t) -> uint32_t { + uint32_t::from_le(x) +} + +#[no_mangle] +extern "C" fn le64toh(x: uint64_t) -> uint64_t { + uint64_t::from_le(x) +} diff --git a/src/header/mod.rs b/src/header/mod.rs index c820e41a48..42b8d270f4 100644 --- a/src/header/mod.rs +++ b/src/header/mod.rs @@ -11,6 +11,7 @@ pub mod dirent; pub mod dl_tls; pub mod dlfcn; pub mod elf; +pub mod endian; pub mod errno; pub mod fcntl; pub mod float; diff --git a/tests/Makefile b/tests/Makefile index df8938f351..774a03e86a 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -14,6 +14,7 @@ EXPECT_NAMES=\ crypt/sha512 \ destructor \ dirent/scandir \ + endian \ errno \ error \ fcntl/create \ diff --git a/tests/endian.c b/tests/endian.c new file mode 100644 index 0000000000..271f106092 --- /dev/null +++ b/tests/endian.c @@ -0,0 +1,46 @@ +#include +#include +#include + +#include "test_helpers.h" + +int main() { + uint16_t zero_u16 = 0; + assert(be16toh(zero_u16) == zero_u16); + assert(htobe16(zero_u16) == zero_u16); + assert(htole16(zero_u16) == zero_u16); + assert(le16toh(zero_u16) == zero_u16); + + uint16_t value_be_u16 = 0x0123; + uint16_t value_le_u16 = 0x2301; + assert(be16toh(value_be_u16) == value_le_u16); + assert(htobe16(value_le_u16) == value_be_u16); + assert(htole16(value_le_u16) == value_le_u16); + assert(le16toh(value_le_u16) == value_le_u16); + + uint32_t zero_u32 = 0; + assert(be32toh(zero_u32) == zero_u32); + assert(htobe32(zero_u32) == zero_u32); + assert(htole32(zero_u32) == zero_u32); + assert(le32toh(zero_u32) == zero_u32); + + uint32_t value_be_u32 = 0x01234567; + uint32_t value_le_u32 = 0x67452301; + assert(be32toh(value_be_u32) == value_le_u32); + assert(htobe32(value_le_u32) == value_be_u32); + assert(htole32(value_le_u32) == value_le_u32); + assert(le32toh(value_le_u32) == value_le_u32); + + uint64_t zero_u64 = 0; + assert(be64toh(zero_u64) == zero_u64); + assert(htobe64(zero_u64) == zero_u64); + assert(htole64(zero_u64) == zero_u64); + assert(le64toh(zero_u64) == zero_u64); + + uint64_t value_be_u64 = 0x0123456789ABCDEF; + uint64_t value_le_u64 = 0xEFCDAB8967452301; + assert(be64toh(value_be_u64) == value_le_u64); + assert(htobe64(value_le_u64) == value_be_u64); + assert(htole64(value_le_u64) == value_le_u64); + assert(le64toh(value_le_u64) == value_le_u64); +} diff --git a/tests/expected/endian.stderr b/tests/expected/endian.stderr new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/expected/endian.stdout b/tests/expected/endian.stdout new file mode 100644 index 0000000000..e69de29bb2