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}