#![no_std]
#![feature(c_variadic)]
#![deny(missing_docs)]
#![allow(
non_snake_case,
non_camel_case_types,
non_upper_case_globals,
clashing_extern_declarations
)]
mod bindings {
#![allow(unused)]
include!(concat!(env!("OUT_DIR"), "/lwprintf.rs"));
}
use core::ptr::null_mut;
use bindings::lwprintf_t;
pub const SIZE_MAX: i32 = bindings::SIZE_MAX as _;
pub trait CustomOutPut {
fn putch(ch: i32) -> i32;
}
pub struct LwprintfObj<T: CustomOutPut> {
obj: lwprintf_t,
_phantom: core::marker::PhantomData<T>,
}
impl<T: CustomOutPut> Default for LwprintfObj<T> {
fn default() -> Self {
Self::new()
}
}
impl<T: CustomOutPut> LwprintfObj<T> {
pub fn new() -> Self {
let obj = lwprintf_t {
out_fn: None,
arg: core::ptr::null_mut(),
};
Self {
obj,
_phantom: core::marker::PhantomData,
}
}
pub fn as_mut_ptr(&mut self) -> *mut lwprintf_t {
&mut self.obj
}
}
extern "C" fn out_fn<T: CustomOutPut>(
ch: core::ffi::c_int,
_lwobj: *mut lwprintf_t,
) -> core::ffi::c_int {
T::putch(ch)
}
pub fn lwprintf_init_ex<T: CustomOutPut>(lwobj: &mut LwprintfObj<T>) -> u8 {
unsafe { bindings::lwprintf_init_ex(lwobj.as_mut_ptr(), Some(out_fn::<T>)) }
}
pub fn lwprintf_init<T: CustomOutPut>() -> u8 {
unsafe { bindings::lwprintf_init_ex(null_mut(), Some(out_fn::<T>)) }
}
mod sys_inner {
use core::ffi::VaList;
use crate::bindings::lwprintf_t;
unsafe extern "C" {
pub fn lwprintf_vprintf_ex(
lwobj: *mut lwprintf_t,
format: *const core::ffi::c_char,
arg: VaList,
) -> core::ffi::c_int;
pub fn lwprintf_vsnprintf_ex(
lwobj: *mut lwprintf_t,
s: *mut core::ffi::c_char,
n: usize,
format: *const core::ffi::c_char,
arg: VaList,
) -> core::ffi::c_int;
pub fn lwprintf_printf_ex(
lwobj: *mut lwprintf_t,
format: *const core::ffi::c_char,
...
) -> core::ffi::c_int;
pub fn lwprintf_snprintf_ex(
lwobj: *mut lwprintf_t,
s: *mut ::core::ffi::c_char,
n: usize,
format: *const ::core::ffi::c_char,
...
) -> ::core::ffi::c_int;
}
}
pub use sys_inner::lwprintf_printf_ex;
pub use sys_inner::lwprintf_snprintf_ex;
pub use sys_inner::lwprintf_vprintf_ex;
pub use sys_inner::lwprintf_vsnprintf_ex;
pub unsafe extern "C" fn lwprintf_vprintf_ex_rust(
lwobj: *mut lwprintf_t,
fmt: *const core::ffi::c_char,
args: ...
) -> core::ffi::c_int {
unsafe { sys_inner::lwprintf_vprintf_ex(lwobj, fmt, args) }
}
pub unsafe extern "C" fn lwprintf_vsnprintf_ex_rust(
lwobj: *mut lwprintf_t,
s: *mut core::ffi::c_char,
n: usize,
fmt: *const core::ffi::c_char,
args: ...
) -> core::ffi::c_int {
unsafe { sys_inner::lwprintf_vsnprintf_ex(lwobj, s, n, fmt, args) }
}
#[macro_export]
macro_rules! lwprintf_sprintf_ex {
( $lwobj:expr, $buf:expr, $format:expr, $( $args:expr ),* ) => {
unsafe {
$crate::lwprintf_snprintf_ex(
$lwobj,
$buf,
$crate::SIZE_MAX as usize,
$format,
$( $args ),*
)
}
};
}
#[macro_export]
macro_rules! lwprintf_vprintf {
( $format:expr, $arg: expr ) => {
unsafe { $crate::lwprintf_vprintf_ex(core::ptr::null_mut(), $format, $arg) }
};
}
#[macro_export]
macro_rules! lwprintf_printf {
($format:expr, $( $args:expr ),* ) => {
unsafe {
$crate::lwprintf_printf_ex(
core::ptr::null_mut(),
$format,
$( $args ),*
)
}
};
}
#[macro_export]
macro_rules! lwprintf_vsnprintf {
( $buf:expr, $n:expr, $format:expr, $arg: expr ) => {
unsafe { $crate::lwprintf_vsnprintf_ex(core::ptr::null_mut(), $buf, $n, $format, $arg) }
};
}
#[macro_export]
macro_rules! lwprintf_snprintf {
( $buf:expr, $n:expr, $format:expr, $( $args:expr ),* ) => {
unsafe {
$crate::lwprintf_snprintf_ex(
core::ptr::null_mut(),
$buf,
$n,
$format,
$( $args ),*
)
}
};
}
#[macro_export]
macro_rules! lwprintf_sprintf {
($buf:expr, $format:expr, $( $args:expr ),* ) => {
unsafe {
$crate::lwprintf_sprintf_ex!(core::ptr::null_mut(), $buf, $format, $( $args ),* )
}
};
}