printf-wrap

Crates.ioprintf-wrap
lib.rsprintf-wrap
version0.2.1
sourcesrc
created_at2022-08-03 20:46:39.617118
updated_at2023-07-25 16:41:36.125394
descriptionTypes and functions for safely wrapping C functions with printf(3)-style format strings and varargs
homepage
repositoryhttps://github.com/BlackCAT-CubeSat/printf-wrap
max_upload_size
id638331
size66,895
fsw (github:blackcat-cubesat:fsw)

documentation

https://docs.rs/printf-wrap

README

printf-wrap

Crates.io docs.rs

printf-wrap is a Rust crate with types to help developers write safe wrappers for C functions using printf(3)-style format strings and varargs. In particular, PrintfFmt<(T_1, T_2, ..., T_N)> is a wrapper around a null-terminated string that is guaranteed to be a valid format string for use with N arguments of types T_1T_2, …, T_N when the arguments are mapped through the PrintfArgument::as_c_val() method.

The following example shows a safe wrapper for calling printf with two arguments, along with a use of it.

use printf_wrap::{PrintfFmt, PrintfArgument};
use libc::{c_int, printf};

/// Safe wrapper for calling printf with two value arguments.
pub fn printf_with_2_args<T, U>(fmt: PrintfFmt<(T, U)>, arg1: T, arg2: U) -> c_int
where
    T: PrintfArgument,
    U: PrintfArgument,
{
    unsafe { printf(fmt.as_ptr(), arg1.as_c_val(), arg2.as_c_val()) }
}

const MY_FORMAT_STRING: PrintfFmt<(u32, i32)> =
    PrintfFmt::new_or_panic("unsigned = %u, signed = %d\0");

fn main() {
    printf_with_2_args(MY_FORMAT_STRING, 42, -7);
}

In the example, MY_FORMAT_STRING is determined to be a valid format string for arguments of (u32, i32) at compile time, with zero runtime overhead. With a little macro magic, generating wrappers for different numbers of post-format arguments is easy, with printf-wrap handling the validation and conversion of values to C-compatible equivalents.

Features

libc – enables support relating to the C types size_t, intmax_t, and ptrdiff_t; requires the libc crate.

example – enables a demonstration of the use of printf-wrap with some wrappers around functions from the C standard library; also requires the libc crate.

License

This crate is licensed under either of the MIT license or the Apache License version 2.0 at your option.

Commit count: 73

cargo fmt