apply ByteLiteral abstraction
This commit is contained in:
+2
-2
@@ -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"))]
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
//! Non-POSIX, see <https://www.man7.org/linux/man-pages/man3/getopt.3.html>.
|
||||
|
||||
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<GetoptOpti
|
||||
|
||||
while unsafe { *optstring.offset(i) != 0 } {
|
||||
if unsafe { *optstring.offset(i) == ch } {
|
||||
let result = if unsafe { *optstring.offset(i + 1) == b':'.cast_signed() } {
|
||||
let result = if unsafe { *optstring.offset(i + 1) == ByteLiteral::cast_unchecked(b':') }
|
||||
{
|
||||
GetoptOption::OptArg
|
||||
} else {
|
||||
GetoptOption::Flag
|
||||
|
||||
@@ -2,9 +2,7 @@
|
||||
//!
|
||||
//! See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/libgen.h.html>.
|
||||
|
||||
use crate::platform::types::c_char;
|
||||
|
||||
use crate::header::string::strlen;
|
||||
use crate::{byte_literal::ByteLiteral, header::string::strlen, platform::types::c_char};
|
||||
|
||||
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/basename.html>.
|
||||
#[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 {
|
||||
|
||||
@@ -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::*;
|
||||
|
||||
@@ -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)
|
||||
|
||||
+15
-13
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user