1
+ // Return the first index, if any, where the given byte occurs.
1
2
#[ must_use]
2
3
pub const fn find ( slice : & [ u8 ] , elem : u8 ) -> Option < usize > {
3
4
let mut idx = 0 ;
@@ -12,14 +13,22 @@ pub const fn find(slice: &[u8], elem: u8) -> Option<usize> {
12
13
}
13
14
}
14
15
16
+ // Return true if the slice contains a single NUL byte in the last position of
17
+ // the slice.
15
18
#[ must_use]
16
19
pub const fn is_cstr ( slice : & [ u8 ] ) -> bool {
17
20
matches ! ( find( slice, 0 ) , Some ( nul_pos) if nul_pos + 1 == slice. len( ) )
18
21
}
19
22
23
+ // Returns true if the slice contains any NUL bytes.
24
+ #[ must_use]
25
+ pub const fn contains_nul ( slice : & [ u8 ] ) -> bool {
26
+ matches ! ( find( slice, 0 ) , Some ( _) )
27
+ }
28
+
20
29
#[ cfg( test) ]
21
30
mod tests {
22
- use super :: { find, is_cstr} ;
31
+ use super :: { contains_nul , find, is_cstr} ;
23
32
24
33
#[ test]
25
34
fn find_nul_byte ( ) {
@@ -52,4 +61,20 @@ mod tests {
52
61
assert ! ( is_cstr( b"abc\0 " ) ) ;
53
62
assert ! ( is_cstr( b"abc\xFF xyz\0 " ) ) ;
54
63
}
64
+
65
+ #[ test]
66
+ fn check_contains_nul_byte ( ) {
67
+ assert ! ( !contains_nul( b"" ) ) ;
68
+ assert ! ( !contains_nul( b"abc" ) ) ;
69
+ assert ! ( !contains_nul( b"abc\xFF xyz" ) ) ;
70
+
71
+ assert ! ( contains_nul( b"abc\0 xyz" ) ) ;
72
+ assert ! ( contains_nul( b"abc\0 xyz\0 " ) ) ;
73
+ assert ! ( contains_nul( b"abc\xFF \0 xyz" ) ) ;
74
+ assert ! ( contains_nul( b"abc\xFF \0 xyz\0 " ) ) ;
75
+
76
+ assert ! ( contains_nul( b"\0 " ) ) ;
77
+ assert ! ( contains_nul( b"abc\0 " ) ) ;
78
+ assert ! ( contains_nul( b"abc\xFF xyz\0 " ) ) ;
79
+ }
55
80
}
0 commit comments