diff --git a/src/byte_literal.rs b/src/byte_literal.rs index 4d893e6f8d..7807255094 100644 --- a/src/byte_literal.rs +++ b/src/byte_literal.rs @@ -1,9 +1,9 @@ use crate::platform::types::c_char; -pub struct ByteLiteral(u8); +pub struct ByteLiteral; impl ByteLiteral { - pub fn cast_unchecked(input: u8) -> c_char { + pub const fn cast_unchecked(input: u8) -> c_char { match input { b' '..=b'~' => { #[cfg(any(target_arch = "x86_64", target_arch = "x86"))] diff --git a/src/header/getopt/mod.rs b/src/header/getopt/mod.rs index bf003e4191..0630510a02 100644 --- a/src/header/getopt/mod.rs +++ b/src/header/getopt/mod.rs @@ -3,6 +3,7 @@ //! Non-POSIX, see . use crate::{ + byte_literal::ByteLiteral, header::{ stdio, string, unistd::{optarg, opterr, optind, optopt}, @@ -61,7 +62,7 @@ pub unsafe extern "C" fn getopt_long( let current_arg = unsafe { *argv.offset(optind as isize) }; if unsafe { current_arg.is_null() - || *current_arg != b'-'.cast_signed() + || *current_arg != ByteLiteral::cast_unchecked(b'-') || *current_arg.offset(1) == 0 } { -1 @@ -74,7 +75,9 @@ pub unsafe extern "C" fn getopt_long( // remove the '-' let current_arg = unsafe { current_arg.offset(1) }; - if unsafe { *current_arg == b'-'.cast_signed() } && !longopts.is_null() { + if unsafe { *current_arg == ByteLiteral::cast_unchecked(b'-') } + && !longopts.is_null() + { let current_arg = unsafe { current_arg.offset(1) }; // is a long option for i in 0.. { @@ -86,7 +89,7 @@ pub unsafe extern "C" fn getopt_long( let mut end = 0; while { let c = unsafe { *current_arg.offset(end) }; - c != 0 && c != b'='.cast_signed() + c != 0 && c != ByteLiteral::cast_unchecked(b'=') } { end += 1; } @@ -101,18 +104,20 @@ pub unsafe extern "C" fn getopt_long( if opt.has_arg == optional_argument { unsafe { - if *current_arg.offset(end) == b'='.cast_signed() { + if *current_arg.offset(end) == ByteLiteral::cast_unchecked(b'=') + { optarg = current_arg.offset(end + 1); } } } else if opt.has_arg == required_argument { unsafe { - if *current_arg.offset(end) == b'='.cast_signed() { + if *current_arg.offset(end) == ByteLiteral::cast_unchecked(b'=') + { optarg = current_arg.offset(end + 1); } else if optind < argc { optarg = *argv.offset(optind as isize); optind += 1; - } else if *optstring == b':'.cast_signed() { + } else if *optstring == ByteLiteral::cast_unchecked(b':') { return c_int::from(b':'); } else { stdio::fputs((*argv).cast_const(), &raw mut *stdio::stderr); @@ -183,7 +188,7 @@ unsafe fn parse_arg( CURRENT_OPT = ptr::null_mut(); optopt = c_int::from(*current_arg); - let errch = if *optstring == b':'.cast_signed() { + let errch = if *optstring == ByteLiteral::cast_unchecked(b':') { b':' } else { if opterr != 0 { @@ -231,7 +236,8 @@ unsafe fn find_option(ch: c_char, optstring: *const c_char) -> Option. -use crate::platform::types::c_char; - -use crate::header::string::strlen; +use crate::{byte_literal::ByteLiteral, header::string::strlen, platform::types::c_char}; /// See . #[unsafe(no_mangle)] @@ -13,14 +11,14 @@ pub unsafe extern "C" fn basename(str: *mut c_char) -> *mut c_char { return c".".as_ptr().cast_mut(); } let mut end = unsafe { strlen(str) as isize - 1 }; - while end >= 0 && unsafe { *str.offset(end) == b'/'.cast_signed() } { + while end >= 0 && unsafe { *str.offset(end) == ByteLiteral::cast_unchecked(b'/') } { end -= 1; } if end == -1 { return c"/".as_ptr().cast_mut(); } let mut begin = end; - while begin >= 0 && unsafe { *str.offset(begin) != b'/'.cast_signed() } { + while begin >= 0 && unsafe { *str.offset(begin) != ByteLiteral::cast_unchecked(b'/') } { begin -= 1; } unsafe { @@ -36,13 +34,13 @@ pub unsafe extern "C" fn dirname(str: *mut c_char) -> *mut c_char { return c".".as_ptr().cast_mut(); } let mut end = unsafe { strlen(str) as isize - 1 }; - while end > 0 && unsafe { *str.offset(end) == b'/'.cast_signed() } { + while end > 0 && unsafe { *str.offset(end) == ByteLiteral::cast_unchecked(b'/') } { end -= 1; } - while end >= 0 && unsafe { *str.offset(end) != b'/'.cast_signed() } { + while end >= 0 && unsafe { *str.offset(end) != ByteLiteral::cast_unchecked(b'/') } { end -= 1; } - while end > 0 && unsafe { *str.offset(end) == b'/'.cast_signed() } { + while end > 0 && unsafe { *str.offset(end) == ByteLiteral::cast_unchecked(b'/') } { end -= 1; } if end == -1 { diff --git a/src/header/locale/mod.rs b/src/header/locale/mod.rs index b6dd7aa33f..fcb751e0aa 100644 --- a/src/header/locale/mod.rs +++ b/src/header/locale/mod.rs @@ -6,6 +6,7 @@ use alloc::{boxed::Box, ffi::CString, string::String}; use core::{ptr, str::FromStr}; use crate::{ + byte_literal::ByteLiteral, c_str::CStr, error::{Errno, ResultExtPtrMut}, fs::File, @@ -15,7 +16,7 @@ use crate::{ }; // Can't use &str because of the mutability -static mut C_LOCALE: [c_char; 2] = [b'C'.cast_signed(), 0]; +static mut C_LOCALE: [c_char; 2] = [ByteLiteral::cast_unchecked(b'C'), 0]; mod constants; use constants::*; diff --git a/src/header/stdio/mod.rs b/src/header/stdio/mod.rs index 11e18a428b..e0bee9995e 100644 --- a/src/header/stdio/mod.rs +++ b/src/header/stdio/mod.rs @@ -17,6 +17,7 @@ use core::{ }; use crate::{ + byte_literal::ByteLiteral, c_str::{CStr, Thin}, c_vec::CVec, error::{ResultExt, ResultExtPtrMut}, @@ -553,9 +554,9 @@ pub unsafe extern "C" fn flockfile(file: *mut FILE) { #[unsafe(no_mangle)] pub unsafe extern "C" fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE { let initial_mode = unsafe { *mode }; - if initial_mode != b'r'.cast_signed() - && initial_mode != b'w'.cast_signed() - && initial_mode != b'a'.cast_signed() + if initial_mode != ByteLiteral::cast_unchecked(b'r') + && initial_mode != ByteLiteral::cast_unchecked(b'w') + && initial_mode != ByteLiteral::cast_unchecked(b'a') { platform::ERRNO.set(errno::EINVAL); return ptr::null_mut(); @@ -1291,7 +1292,7 @@ pub unsafe extern "C" fn tempnam(dir: *const c_char, pfx: *const c_char) -> *mut if !out_buf.is_null() { // copy the directory name and prefix into the allocated buffer unsafe { out_buf.copy_from_nonoverlapping(dirname, dirname_len) }; - unsafe { *out_buf.add(dirname_len) = b'/'.cast_signed() }; + unsafe { *out_buf.add(dirname_len) = ByteLiteral::cast_unchecked(b'/') }; unsafe { out_buf .add(dirname_len + 1) @@ -1350,7 +1351,7 @@ pub unsafe extern "C" fn tmpnam(s: *mut c_char) -> *mut c_char { s }; - unsafe { *buf = b'/'.cast_signed() }; + unsafe { *buf = ByteLiteral::cast_unchecked(b'/') }; unsafe { #[allow(deprecated)] tmpnam_inner(buf, 1) diff --git a/src/header/stdlib/mod.rs b/src/header/stdlib/mod.rs index ee7a3c1026..02bee148bc 100644 --- a/src/header/stdlib/mod.rs +++ b/src/header/stdlib/mod.rs @@ -11,6 +11,7 @@ use rand_jitter::JitterRng; use rand_xorshift::XorShiftRng; use crate::{ + byte_literal::ByteLiteral, c_str::CStr, error::{Errno, ResultExt}, fs::File, @@ -421,13 +422,14 @@ unsafe fn find_env(search: *const c_char) -> Option<(usize, *mut c_char)> { for (i, mut item) in platform::environ_iter().enumerate() { let mut search = search; loop { - let end_of_query = unsafe { *search } == 0 || unsafe { *search } == b'='.cast_signed(); + let end_of_query = + unsafe { *search } == 0 || unsafe { *search } == ByteLiteral::cast_unchecked(b'='); if unsafe { *item } == 0 { //TODO: environ has an item without value, is this a problem? break; } - if unsafe { *item } == b'='.cast_signed() || end_of_query { - if unsafe { *item } == b'='.cast_signed() && end_of_query { + if unsafe { *item } == ByteLiteral::cast_unchecked(b'=') || end_of_query { + if unsafe { *item } == ByteLiteral::cast_unchecked(b'=') && end_of_query { // Both keys env here return Some((i, unsafe { item.add(1) })); } else { @@ -475,7 +477,7 @@ pub unsafe extern "C" fn getsubopt( let mut found_comma = false; while unsafe { *cursor } != 0 { - if unsafe { *cursor } == b','.cast_signed() { + if unsafe { *cursor } == ByteLiteral::cast_unchecked(b',') { unsafe { *cursor = 0 }; unsafe { *optionp = cursor.add(1) }; found_comma = true; @@ -496,7 +498,7 @@ pub unsafe extern "C" fn getsubopt( if unsafe { strncmp(start, token, token_len) } == 0 { let suffix_char = unsafe { *start.add(token_len) }; - if suffix_char == b'='.cast_signed() { + if suffix_char == ByteLiteral::cast_unchecked(b'=') { unsafe { *valuep = start.add(token_len + 1) }; return i as c_int; } else if suffix_char == 0 { @@ -754,7 +756,7 @@ where } for i in (len - suffix_len - 6)..(len - suffix_len) { - if unsafe { *name.offset(i as isize) } != b'X'.cast_signed() { + if unsafe { *name.offset(i as isize) } != ByteLiteral::cast_unchecked(b'X') { platform::ERRNO.set(errno::EINVAL); return None; } @@ -1258,7 +1260,7 @@ unsafe fn copy_kv( value_len: usize, ) { unsafe { core::ptr::copy_nonoverlapping(key, existing, key_len) }; - unsafe { core::ptr::write(existing.add(key_len), b'='.cast_signed()) }; + unsafe { core::ptr::write(existing.add(key_len), ByteLiteral::cast_unchecked(b'=')) }; unsafe { core::ptr::copy_nonoverlapping(value, existing.add(key_len + 1), value_len) }; unsafe { core::ptr::write(existing.add(key_len + 1 + value_len), 0) }; } @@ -1365,8 +1367,8 @@ pub unsafe extern "C" fn srandom(seed: c_uint) { pub fn is_positive(ch: c_char) -> Option<(bool, isize)> { match ch { 0 => None, - ch if ch == b'+'.cast_signed() => Some((true, 1)), - ch if ch == b'-'.cast_signed() => Some((false, 1)), + ch if ch == ByteLiteral::cast_unchecked(b'+') => Some((true, 1)), + ch if ch == ByteLiteral::cast_unchecked(b'-') => Some((false, 1)), _ => Some((true, 0)), } } @@ -1391,7 +1393,7 @@ pub unsafe fn detect_base(s: *const c_char) -> Option<(c_int, isize)> { } pub unsafe fn convert_octal(s: *const c_char) -> Option<(c_ulong, isize, bool)> { - if unsafe { *s } != 0 && unsafe { *s } == b'0'.cast_signed() { + if unsafe { *s } != 0 && unsafe { *s } == ByteLiteral::cast_unchecked(b'0') { if let Some((val, idx, overflow)) = unsafe { convert_integer(s.offset(1), 8) } { Some((val, idx + 1, overflow)) } else { @@ -1404,10 +1406,10 @@ pub unsafe fn convert_octal(s: *const c_char) -> Option<(c_ulong, isize, bool)> } pub unsafe fn convert_hex(s: *const c_char) -> Option<(c_ulong, isize, bool)> { - if (unsafe { *s } != 0 && unsafe { *s } == b'0'.cast_signed()) + if (unsafe { *s } != 0 && unsafe { *s } == ByteLiteral::cast_unchecked(b'0')) && (unsafe { *s.offset(1) } != 0 - && (unsafe { *s.offset(1) } == b'x'.cast_signed() - || unsafe { *s.offset(1) } == b'X'.cast_signed())) + && (unsafe { *s.offset(1) } == ByteLiteral::cast_unchecked(b'x') + || unsafe { *s.offset(1) } == ByteLiteral::cast_unchecked(b'X'))) { unsafe { convert_integer(s.offset(2), 16) } .map(|(val, idx, overflow)| (val, idx + 2, overflow))