diff --git a/include/bits/limits.h b/include/bits/limits.h deleted file mode 100644 index befcbec766..0000000000 --- a/include/bits/limits.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef _BITS_LIMIT_H -#define _BITS_LIMIT_H - -#define CHAR_BIT __CHAR_BIT__ -#ifdef __CHAR_MAX__ -# define CHAR_MAX __CHAR_MAX__ -#else -# define CHAR_MAX 0xFF -#endif -#define CHAR_MIN 0 -#define INT_MAX __INT_MAX__ -#define INT_MIN (-INT_MAX - 1) -#define LLONG_MAX __LONG_LONG_MAX__ -#define LLONG_MIN (-LLONG_MAX - 1) -#define LONG_BIT __LONG_WIDTH__ -#define LONG_MAX __LONG_MAX__ -#define LONG_MIN (-LONG_MAX - 1) -#define SCHAR_MAX __SCHAR_MAX__ -#define SCHAR_MIN (-SCHAR_MAX - 1) -#define SHRT_MAX __SHRT_MAX__ -#define SHRT_MIN (-SHRT_MAX - 1) - -// TODO: These might not be accurate on all platforms -#define SSIZE_MAX 0x7fffffffffffffff -#define UCHAR_MAX 255 -#define UINT_MAX 0xffffffff -#define ULLONG_MAX 0xffffffffffffffff -#define ULONG_MAX 0xffffffffffffffff -#define USHRT_MAX 0xffff -#define WORD_BIT 32 - -#endif diff --git a/src/header/limits/cbindgen.toml b/src/header/limits/cbindgen.toml index df8b0b0469..7c8ca370c6 100644 --- a/src/header/limits/cbindgen.toml +++ b/src/header/limits/cbindgen.toml @@ -1,6 +1,5 @@ sys_includes = [] include_guard = "_RELIBC_LIMITS_H" -trailer = "#include " language = "C" style = "Tag" no_includes = true diff --git a/src/header/limits/mod.rs b/src/header/limits/mod.rs index ae29aa6b84..295054b1f9 100644 --- a/src/header/limits/mod.rs +++ b/src/header/limits/mod.rs @@ -2,7 +2,10 @@ //! //! See . -use core::ffi::c_long; +use crate::platform::types::{ + c_char, c_int, c_long, c_longlong, c_schar, c_short, c_uchar, c_uint, c_ulong, c_ulonglong, + c_ushort, ssize_t, +}; pub const HOST_NAME_MAX: usize = 64; pub const NAME_MAX: usize = 255; @@ -10,6 +13,49 @@ pub const PASS_MAX: usize = 128; pub const PATH_MAX: usize = 4096; pub const NGROUPS_MAX: usize = 65536; +pub const CHAR_BIT: u32 = 8; +pub const WORD_BIT: u32 = 32; +#[cfg(target_pointer_width = "32")] +pub const LONG_BIT: u32 = 32; +#[cfg(target_pointer_width = "64")] +pub const LONG_BIT: u32 = 64; + +#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] +pub const CHAR_MAX: c_char = 0xFF; +#[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))] +pub const CHAR_MAX: c_char = 0x7F; +pub const SCHAR_MAX: c_schar = 0x7F; +pub const SHRT_MAX: c_short = 0x7FFF; +pub const INT_MAX: c_int = 0x7FFF_FFFF; +#[cfg(target_pointer_width = "32")] +pub const LONG_MAX: c_long = 0x7FFF_FFFF; +#[cfg(target_pointer_width = "64")] +pub const LONG_MAX: c_long = 0x7FFF_FFFF_FFFF_FFFF; +pub const LLONG_MAX: c_longlong = 0x7FFF_FFFF_FFFF_FFFF; +#[cfg(target_pointer_width = "32")] +pub const SSIZE_MAX: ssize_t = 0x7FFF_FFFF; +#[cfg(target_pointer_width = "64")] +pub const SSIZE_MAX: ssize_t = 0x7FFF_FFFF_FFFF_FFFF; +pub const UCHAR_MAX: c_uchar = 0xFF; +pub const USHRT_MAX: c_ushort = 0xFFFF; +pub const UINT_MAX: c_uint = 0xFFFFFFFF; + +#[cfg(target_pointer_width = "32")] +pub const ULONG_MAX: c_ulong = 0xFFFF_FFFF; +#[cfg(target_pointer_width = "64")] +pub const ULONG_MAX: c_ulong = 0xFFFF_FFFF_FFFF_FFFF; +pub const ULLONG_MAX: c_ulonglong = 0xFFFF_FFFF_FFFF_FFFF; + +#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] +pub const CHAR_MIN: c_char = 0; +#[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))] +pub const CHAR_MIN: c_char = -0x80; +pub const SCHAR_MIN: c_schar = -SCHAR_MAX - 1; +pub const SHRT_MIN: c_short = -SHRT_MAX - 1; +pub const INT_MIN: c_int = -INT_MAX - 1; +pub const LONG_MIN: c_long = -LONG_MAX - 1; +pub const LLONG_MIN: c_longlong = -LLONG_MAX - 1; + // TODO: 4096 for most architectures as determined by a quick grep of musl's source; need a better // way to determine it for other archs or to hard code a value. #[cfg(target_os = "linux")] diff --git a/tests/Makefile b/tests/Makefile index 03f45a822f..aac0bb437e 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -208,6 +208,7 @@ VARIED_NAMES=\ dirent/main \ dirent/posix_getdents \ kill-waitpid \ + limits \ net/if \ netdb/getaddrinfo \ netdb/getaddrinfo_null \ diff --git a/tests/limits.c b/tests/limits.c new file mode 100644 index 0000000000..d323a13867 --- /dev/null +++ b/tests/limits.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +int main() { + char c_max = CHAR_MAX; + char c_min = CHAR_MIN; + signed char sc_max = SCHAR_MAX; + signed char sc_min = SCHAR_MIN; + short s_max = SHRT_MAX; + short s_min = SHRT_MIN; + int i_max = INT_MAX; + int i_min = INT_MIN; + long l_max = LONG_MAX; + long l_min = LONG_MIN; + long long ll_max = LLONG_MAX; + long long ll_min = LLONG_MIN; + ssize_t ss_max = SSIZE_MAX; + unsigned char uc_max = UCHAR_MAX; + unsigned short us_max = USHRT_MAX; + unsigned int ui_max = UINT_MAX; + unsigned long ul_max = ULONG_MAX; + unsigned long long ull_max = ULLONG_MAX; + int long_bit = LONG_BIT; + int word_bit = WORD_BIT; + + printf("CHAR : [%d, %d]\n", c_min, c_max); + printf("SCHAR : [%d, %d]\n", sc_min, sc_max); + printf("SHRT : [%d, %d]\n", s_min, s_max); + printf("INT : [%d, %d]\n", i_min, i_max); + printf("LONG : [%ld, %ld]\n", l_min, l_max); + printf("LLONG : [%lld, %lld]\n", ll_min, ll_max); + printf("SSIZE_MAX : %zd\n\n", ss_max); + printf("UCHAR_MAX : %u\n", uc_max); + printf("USHRT_MAX : %u\n", us_max); + printf("UINT_MAX : %u\n", ui_max); + printf("ULONG_MAX : %lu\n", ul_max); + printf("ULLONG_MAX : %llu\n\n", ull_max); + printf("LONG_BIT : %d\n", long_bit); + printf("WORD_BIT : %d\n", word_bit); + + return 0; +}