File tree 3 files changed +31
-0
lines changed
3 files changed +31
-0
lines changed Original file line number Diff line number Diff line change @@ -659,6 +659,30 @@ impl CStr {
659
659
// instead of doing it afterwards.
660
660
str:: from_utf8 ( self . to_bytes ( ) )
661
661
}
662
+
663
+ /// Returns an object that implements [`Display`] for safely printing a [`CStr`] that may
664
+ /// contain non-Unicode data.
665
+ ///
666
+ /// Behaves as if `self` were first lossily converted to a `str`, with invalid UTF-8 presented
667
+ /// as the Unicode replacement character: �.
668
+ ///
669
+ /// [`Display`]: fmt::Display
670
+ ///
671
+ /// # Examples
672
+ ///
673
+ /// ```
674
+ /// #![feature(cstr_display)]
675
+ ///
676
+ /// let cstr = c"Hello, world!";
677
+ /// println!("{}", cstr.display());
678
+ /// ```
679
+ #[ unstable( feature = "cstr_display" , issue = "139984" ) ]
680
+ #[ must_use = "this does not display the `CStr`; \
681
+ it returns an object that can be displayed"]
682
+ #[ inline]
683
+ pub fn display ( & self ) -> impl fmt:: Display {
684
+ crate :: bstr:: ByteStr :: from_bytes ( self . to_bytes ( ) )
685
+ }
662
686
}
663
687
664
688
// `.to_bytes()` representations are compared instead of the inner `[c_char]`s,
Original file line number Diff line number Diff line change @@ -19,3 +19,9 @@ fn debug() {
19
19
let s = c"abc\x01 \x02 \n \xE2 \x80 \xA6 \xFF " ;
20
20
assert_eq ! ( format!( "{s:?}" ) , r#""abc\x01\x02\n\xe2\x80\xa6\xff""# ) ;
21
21
}
22
+
23
+ #[ test]
24
+ fn display ( ) {
25
+ let s = c"\xf0 \x28 \x8c \xbc " ;
26
+ assert_eq ! ( format!( "{}" , s. display( ) ) , "�(��" ) ;
27
+ }
Original file line number Diff line number Diff line change 23
23
#![ feature( core_io_borrowed_buf) ]
24
24
#![ feature( core_private_bignum) ]
25
25
#![ feature( core_private_diy_float) ]
26
+ #![ feature( cstr_display) ]
26
27
#![ feature( dec2flt) ]
27
28
#![ feature( duration_constants) ]
28
29
#![ feature( duration_constructors) ]
You can’t perform that action at this time.
0 commit comments