macro_rules! tokenize_printf_to_writer {
($writer:expr, $($format_string:literal)PW_FMT_CONCAT+ $(, $args:expr)* $(,)?) => { ... };
}Expand description
Tokenize a printf format string and arguments to a MessageWriter and
add the format string’s token to the token database.
tokenize_printf_fmt_to_writer! and the accompanying MessageWriter trait
provide an optimized API for use cases like logging where the output of the
tokenization will be written to a shared/ambient resource like stdio, a
UART, or a shared buffer.
See token for an explanation on how strings are tokenized and entries
are added to the token database. The token’s domain is set to "".
Returns a pw_status::Result<()>.
tokenize_core_fmt_to_writer! supports concatenation of format strings as
described in pw_format::macros::FormatAndArgs.
§Errors
pw_status::Error::OutOfRange-MessageWriterdoes not have enough space to fit tokenized data.- others -
tokenize_printf_to_writer!will pass on any errors returned by theMessageWriter.
§Code Size
This data was collected by examining the disassembly of a test program built for a Cortex M0.
| Tokenized Message | Per Call-site Cost (bytes) |
|---|---|
| no arguments | 10 |
one i32 argument | 18 |
§Example
use pw_status::Result;
use pw_stream::{Cursor, Write};
use pw_tokenizer::{MessageWriter, tokenize_printf_to_writer};
const BUFFER_LEN: usize = 32;
// Declare a simple MessageWriter that uses a [`pw_status::Cursor`] to
// maintain an internal buffer.
struct TestMessageWriter {
cursor: Cursor<[u8; BUFFER_LEN]>,
}
impl TestMessageWriter {
fn new() -> Self {
Self {
cursor: Cursor::new([0u8; BUFFER_LEN]),
}
}
}
impl MessageWriter for TestMessageWriter {
fn write(&mut self, data: &[u8]) -> Result<()> {
self.cursor.write_all(data)
}
fn remaining(&self) -> usize {
self.cursor.remaining()
}
fn finalize(self) -> Result<()> {
let len = self.cursor.position();
// 4 bytes used to encode the token and one to encode the value 42.
assert_eq!(len, 5);
Ok(())
}
}
// Tokenize a format string and argument into the writer. Note how we
// pass in the message writer's type, not an instance of it.
let len = tokenize_printf_to_writer!(TestMessageWriter::new(), "The answer is %d", 42)?;