1// Take a look at the license at the top of the repository in the LICENSE file.
2
3#[cfg(feature = "user")]
4pub(crate) fn cstr_to_rust(c: *const libc::c_char) -> Option<String> {
5 cstr_to_rust_with_size(c, None)
6}
7
8#[cfg(any(feature = "disk", feature = "system", feature = "user"))]
9#[allow(dead_code)]
10pub(crate) fn cstr_to_rust_with_size(
11 c: *const libc::c_char,
12 size: Option<usize>,
13) -> Option<String> {
14 if c.is_null() {
15 return None;
16 }
17 let (mut s: Vec, max: isize) = match size {
18 Some(len: usize) => (Vec::with_capacity(len), len as isize),
19 None => (Vec::new(), isize::MAX),
20 };
21 let mut i: isize = 0;
22 unsafe {
23 loop {
24 let value: u8 = *c.offset(count:i) as u8;
25 if value == 0 {
26 break;
27 }
28 s.push(value);
29 i += 1;
30 if i >= max {
31 break;
32 }
33 }
34 String::from_utf8(vec:s).ok()
35 }
36}
37