Skip to main content

ring_lang_rs/
macros.rs

1#[macro_export]
2macro_rules! ring_func {
3    ($name:ident, $body:expr) => {
4        #[unsafe(no_mangle)]
5        pub extern "C" fn $name(p: *mut ::std::ffi::c_void) {
6            $body(p)
7        }
8    };
9}
10
11#[macro_export]
12macro_rules! ring_libinit {
13    ($($name:expr => $func:ident),* $(,)?) => {
14        #[unsafe(no_mangle)]
15        pub extern "C" fn ringlib_init(state: $crate::RingState) {
16            $(
17                $crate::ring_register_function(state, $name, $func);
18            )*
19        }
20    };
21}
22
23#[macro_export]
24macro_rules! ring_check_paracount {
25    ($p:expr, $expected:expr) => {
26        if $crate::ring_api_paracount($p) != $expected {
27            $crate::ring_api_error($p, $crate::RING_API_BADPARACOUNT);
28            return;
29        }
30    };
31    ($p:expr, $expected:expr, $msg:expr) => {
32        if $crate::ring_api_paracount($p) != $expected {
33            $crate::ring_api_error($p, $msg);
34            return;
35        }
36    };
37}
38
39#[macro_export]
40macro_rules! ring_check_paracount_range {
41    ($p:expr, $min:expr, $max:expr) => {
42        let count = $crate::ring_api_paracount($p);
43        if count < $min || count > $max {
44            $crate::ring_api_error($p, $crate::RING_API_BADPARACOUNT);
45            return;
46        }
47    };
48}
49
50#[macro_export]
51macro_rules! ring_check_string {
52    ($p:expr, $n:expr) => {
53        if !$crate::ring_api_isstring($p, $n) {
54            $crate::ring_api_error($p, $crate::RING_API_BADPARATYPE);
55            return;
56        }
57    };
58}
59
60#[macro_export]
61macro_rules! ring_check_number {
62    ($p:expr, $n:expr) => {
63        if !$crate::ring_api_isnumber($p, $n) {
64            $crate::ring_api_error($p, $crate::RING_API_BADPARATYPE);
65            return;
66        }
67    };
68}
69
70#[macro_export]
71macro_rules! ring_check_pointer {
72    ($p:expr, $n:expr) => {
73        if !$crate::ring_api_ispointer($p, $n) {
74            $crate::ring_api_error($p, $crate::RING_API_BADPARATYPE);
75            return;
76        }
77    };
78}
79
80#[macro_export]
81macro_rules! ring_check_cpointer {
82    ($p:expr, $n:expr) => {
83        if !$crate::ring_api_iscpointer($p, $n) {
84            $crate::ring_api_error($p, $crate::RING_API_BADPARATYPE);
85            return;
86        }
87    };
88}
89
90#[macro_export]
91macro_rules! ring_check_list {
92    ($p:expr, $n:expr) => {
93        if !$crate::ring_api_islist($p, $n) {
94            $crate::ring_api_error($p, $crate::RING_API_BADPARATYPE);
95            return;
96        }
97    };
98}
99
100#[macro_export]
101macro_rules! ring_get_string {
102    ($p:expr, $n:expr) => {
103        $crate::ring_api_getstring_str($p, $n)
104    };
105}
106
107#[macro_export]
108macro_rules! ring_get_number {
109    ($p:expr, $n:expr) => {
110        $crate::ring_api_getnumber($p, $n)
111    };
112}
113
114#[macro_export]
115macro_rules! ring_get_int {
116    ($p:expr, $n:expr) => {
117        $crate::ring_api_getnumber($p, $n) as i32
118    };
119}
120
121#[macro_export]
122macro_rules! ring_get_pointer {
123    ($p:expr, $n:expr, $type:ty, $ctype:expr) => {{
124        let ptr = $crate::ring_api_getcpointer($p, $n, $ctype);
125        if ptr.is_null() {
126            None
127        } else {
128            Some(unsafe { &mut *(ptr as *mut $type) })
129        }
130    }};
131}
132
133#[macro_export]
134macro_rules! ring_get_cpointer {
135    ($p:expr, $n:expr, $ctype:expr) => {
136        $crate::ring_api_getcpointer($p, $n, $ctype)
137    };
138}
139
140#[macro_export]
141macro_rules! ring_get_list {
142    ($p:expr, $n:expr) => {
143        $crate::ring_api_getlist($p, $n)
144    };
145}
146
147#[macro_export]
148macro_rules! ring_ret_number {
149    ($p:expr, $n:expr) => {
150        $crate::ring_api_retnumber($p, $n as f64)
151    };
152}
153
154#[macro_export]
155macro_rules! ring_ret_string {
156    ($p:expr, $s:expr) => {
157        $crate::ring_api_retstring_str($p, $s)
158    };
159}
160
161#[macro_export]
162macro_rules! ring_ret_cpointer {
163    ($p:expr, $ptr:expr, $ctype:expr) => {
164        $crate::ring_api_retcpointer($p, $ptr as *mut ::std::ffi::c_void, $ctype)
165    };
166}
167
168#[macro_export]
169macro_rules! ring_ret_managed_cpointer {
170    ($p:expr, $ptr:expr, $ctype:expr, $free_func:expr) => {
171        $crate::ring_api_retcpointer2(
172            $p,
173            $ptr as *mut ::std::ffi::c_void,
174            $ctype,
175            Some($free_func),
176        )
177    };
178}
179
180#[macro_export]
181macro_rules! ring_ret_list {
182    ($p:expr, $list:expr) => {
183        $crate::ring_api_retlist($p, $list)
184    };
185}
186
187#[macro_export]
188macro_rules! ring_new_list {
189    ($p:expr) => {
190        $crate::ring_api_newlist($p)
191    };
192}
193
194#[macro_export]
195macro_rules! ring_error {
196    ($p:expr, $msg:expr) => {
197        $crate::ring_api_error_str($p, $msg)
198    };
199}