bash_plugin_rs/
lib.rs

1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4
5use std::ffi::CStr;
6include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
7
8#[repr(C)]
9pub struct builtin {
10    pub name: *const u8,
11    pub function: sh_builtin_func_t,
12    pub flags: ::std::os::raw::c_int,
13    pub long_doc: *const *const u8,
14    pub short_doc: *const u8,
15    pub handle: *const u8,
16}
17
18unsafe impl Sync for builtin {}
19
20/// # Safety
21/// All pointers in `word_list` must be valid for 'a.
22pub unsafe fn argv_list<'a>(mut word_list: *mut WORD_LIST) -> Vec<&'a CStr> {
23    let mut argv = Vec::<&CStr>::new();
24    while !word_list.is_null() {
25        argv.push({
26            assert_ne!(std::ptr::null_mut(), (*(*word_list).word).word);
27            CStr::from_ptr((*(*word_list).word).word)
28        });
29        word_list = (*word_list).next;
30    }
31    argv
32}
33
34#[test]
35fn bindgen_test_layout_builtin() {
36    assert_eq!(
37        ::std::mem::size_of::<builtin>(),
38        48usize,
39        concat!("Size of: ", stringify!(builtin))
40    );
41    assert_eq!(
42        ::std::mem::align_of::<builtin>(),
43        8usize,
44        concat!("Alignment of ", stringify!(builtin))
45    );
46    assert_eq!(
47        unsafe { &(*(::std::ptr::null::<builtin>())).name as *const _ as usize },
48        0usize,
49        concat!(
50            "Offset of field: ",
51            stringify!(builtin),
52            "::",
53            stringify!(name)
54        )
55    );
56    assert_eq!(
57        unsafe { &(*(::std::ptr::null::<builtin>())).function as *const _ as usize },
58        8usize,
59        concat!(
60            "Offset of field: ",
61            stringify!(builtin),
62            "::",
63            stringify!(function)
64        )
65    );
66    assert_eq!(
67        unsafe { &(*(::std::ptr::null::<builtin>())).flags as *const _ as usize },
68        16usize,
69        concat!(
70            "Offset of field: ",
71            stringify!(builtin),
72            "::",
73            stringify!(flags)
74        )
75    );
76    assert_eq!(
77        unsafe { &(*(::std::ptr::null::<builtin>())).long_doc as *const _ as usize },
78        24usize,
79        concat!(
80            "Offset of field: ",
81            stringify!(builtin),
82            "::",
83            stringify!(long_doc)
84        )
85    );
86    assert_eq!(
87        unsafe { &(*(::std::ptr::null::<builtin>())).short_doc as *const _ as usize },
88        32usize,
89        concat!(
90            "Offset of field: ",
91            stringify!(builtin),
92            "::",
93            stringify!(short_doc)
94        )
95    );
96    assert_eq!(
97        unsafe { &(*(::std::ptr::null::<builtin>())).handle as *const _ as usize },
98        40usize,
99        concat!(
100            "Offset of field: ",
101            stringify!(builtin),
102            "::",
103            stringify!(handle)
104        )
105    );
106}