@@ -29,23 +29,20 @@ pub fn is_valid_drive_letter(disk: u8) -> bool {
29
29
}
30
30
31
31
pub fn parse_prefix ( path : & OsStr ) -> Option < Prefix < ' _ > > {
32
- use crate :: path :: Prefix :: * ;
32
+ use Prefix :: { DeviceNS , Disk , Verbatim , VerbatimDisk , VerbatimUNC , UNC } ;
33
33
unsafe {
34
34
// The unsafety here stems from converting between &OsStr and &[u8]
35
35
// and back. This is safe to do because (1) we only look at ASCII
36
36
// contents of the encoding and (2) new &OsStr values are produced
37
37
// only from ASCII-bounded slices of existing &OsStr values.
38
- let mut path = os_str_as_u8_slice ( path) ;
38
+ let path = os_str_as_u8_slice ( path) ;
39
39
40
- if path. starts_with ( br"\\" ) {
41
- // \\
42
- path = & path[ 2 ..] ;
43
- if path. starts_with ( br"?\" ) {
44
- // \\?\
45
- path = & path[ 2 ..] ;
46
- if path. starts_with ( br"UNC\" ) {
47
- // \\?\UNC\server\share
48
- path = & path[ 4 ..] ;
40
+ // \\
41
+ if let Some ( path) = path. strip_prefix ( br"\\" ) {
42
+ // \\?\
43
+ if let Some ( path) = path. strip_prefix ( br"?\" ) {
44
+ // \\?\UNC\server\share
45
+ if let Some ( path) = path. strip_prefix ( br"UNC\" ) {
49
46
let ( server, share) = match parse_two_comps ( path, is_verbatim_sep) {
50
47
Some ( ( server, share) ) => {
51
48
( u8_slice_as_os_str ( server) , u8_slice_as_os_str ( share) )
@@ -55,35 +52,35 @@ pub fn parse_prefix(path: &OsStr) -> Option<Prefix<'_>> {
55
52
return Some ( VerbatimUNC ( server, share) ) ;
56
53
} else {
57
54
// \\?\path
58
- let idx = path. iter ( ) . position ( |& b| b == b'\\' ) ;
59
- if idx == Some ( 2 ) && path[ 1 ] == b':' {
60
- let c = path[ 0 ] ;
61
- if is_valid_drive_letter ( c) {
62
- // \\?\C:\ path
55
+ match path {
56
+ // \\?\C:\path
57
+ [ c, b':' , b'\\' , ..] if is_valid_drive_letter ( * c) => {
63
58
return Some ( VerbatimDisk ( c. to_ascii_uppercase ( ) ) ) ;
64
59
}
60
+ // \\?\cat_pics
61
+ _ => {
62
+ let idx = path. iter ( ) . position ( |& b| b == b'\\' ) . unwrap_or ( path. len ( ) ) ;
63
+ let slice = & path[ ..idx] ;
64
+ return Some ( Verbatim ( u8_slice_as_os_str ( slice) ) ) ;
65
+ }
65
66
}
66
- let slice = & path[ ..idx. unwrap_or ( path. len ( ) ) ] ;
67
- return Some ( Verbatim ( u8_slice_as_os_str ( slice) ) ) ;
68
67
}
69
- } else if path. starts_with ( b".\\ " ) {
70
- // \\.\path
71
- path = & path[ 2 ..] ;
72
- let pos = path. iter ( ) . position ( |& b| b == b'\\' ) ;
73
- let slice = & path[ ..pos. unwrap_or ( path. len ( ) ) ] ;
68
+ } else if let Some ( path) = path. strip_prefix ( b".\\ " ) {
69
+ // \\.\COM42
70
+ let idx = path. iter ( ) . position ( |& b| b == b'\\' ) . unwrap_or ( path. len ( ) ) ;
71
+ let slice = & path[ ..idx] ;
74
72
return Some ( DeviceNS ( u8_slice_as_os_str ( slice) ) ) ;
75
73
}
76
74
match parse_two_comps ( path, is_sep_byte) {
77
75
Some ( ( server, share) ) if !server. is_empty ( ) && !share. is_empty ( ) => {
78
76
// \\server\share
79
77
return Some ( UNC ( u8_slice_as_os_str ( server) , u8_slice_as_os_str ( share) ) ) ;
80
78
}
81
- _ => ( ) ,
79
+ _ => { }
82
80
}
83
- } else if path . get ( 1 ) == Some ( & b':' ) {
81
+ } else if let [ c , b':' , .. ] = path {
84
82
// C:
85
- let c = path[ 0 ] ;
86
- if is_valid_drive_letter ( c) {
83
+ if is_valid_drive_letter ( * c) {
87
84
return Some ( Disk ( c. to_ascii_uppercase ( ) ) ) ;
88
85
}
89
86
}
0 commit comments