diff --git a/src/byte_literal.rs b/src/byte_literal.rs new file mode 100644 index 0000000000..268549d08c --- /dev/null +++ b/src/byte_literal.rs @@ -0,0 +1,21 @@ +use crate::platform::types::c_char; + +pub struct ByteLiteral(u8); + +impl ByteLiteral { + pub fn cast_unchecked(input: u8) -> c_char { + match input { + b' '..=b'~' => { + #[cfg(any(target_arch = "x86_64", target_arch = "x86"))] + { + input.cast_signed() + } + #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] + { + input.cast_unsigned() + } + }, + _ => panic!("Not a printable ascii character!"), + } + } +} diff --git a/src/header/fmtmsg/mod.rs b/src/header/fmtmsg/mod.rs index 56e983e5c2..6021b0629d 100644 --- a/src/header/fmtmsg/mod.rs +++ b/src/header/fmtmsg/mod.rs @@ -6,6 +6,7 @@ //! See use crate::{ + byte_literal::ByteLiteral, header::{ fcntl::{O_WRONLY, open}, pthread::{PTHREAD_CANCEL_DISABLE, pthread_setcancelstate}, @@ -77,7 +78,7 @@ unsafe fn strcolcmp(mut lstr: *const c_char, mut bstr: *const c_char) -> c_int { lstr = lstr.add(1); bstr = bstr.add(1); } - if *lstr != 0 || (*bstr != 0 && *bstr != b':'.cast_signed()) { + if *lstr != 0 || (*bstr != 0 && *bstr != ByteLiteral::cast_unchecked(b':')) { 1 } else { 0 diff --git a/src/lib.rs b/src/lib.rs index 7b971e5362..d9fcffe841 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,6 +36,7 @@ extern crate syscall; #[macro_use] mod macros; +pub mod byte_literal; pub mod c_str; pub mod c_vec; pub mod cxa;