diff options
Diffstat (limited to '')
-rw-r--r-- | third_party/rust/cubeb-backend/src/log.rs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/third_party/rust/cubeb-backend/src/log.rs b/third_party/rust/cubeb-backend/src/log.rs new file mode 100644 index 0000000000..ca297d0038 --- /dev/null +++ b/third_party/rust/cubeb-backend/src/log.rs @@ -0,0 +1,73 @@ +// Copyright © 2017-2018 Mozilla Foundation +// +// This program is made available under an ISC-style license. See the +// accompanying file LICENSE for details. + +#[macro_export] +macro_rules! cubeb_log_internal { + ($level: expr, $msg: expr) => { + #[allow(unused_unsafe)] + unsafe { + if $level <= $crate::ffi::g_cubeb_log_level.into() { + cubeb_log_internal!(__INTERNAL__ $msg); + } + } + }; + ($level: expr, $fmt: expr, $($arg: expr),+) => { + #[allow(unused_unsafe)] + unsafe { + if $level <= $crate::ffi::g_cubeb_log_level.into() { + cubeb_log_internal!(__INTERNAL__ format!($fmt, $($arg),*)); + } + } + }; + (__INTERNAL__ $msg: expr) => { + if let Some(log_callback) = $crate::ffi::g_cubeb_log_callback { + use std::io::Write; + + let mut buf = [0 as u8; 1024]; + let filename = std::path::Path::new(file!()) + .file_name() + .unwrap() + .to_str() + .unwrap(); + // 2 for ':', 1 for ' ', 1 for '\n', and 1 for converting `line!()` to number of digits + let len = filename.len() + ((line!() as f32).log10().trunc() as usize) + $msg.len() + 5; + debug_assert!(len < buf.len(), "log will be truncated"); + let _ = write!(&mut buf[..], "{}:{}: {}\n", filename, line!(), $msg); + let last = std::cmp::min(len, buf.len() - 1); + buf[last] = 0; + let cstr = unsafe { std::ffi::CStr::from_bytes_with_nul_unchecked(&buf[..=last]) }; + log_callback(cstr.as_ptr()); + } + } +} + +#[macro_export] +macro_rules! cubeb_logv { + ($msg: expr) => (cubeb_log_internal!($crate::LogLevel::Verbose, $msg)); + ($fmt: expr, $($arg: expr),+) => (cubeb_log_internal!($crate::LogLevel::Verbose, $fmt, $($arg),*)); +} + +#[macro_export] +macro_rules! cubeb_log { + ($msg: expr) => (cubeb_log_internal!($crate::LogLevel::Normal, $msg)); + ($fmt: expr, $($arg: expr),+) => (cubeb_log_internal!($crate::LogLevel::Normal, $fmt, $($arg),*)); +} + +#[cfg(test)] +mod tests { + #[test] + fn test_normal_logging() { + cubeb_log!("This is log at normal level"); + cubeb_log!("{} Formatted log", 1); + cubeb_log!("{} Formatted {} log {}", 1, 2, 3); + } + + #[test] + fn test_verbose_logging() { + cubeb_logv!("This is a log at verbose level"); + cubeb_logv!("{} Formatted log", 1); + cubeb_logv!("{} Formatted {} log {}", 1, 2, 3); + } +} |