|
@@ -1,15 +1,16 @@
|
|
|
//! stdlib implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/stdlib.h.html
|
|
|
|
|
|
-use core::{iter, mem, ptr, slice, str};
|
|
|
+use core::{intrinsics, iter, mem, ptr, slice, str};
|
|
|
use rand::distributions::Alphanumeric;
|
|
|
use rand::prng::XorShiftRng;
|
|
|
use rand::rngs::JitterRng;
|
|
|
use rand::{Rng, SeedableRng};
|
|
|
|
|
|
-use header::{ctype, time, unistd, wchar};
|
|
|
+use header::{ctype, errno, time, unistd, wchar};
|
|
|
use header::errno::*;
|
|
|
use header::fcntl::*;
|
|
|
use header::string::*;
|
|
|
+use header::time::constants::CLOCK_MONOTONIC;
|
|
|
use header::wchar::*;
|
|
|
use platform;
|
|
|
use platform::{Pal, Sys};
|
|
@@ -58,8 +59,6 @@ pub unsafe extern "C" fn a64l(s: *const c_char) -> c_long {
|
|
|
|
|
|
#[no_mangle]
|
|
|
pub unsafe extern "C" fn abort() {
|
|
|
- use core::intrinsics;
|
|
|
-
|
|
|
intrinsics::abort();
|
|
|
}
|
|
|
|
|
@@ -173,8 +172,6 @@ pub unsafe extern "C" fn bsearch(
|
|
|
|
|
|
#[no_mangle]
|
|
|
pub unsafe extern "C" fn calloc(nelem: size_t, elsize: size_t) -> *mut c_void {
|
|
|
- use core::intrinsics;
|
|
|
-
|
|
|
let size = nelem * elsize;
|
|
|
let ptr = malloc(size);
|
|
|
if !ptr.is_null() {
|
|
@@ -453,8 +450,6 @@ pub extern "C" fn mktemp(name: *mut c_char) -> *mut c_char {
|
|
|
}
|
|
|
|
|
|
fn get_nstime() -> u64 {
|
|
|
- use core::mem;
|
|
|
- use time::constants::CLOCK_MONOTONIC;
|
|
|
let mut ts: timespec = unsafe { mem::uninitialized() };
|
|
|
Sys::clock_gettime(CLOCK_MONOTONIC, &mut ts);
|
|
|
ts.tv_nsec as u64
|
|
@@ -820,110 +815,6 @@ pub fn convert_integer(s: *const c_char, base: c_int) -> Option<(c_ulong, isize,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#[macro_export]
|
|
|
-macro_rules! strto_impl {
|
|
|
- (
|
|
|
- $rettype:ty, $signed:expr, $maxval:expr, $minval:expr, $s:ident, $endptr:ident, $base:ident
|
|
|
- ) => {{
|
|
|
- // ensure these are constants
|
|
|
- const CHECK_SIGN: bool = $signed;
|
|
|
- const MAX_VAL: $rettype = $maxval;
|
|
|
- const MIN_VAL: $rettype = $minval;
|
|
|
-
|
|
|
- let set_endptr = |idx: isize| {
|
|
|
- if !$endptr.is_null() {
|
|
|
- // This is stupid, but apparently strto* functions want
|
|
|
- // const input but mut output, yet the man page says
|
|
|
- // "stores the address of the first invalid character in *endptr"
|
|
|
- // so obviously it doesn't want us to clone it.
|
|
|
- *$endptr = $s.offset(idx) as *mut _;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- let invalid_input = || {
|
|
|
- platform::errno = EINVAL;
|
|
|
- set_endptr(0);
|
|
|
- };
|
|
|
-
|
|
|
- // only valid bases are 2 through 36
|
|
|
- if $base != 0 && ($base < 2 || $base > 36) {
|
|
|
- invalid_input();
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- let mut idx = 0;
|
|
|
-
|
|
|
- // skip any whitespace at the beginning of the string
|
|
|
- while ctype::isspace(*$s.offset(idx) as c_int) != 0 {
|
|
|
- idx += 1;
|
|
|
- }
|
|
|
-
|
|
|
- // check for +/-
|
|
|
- let positive = match is_positive(*$s.offset(idx)) {
|
|
|
- Some((pos, i)) => {
|
|
|
- idx += i;
|
|
|
- pos
|
|
|
- }
|
|
|
- None => {
|
|
|
- invalid_input();
|
|
|
- return 0;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- // convert the string to a number
|
|
|
- let num_str = $s.offset(idx);
|
|
|
- let res = match $base {
|
|
|
- 0 => detect_base(num_str)
|
|
|
- .and_then(|($base, i)| convert_integer(num_str.offset(i), $base)),
|
|
|
- 8 => convert_octal(num_str),
|
|
|
- 16 => convert_hex(num_str),
|
|
|
- _ => convert_integer(num_str, $base),
|
|
|
- };
|
|
|
-
|
|
|
- // check for error parsing octal/hex prefix
|
|
|
- // also check to ensure a number was indeed parsed
|
|
|
- let (num, i, overflow) = match res {
|
|
|
- Some(res) => res,
|
|
|
- None => {
|
|
|
- invalid_input();
|
|
|
- return 0;
|
|
|
- }
|
|
|
- };
|
|
|
- idx += i;
|
|
|
-
|
|
|
- let overflow = if CHECK_SIGN {
|
|
|
- overflow || (num as c_long).is_negative()
|
|
|
- } else {
|
|
|
- overflow
|
|
|
- };
|
|
|
- // account for the sign
|
|
|
- let num = num as $rettype;
|
|
|
- let num = if overflow {
|
|
|
- platform::errno = ERANGE;
|
|
|
- if CHECK_SIGN {
|
|
|
- if positive {
|
|
|
- MAX_VAL
|
|
|
- } else {
|
|
|
- MIN_VAL
|
|
|
- }
|
|
|
- } else {
|
|
|
- MAX_VAL
|
|
|
- }
|
|
|
- } else {
|
|
|
- if positive {
|
|
|
- num
|
|
|
- } else {
|
|
|
- // not using -num to keep the compiler happy
|
|
|
- num.overflowing_neg().0
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- set_endptr(idx);
|
|
|
-
|
|
|
- num
|
|
|
- }};
|
|
|
-}
|
|
|
-
|
|
|
#[no_mangle]
|
|
|
pub unsafe extern "C" fn strtoul(
|
|
|
s: *const c_char,
|