pub use bstr::{BStr, BString};
mod arg;
pub use arg::{Arg, ToArg};
mod fmt_fp;
mod printf_impl;
pub use printf_impl::{Error, printf_locale_to_slice, sprintf_locale};
pub mod locale;
#[cfg(test)]
mod tests;
#[macro_export]
macro_rules! sprintf {
(
$fmt:expr // Format string, as bytes.
$(, $($arg:expr),*)? ) => {
{
let mut target = ::std::vec::Vec::new();
$crate::sprintf!(=> &mut target, $fmt $(, $($arg),*)?);
$crate::BString::from(target)
}
};
(
=> $target:expr, $fmt:expr $(, $($arg:expr),*)? ) => {
{
#[allow(unused_imports)]
use $crate::ToArg as _;
let fmt = $crate::BStr::new(::std::convert::AsRef::<[u8]>::as_ref(&$fmt));
$crate::printf_c_locale(
$target,
fmt,
&mut [$( $($arg.to_arg()),* )?],
).unwrap()
}
};
}
pub fn printf_c_locale<W: std::io::Write + ?Sized>(
f: &mut W,
fmt: &BStr,
args: &mut [Arg],
) -> Result<usize, Error> {
sprintf_locale(f, fmt, &locale::C_LOCALE, args)
}
pub fn printf_c_locale_to_slice(
buffer: &mut [u8],
fmt: &BStr,
args: &mut [Arg],
) -> Result<usize, Error> {
printf_locale_to_slice(buffer, fmt, &locale::C_LOCALE, args)
}