]>
Commit | Line | Data |
---|---|---|
1b1a35ee XL |
1 | #![deny(unsafe_op_in_unsafe_fn)] |
2 | ||
60c5eb7d | 3 | use crate::ffi::{CStr, OsStr, OsString}; |
532ac7d7 | 4 | use crate::marker::PhantomData; |
60c5eb7d | 5 | use crate::os::wasi::ffi::OsStrExt; |
532ac7d7 XL |
6 | use crate::vec; |
7 | ||
60c5eb7d | 8 | pub unsafe fn init(_argc: isize, _argv: *const *const u8) {} |
e1599b0c | 9 | |
60c5eb7d | 10 | pub unsafe fn cleanup() {} |
532ac7d7 XL |
11 | |
12 | pub struct Args { | |
13 | iter: vec::IntoIter<OsString>, | |
14 | _dont_send_or_sync_me: PhantomData<*mut ()>, | |
15 | } | |
16 | ||
17 | /// Returns the command line arguments | |
18 | pub fn args() -> Args { | |
e1599b0c | 19 | Args { |
60c5eb7d XL |
20 | iter: maybe_args().unwrap_or(Vec::new()).into_iter(), |
21 | _dont_send_or_sync_me: PhantomData, | |
22 | } | |
23 | } | |
24 | ||
25 | fn maybe_args() -> Option<Vec<OsString>> { | |
26 | unsafe { | |
27 | let (argc, buf_size) = wasi::args_sizes_get().ok()?; | |
28 | let mut argv = Vec::with_capacity(argc); | |
29 | let mut buf = Vec::with_capacity(buf_size); | |
30 | wasi::args_get(argv.as_mut_ptr(), buf.as_mut_ptr()).ok()?; | |
31 | argv.set_len(argc); | |
32 | let mut ret = Vec::with_capacity(argc); | |
33 | for ptr in argv { | |
34 | let s = CStr::from_ptr(ptr.cast()); | |
35 | ret.push(OsStr::from_bytes(s.to_bytes()).to_owned()); | |
36 | } | |
37 | Some(ret) | |
532ac7d7 XL |
38 | } |
39 | } | |
40 | ||
41 | impl Args { | |
42 | pub fn inner_debug(&self) -> &[OsString] { | |
43 | self.iter.as_slice() | |
44 | } | |
45 | } | |
46 | ||
47 | impl Iterator for Args { | |
48 | type Item = OsString; | |
49 | fn next(&mut self) -> Option<OsString> { | |
50 | self.iter.next() | |
51 | } | |
52 | fn size_hint(&self) -> (usize, Option<usize>) { | |
53 | self.iter.size_hint() | |
54 | } | |
55 | } | |
56 | ||
57 | impl ExactSizeIterator for Args { | |
58 | fn len(&self) -> usize { | |
59 | self.iter.len() | |
60 | } | |
61 | } | |
62 | ||
63 | impl DoubleEndedIterator for Args { | |
64 | fn next_back(&mut self) -> Option<OsString> { | |
65 | self.iter.next_back() | |
66 | } | |
67 | } |