diff --git a/src/libstd/path.rs b/src/libstd/path.rs index 87c071b512ac7327f0dc68b65aba54f1bc183a08..354312ccf2b0a0819b29a6f473c2c53ff6bd5d56 100644 --- a/src/libstd/path.rs +++ b/src/libstd/path.rs @@ -184,6 +184,10 @@ pub enum Prefix<'a> { /// Prefix `C:` for the given disk drive. #[stable(feature = "rust1", since = "1.0.0")] Disk(#[stable(feature = "rust1", since = "1.0.0")] u8), + + /// Scheme `file:` used on Redox + #[stable(feature = "rust1", since = "1.0.0")] + Scheme(#[stable(feature = "rust1", since = "1.0.0")] &'a OsStr), } impl<'a> Prefix<'a> { @@ -214,6 +218,7 @@ fn os_str_len(s: &OsStr) -> usize { }, DeviceNS(x) => 4 + os_str_len(x), Disk(_) => 2, + Scheme(x) => 1 + os_str_len(x), } } @@ -315,11 +320,6 @@ unsafe fn u8_slice_as_os_str(s: &[u8]) -> &OsStr { &*(s as *const [u8] as *const OsStr) } -// Detect scheme on Redox -fn has_redox_scheme(s: &[u8]) -> bool { - cfg!(target_os = "redox") && s.contains(&b':') -} - //////////////////////////////////////////////////////////////////////////////// // Cross-platform, iterator-independent parsing //////////////////////////////////////////////////////////////////////////////// @@ -1902,12 +1902,7 @@ pub fn to_path_buf(&self) -> PathBuf { #[stable(feature = "rust1", since = "1.0.0")] #[allow(deprecated)] pub fn is_absolute(&self) -> bool { - if cfg!(target_os = "redox") { - // FIXME: Allow Redox prefixes - self.has_root() || has_redox_scheme(self.as_u8_slice()) - } else { - self.has_root() && (cfg!(unix) || self.prefix().is_some()) - } + self.has_root() && (cfg!(unix) || self.prefix().is_some()) } /// Returns `true` if the `Path` is relative, i.e., not absolute. @@ -2312,8 +2307,7 @@ pub fn components(&self) -> Components<'_> { Components { path: self.as_u8_slice(), prefix, - has_physical_root: has_physical_root(self.as_u8_slice(), prefix) || - has_redox_scheme(self.as_u8_slice()), + has_physical_root: has_physical_root(self.as_u8_slice(), prefix), front: State::Prefix, back: State::Body, } diff --git a/src/libstd/sys/unix/path.rs b/src/libstd/sys/unix/path.rs index 7a1839561078575c74850ce343f81b0989767916..892b6c88c6646653b7dca9239c31595694b8c2e3 100644 --- a/src/libstd/sys/unix/path.rs +++ b/src/libstd/sys/unix/path.rs @@ -11,7 +11,14 @@ pub fn is_verbatim_sep(b: u8) -> bool { b == b'/' } -pub fn parse_prefix(_: &OsStr) -> Option<Prefix<'_>> { +pub fn parse_prefix(path: &OsStr) -> Option<Prefix<'_>> { + if cfg!(target_os = "redox") { + if let Some(path_str) = path.to_str() { + if let Some(i) = path_str.find(':') { + return Some(Prefix::Scheme(OsStr::new(&path_str[..i]))); + } + } + } None }