exposed_macro/
lib.rs

1#[macro_export]
2macro_rules! cstr {
3    ($s:literal) => {
4        ::core::concat!($s, '\0').as_ptr() as *const std::ffi::c_char
5    };
6    ($s:expr) => {
7        $s
8    };
9}
10
11#[cfg(target_os = "android")]
12pub use ndk_sys::{__android_log_print, android_LogPriority};
13
14#[macro_export]
15#[cfg(target_os = "android")]
16macro_rules! log_debug_ {
17  ($tag:literal, $fmt:literal) => {
18    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_DEBUG.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
19  };
20  ($tag:literal, $fmt:literal, $($args:expr),*) => {
21    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_DEBUG.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
22  };
23  ($tag:expr, $fmt:literal) => {
24    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_DEBUG.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
25  };
26  ($tag:expr, $fmt:literal, $($args:expr),*) => {
27    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_DEBUG.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
28  };
29}
30#[macro_export]
31#[cfg(target_os = "android")]
32macro_rules! log_debug {
33  ($tag:expr, $($arg:expr),*) => {
34    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_DEBUG.0, $crate::cstr!($tag),format!($($arg),*))
35  };
36  ($tag:literal, $($arg:expr)*) => {
37    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_DEBUG.0, $crate::cstr!($tag),format!($($arg),*))
38  };
39}
40#[macro_export]
41#[cfg(not(target_os = "android"))]
42macro_rules! log_debug {
43  ($tag:expr, $($arg:expr),*) => {
44    println!("DEBUG: {} {}", $tag,format!($($arg),*));
45  };
46  ($tag:literal, $($arg:expr)*) => {
47    println!("DEBUG: {} {}", $tag,format!($($arg),*));
48  };
49}
50
51#[macro_export]
52#[cfg(target_os = "android")]
53macro_rules! log_default_ {
54  ($tag:literal, $fmt:literal) => {
55    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_DEFAULT.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
56  };
57  ($tag:literal, $fmt:literal, $($args:expr),*) => {
58    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_DEFAULT.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
59  };
60  ($tag:expr, $fmt:literal) => {
61    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_DEFAULT.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
62  };
63  ($tag:expr, $fmt:literal, $($args:expr),*) => {
64    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_DEFAULT.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
65  };
66}
67#[macro_export]
68#[cfg(target_os = "android")]
69macro_rules! log_default {
70  ($tag:expr, $($arg:expr),*) => {
71    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_DEFAULT.0, $crate::cstr!($tag),format!($($arg),*))
72  };
73  ($tag:literal, $($arg:expr)*) => {
74    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_DEFAULT.0, $crate::cstr!($tag),format!($($arg),*))
75  };
76}
77#[macro_export]
78#[cfg(not(target_os = "android"))]
79macro_rules! log_default {
80  ($tag:expr, $($arg:expr),*) => {
81    println!("DEFAULT: {} {}", $tag,format!($($arg),*));
82  };
83  ($tag:literal, $($arg:expr)*) => {
84    println!("DEFAULT: {} {}", $tag,format!($($arg),*));
85  };
86}
87
88#[macro_export]
89#[cfg(target_os = "android")]
90macro_rules! log_error_ {
91  ($tag:literal, $fmt:literal) => {
92    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_ERROR.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
93  };
94  ($tag:literal, $fmt:literal, $($args:expr),*) => {
95    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_ERROR.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
96  };
97  ($tag:expr, $fmt:literal) => {
98    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_ERROR.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
99  };
100  ($tag:expr, $fmt:literal, $($args:expr),*) => {
101    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_ERROR.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
102  };
103}
104#[macro_export]
105#[cfg(target_os = "android")]
106macro_rules! log_error {
107  ($tag:expr, $($arg:expr),*) => {
108    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_ERROR.0, $crate::cstr!($tag),format!($($arg),*))
109  };
110  ($tag:literal, $($arg:expr)*) => {
111    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_ERROR.0, $crate::cstr!($tag),format!($($arg),*))
112  };
113}
114#[macro_export]
115#[cfg(not(target_os = "android"))]
116macro_rules! log_error {
117  ($tag:expr, $($arg:expr),*) => {
118    println!("ERROR: {} {}", $tag,format!($($arg),*));
119  };
120  ($tag:literal, $($arg:expr)*) => {
121    println!("ERROR: {} {}", $tag,format!($($arg),*));
122  };
123}
124
125#[macro_export]
126#[cfg(target_os = "android")]
127macro_rules! log_fatal_ {
128  ($tag:literal, $fmt:literal) => {
129    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_FATAL.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
130  };
131  ($tag:literal, $fmt:literal, $($args:expr),*) => {
132    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_FATAL.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
133  };
134  ($tag:expr, $fmt:literal) => {
135    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_FATAL.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
136  };
137  ($tag:expr, $fmt:literal, $($args:expr),*) => {
138    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_FATAL.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
139  };
140}
141#[macro_export]
142#[cfg(target_os = "android")]
143macro_rules! log_fatal {
144  ($tag:expr, $($arg:expr),*) => {
145    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_FATAL.0, $crate::cstr!($tag),format!($($arg),*))
146  };
147  ($tag:literal, $($arg:expr)*) => {
148    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_FATAL.0, $crate::cstr!($tag),format!($($arg),*))
149  };
150}
151#[macro_export]
152#[cfg(not(target_os = "android"))]
153macro_rules! log_fatal {
154  ($tag:expr, $($arg:expr),*) => {
155    println!("FATAL: {} {}", $tag,format!($($arg),*));
156  };
157  ($tag:literal, $($arg:expr)*) => {
158    println!("FATAL: {} {}", $tag,format!($($arg),*));
159  };
160}
161
162#[macro_export]
163#[cfg(target_os = "android")]
164macro_rules! log_info_ {
165  ($tag:literal, $fmt:literal) => {
166    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_INFO.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
167  };
168  ($tag:literal, $fmt:literal, $($args:expr),*) => {
169    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_INFO.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
170  };
171  ($tag:expr, $fmt:literal) => {
172    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_INFO.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
173  };
174  ($tag:expr, $fmt:literal, $($args:expr),*) => {
175    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_INFO.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
176  };
177}
178#[macro_export]
179#[cfg(target_os = "android")]
180macro_rules! log_info {
181  ($tag:expr, $($arg:expr),*) => {
182    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_INFO.0, $crate::cstr!($tag),format!($($arg),*))
183  };
184  ($tag:literal, $($arg:expr)*) => {
185    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_INFO.0, $crate::cstr!($tag),format!($($arg),*))
186  };
187}
188#[macro_export]
189#[cfg(not(target_os = "android"))]
190macro_rules! log_info {
191  ($tag:expr, $($arg:expr),*) => {
192    println!("INFO: {} {}", $tag,format!($($arg),*));
193  };
194  ($tag:literal, $($arg:expr)*) => {
195    println!("INFO: {} {}", $tag,format!($($arg),*));
196  };
197}
198
199#[macro_export]
200#[cfg(target_os = "android")]
201macro_rules! log_silent_ {
202  ($tag:literal, $fmt:literal) => {
203    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_SILENT.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
204  };
205  ($tag:literal, $fmt:literal, $($args:expr),*) => {
206    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_SILENT.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
207  };
208  ($tag:expr, $fmt:literal) => {
209    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_SILENT.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
210  };
211  ($tag:expr, $fmt:literal, $($args:expr),*) => {
212    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_SILENT.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
213  };
214}
215#[macro_export]
216#[cfg(target_os = "android")]
217macro_rules! log_silent {
218  ($tag:expr, $($arg:expr),*) => {
219    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_SILENT.0, $crate::cstr!($tag),format!($($arg),*))
220  };
221  ($tag:literal, $($arg:expr)*) => {
222    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_SILENT.0, $crate::cstr!($tag),format!($($arg),*))
223  };
224}
225#[macro_export]
226#[cfg(not(target_os = "android"))]
227macro_rules! log_silent {
228  ($tag:expr, $($arg:expr),*) => {
229    println!("SILENT: {} {}", $tag,format!($($arg),*));
230  };
231  ($tag:literal, $($arg:expr)*) => {
232    println!("SILENT: {} {}", $tag,format!($($arg),*));
233  };
234}
235
236#[macro_export]
237#[cfg(target_os = "android")]
238macro_rules! log_unknown_ {
239  ($tag:literal, $fmt:literal) => {
240    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_UNKNOWN.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
241  };
242  ($tag:literal, $fmt:literal, $($args:expr),*) => {
243    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_UNKNOWN.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
244  };
245  ($tag:expr, $fmt:literal) => {
246    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_UNKNOWN.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
247  };
248  ($tag:expr, $fmt:literal, $($args:expr),*) => {
249    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_UNKNOWN.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
250  };
251}
252#[macro_export]
253#[cfg(target_os = "android")]
254macro_rules! log_unknown {
255  ($tag:expr, $($arg:expr),*) => {
256    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_UNKNOWN.0, $crate::cstr!($tag),format!($($arg),*))
257  };
258  ($tag:literal, $($arg:expr)*) => {
259    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_UNKNOWN.0, $crate::cstr!($tag),format!($($arg),*))
260  };
261}
262#[macro_export]
263#[cfg(not(target_os = "android"))]
264macro_rules! log_unknown {
265  ($tag:expr, $($arg:expr),*) => {
266    println!("UNKNOWN: {} {}", $tag,format!($($arg),*));
267  };
268  ($tag:literal, $($arg:expr)*) => {
269    println!("UNKNOWN: {} {}", $tag,format!($($arg),*));
270  };
271}
272
273#[macro_export]
274#[cfg(target_os = "android")]
275macro_rules! log_verbose_ {
276  ($tag:literal, $fmt:literal) => {
277    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_VERBOSE.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
278  };
279  ($tag:literal, $fmt:literal, $($args:expr),*) => {
280    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_VERBOSE.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
281  };
282  ($tag:expr, $fmt:literal) => {
283    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_VERBOSE.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
284  };
285  ($tag:expr, $fmt:literal, $($args:expr),*) => {
286    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_VERBOSE.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
287  };
288}
289#[macro_export]
290#[cfg(target_os = "android")]
291macro_rules! log_verbose {
292  ($tag:expr, $($arg:expr),*) => {
293    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_VERBOSE.0, $crate::cstr!($tag),format!($($arg),*))
294  };
295  ($tag:literal, $($arg:expr)*) => {
296    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_VERBOSE.0, $crate::cstr!($tag),format!($($arg),*))
297  };
298}
299#[macro_export]
300#[cfg(not(target_os = "android"))]
301macro_rules! log_verbose {
302  ($tag:expr, $($arg:expr),*) => {
303    println!("VERBOSE: {} {}", $tag,format!($($arg),*));
304  };
305  ($tag:literal, $($arg:expr)*) => {
306    println!("VERBOSE: {} {}", $tag,format!($($arg),*));
307  };
308}
309
310#[macro_export]
311#[cfg(target_os = "android")]
312macro_rules! log_warn_ {
313  ($tag:literal, $fmt:literal) => {
314    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_WARN.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
315  };
316  ($tag:literal, $fmt:literal, $($args:expr),*) => {
317    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_WARN.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
318  };
319  ($tag:expr, $fmt:literal) => {
320    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_WARN.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt))
321  };
322  ($tag:expr, $fmt:literal, $($args:expr),*) => {
323    $crate::__android_log_print($crate::android_LogPriority::ANDROID_LOG_WARN.0 as _, $crate::cstr!($tag), $crate::cstr!($fmt), $($args),*)
324  };
325}
326#[macro_export]
327#[cfg(target_os = "android")]
328macro_rules! log_warn {
329  ($tag:expr, $($arg:expr),*) => {
330    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_WARN.0, $crate::cstr!($tag),format!($($arg),*))
331  };
332  ($tag:literal, $($arg:expr)*) => {
333    $crate::log_string($crate::android_LogPriority::ANDROID_LOG_WARN.0, $crate::cstr!($tag),format!($($arg),*))
334  };
335}
336#[macro_export]
337#[cfg(not(target_os = "android"))]
338macro_rules! log_warn {
339  ($tag:expr, $($arg:expr),*) => {
340    println!("WARN: {} {}", $tag,format!($($arg),*));
341  };
342  ($tag:literal, $($arg:expr)*) => {
343    println!("WARN: {} {}", $tag,format!($($arg),*));
344  };
345}
346
347#[macro_export]
348#[cfg(target_os = "android")]
349macro_rules! android_on_create {
350    ($callbacks:ty) => {
351        #[no_mangle]
352        pub unsafe extern "C" fn ANativeActivity_onCreate(activity: usize, saved_state: usize, saved_state_size: usize) {
353            exposed::window::android::init_callbacks::<$callbacks>(activity, saved_state, saved_state_size)
354        }
355    };
356}
357
358#[macro_export]
359#[cfg(not(target_os = "android"))]
360macro_rules! android_on_create {
361    ($callbacks:ty) => {
362        type _AndroidOnCreatePlaceHolder = $callbacks;
363    };
364}
365
366#[cfg(target_os = "android")]
367pub fn log_string(level: std::ffi::c_uint, tag: *const std::ffi::c_char, mut message: String) {
368    message.push('\0');
369    unsafe { __android_log_print(level as _, tag, cstr!("%s"), message.as_ptr()) };
370}