Merge branch 'endian' into 'master'
Add `endian.h` See merge request redox-os/relibc!497
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
sys_includes = ["stdint.h"]
|
||||
include_guard = "_RELIBC_ENDIAN_H"
|
||||
trailer = "#include <machine/endian.h>"
|
||||
language = "C"
|
||||
style = "Tag"
|
||||
no_includes = true
|
||||
cpp_compat = true
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -14,6 +14,7 @@ EXPECT_NAMES=\
|
||||
crypt/sha512 \
|
||||
destructor \
|
||||
dirent/scandir \
|
||||
endian \
|
||||
errno \
|
||||
error \
|
||||
fcntl/create \
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
#include <assert.h>
|
||||
#include <endian.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user