From 223e55373bd13dfbc0c3eca8b8680b019454dcb6 Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jeremy@system76.com> Date: Wed, 7 Aug 2019 20:57:59 -0600 Subject: [PATCH] Redox Scheme Path Prefix --- src/libstd/path.rs | 20 +++++++------------- src/libstd/sys/unix/path.rs | 9 ++++++++- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/libstd/path.rs b/src/libstd/path.rs index 6d6bc760649e..f3ee943dd19a 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 //////////////////////////////////////////////////////////////////////////////// @@ -1918,12 +1918,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. @@ -2329,8 +2324,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 7a1839561078..892b6c88c664 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 } -- GitLab