Fix build, mostly

This commit is contained in:
Jeremy Soller
2018-08-26 08:56:02 -06:00
parent c20ce5ffed
commit 277b9abcd5
38 changed files with 210 additions and 210 deletions
+3 -112
View File
@@ -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,