"Alice Ryhl" <aliceryhl@xxxxxxxxxx> writes: > On Wed, Jul 09, 2025 at 05:49:57PM +0200, Andreas Hindborg wrote: >> "Alice Ryhl" <aliceryhl@xxxxxxxxxx> writes: >> >> > On Tue, Jul 08, 2025 at 09:44:58PM +0200, Andreas Hindborg wrote: >> >> Add `NullBorrowFormatter`, a formatter that writes a null terminated string >> >> to an array or slice buffer. Because this type needs to manage the trailing >> >> null marker, the existing formatters cannot be used to implement this type. >> >> >> >> Signed-off-by: Andreas Hindborg <a.hindborg@xxxxxxxxxx> >> >> --- >> >> rust/kernel/str.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> >> 1 file changed, 59 insertions(+) >> >> >> >> diff --git a/rust/kernel/str.rs b/rust/kernel/str.rs >> >> index 78b2f95eb3171..05d79cf40c201 100644 >> >> --- a/rust/kernel/str.rs >> >> +++ b/rust/kernel/str.rs >> >> @@ -860,6 +860,65 @@ fn deref_mut(&mut self) -> &mut Self::Target { >> >> } >> >> } >> >> >> >> +/// A mutable reference to a byte buffer where a string can be written into. >> >> +/// >> >> +/// The buffer will be automatically null terminated after the last written character. >> >> +/// >> >> +/// # Invariants >> >> +/// >> >> +/// `buffer` is always null terminated. >> >> +pub(crate) struct NullBorrowFormatter<'a> { >> >> + buffer: &'a mut [u8], >> >> + pos: usize, >> >> +} >> > >> > Do you need `pos`? Often I see this kind of code subslice `buffer` >> > instead. >> >> How would that work? Can I move the start index of `buffer` in some way >> without an unsafe block? > > Yes. I think this will work: > > let buffer = mem::take(&mut self.buffer); > self.buffer = &mut buffer[pos..]; > > Temporarily storing an empty slice avoids lifetime issues. Ah, that is neat. Best regards, Andreas Hindborg