]> git.lizzy.rs Git - rust.git/blob - src/libstd/sys/wasi/args.rs
Make use of `ptr::null(_mut)` instead of casting zero
[rust.git] / src / libstd / sys / wasi / args.rs
1 use crate::ffi::CStr;
2 use crate::io;
3 use crate::sys::cvt_wasi;
4 use crate::ffi::OsString;
5 use crate::marker::PhantomData;
6 use crate::os::wasi::ffi::OsStringExt;
7 use crate::vec;
8
9 pub unsafe fn init(_argc: isize, _argv: *const *const u8) {
10 }
11
12 pub unsafe fn cleanup() {
13 }
14
15 pub struct Args {
16     iter: vec::IntoIter<OsString>,
17     _dont_send_or_sync_me: PhantomData<*mut ()>,
18 }
19
20 /// Returns the command line arguments
21 pub fn args() -> Args {
22     maybe_args().unwrap_or_else(|_| {
23         Args {
24             iter: Vec::new().into_iter(),
25             _dont_send_or_sync_me: PhantomData
26         }
27     })
28 }
29
30 fn maybe_args() -> io::Result<Args> {
31     unsafe {
32         let (mut argc, mut argv_buf_size) = (0, 0);
33         cvt_wasi(libc::__wasi_args_sizes_get(&mut argc, &mut argv_buf_size))?;
34
35         let mut argc = vec![core::ptr::null_mut::<libc::c_char>(); argc];
36         let mut argv_buf = vec![0; argv_buf_size];
37         cvt_wasi(libc::__wasi_args_get(argc.as_mut_ptr(), argv_buf.as_mut_ptr()))?;
38
39         let args = argc.into_iter()
40             .map(|ptr| CStr::from_ptr(ptr).to_bytes().to_vec())
41             .map(|bytes| OsString::from_vec(bytes))
42             .collect::<Vec<_>>();
43         Ok(Args {
44             iter: args.into_iter(),
45             _dont_send_or_sync_me: PhantomData,
46         })
47     }
48 }
49
50 impl Args {
51     pub fn inner_debug(&self) -> &[OsString] {
52         self.iter.as_slice()
53     }
54 }
55
56 impl Iterator for Args {
57     type Item = OsString;
58     fn next(&mut self) -> Option<OsString> {
59         self.iter.next()
60     }
61     fn size_hint(&self) -> (usize, Option<usize>) {
62         self.iter.size_hint()
63     }
64 }
65
66 impl ExactSizeIterator for Args {
67     fn len(&self) -> usize {
68         self.iter.len()
69     }
70 }
71
72 impl DoubleEndedIterator for Args {
73     fn next_back(&mut self) -> Option<OsString> {
74         self.iter.next_back()
75     }
76 }