@@ -3,6 +3,8 @@ use core::convert::TryInto;
3
3
use core:: fmt;
4
4
use core:: iter:: Iterator ;
5
5
use core:: result:: Result ;
6
+ #[ cfg( feature = "exts" ) ]
7
+ use crate :: alloc_api:: string:: String ;
6
8
use core:: slice;
7
9
8
10
/// Errors which can occur during checked `[uN]` -> `CStrN` conversions
@@ -162,6 +164,45 @@ impl CStr16 {
162
164
pos : 0 ,
163
165
}
164
166
}
167
+
168
+ /// Write a string slice into the provided buffer. If it fails, then most probably, because
169
+ /// the buffer is not big enough. In that case, the buffer will contain the correct string
170
+ /// until the point, where the size was not enough.
171
+ ///
172
+ /// ## Example
173
+ ///
174
+ /// ```rust
175
+ /// use uefi::data_types::ArrayString;
176
+ /// use uefi::{CStr16, Char16};
177
+ /// let firmware_vendor_c16_str: CStr16 = ...;
178
+ /// // crate "arrayvec" uses stack-allocated arrays for Strings => no heap
179
+ /// let mut buf = arrayvec::ArrayString::<128>::new();
180
+ /// firmware_vendor_c16_str.as_str_in_buf(&mut buf);
181
+ /// log::info!("as rust str: {}", buf.as_str());
182
+ /// ```
183
+ pub fn as_str_in_buf ( & self , buf : & mut dyn core:: fmt:: Write ) -> Result < ( ) , ( ) > {
184
+ for c16 in self . iter ( ) {
185
+ let res = buf. write_char ( char:: from ( * c16) ) ;
186
+ if let Err ( err) = res {
187
+ log:: error!( "Failed to write CStr16 as &str into buffer. Buffer too small? ({})" , err) ;
188
+ return Err ( ( ) )
189
+ }
190
+ }
191
+ Ok ( ( ) )
192
+ }
193
+
194
+ /// Transforms the C16Str to a regular Rust String.
195
+ /// **WARNING** This will require **heap allocation**, i.e. you need an global allocator.
196
+ /// If the UEFI boot services are exited, your OS/Kernel needs to provide another allocation
197
+ /// mechanism!
198
+ #[ cfg( feature = "exts" ) ]
199
+ pub fn as_string ( & self ) -> String {
200
+ let mut buf = String :: with_capacity ( self . 0 . len ( ) * 2 ) ;
201
+ for c16 in self . iter ( ) {
202
+ buf. push ( char:: from ( * c16) ) ;
203
+ }
204
+ buf
205
+ }
165
206
}
166
207
167
208
/// An iterator over `CStr16`.
0 commit comments