From 18bf0540bf8a04a5724dd515fec2311d1e4768e4 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 14 Nov 2016 15:02:18 -0700 Subject: [PATCH] Fix redox prefix handling --- src/libstd/path.rs | 9 ++++++++- src/libstd/sys/redox/path.rs | 12 ++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/libstd/path.rs b/src/libstd/path.rs index bb6883236e80..3e414a28a301 100644 --- a/src/libstd/path.rs +++ b/src/libstd/path.rs @@ -129,7 +129,9 @@ use sys::path::{is_sep_byte, is_verbatim_sep, MAIN_SEP_STR, parse_prefix}; // Windows Prefixes //////////////////////////////////////////////////////////////////////////////// -/// Path prefixes (Windows only). +/// Path prefixes (Redox and Windows only). +/// +/// Redox uses schemes like `scheme:reference` to identify different I/O systems /// /// Windows uses a variety of path styles, including references to drive /// volumes (like `C:`), network shared folders (like `\\server\share`) and @@ -139,6 +141,10 @@ use sys::path::{is_sep_byte, is_verbatim_sep, MAIN_SEP_STR, parse_prefix}; #[derive(Copy, Clone, Debug, Hash, PartialOrd, Ord, PartialEq, Eq)] #[stable(feature = "rust1", since = "1.0.0")] pub enum Prefix<'a> { + /// Prefix `scheme:`, where `scheme` is the component stored + #[unstable(feature="redox_prefix", issue="0")] + Scheme(&'a OsStr), + /// Prefix `\\?\`, together with the given component immediately following it. #[stable(feature = "rust1", since = "1.0.0")] Verbatim(#[stable(feature = "rust1", since = "1.0.0")] &'a OsStr), @@ -178,6 +184,7 @@ impl<'a> Prefix<'a> { os_str_as_u8_slice(s).len() } match *self { + Scheme(x) => os_str_len(x) + 1, Verbatim(x) => 4 + os_str_len(x), VerbatimUNC(x, y) => { 8 + os_str_len(x) + diff --git a/src/libstd/sys/redox/path.rs b/src/libstd/sys/redox/path.rs index bf9af7a4353a..4069a0ea726f 100644 --- a/src/libstd/sys/redox/path.rs +++ b/src/libstd/sys/redox/path.rs @@ -21,8 +21,16 @@ pub fn is_verbatim_sep(b: u8) -> bool { b == b'/' } -pub fn parse_prefix(_: &OsStr) -> Option { - None +pub fn parse_prefix(path: &OsStr) -> Option { + if let Some(path_str) = path.to_str() { + if let Some(i) = path_str.find(':') { + Some(Prefix::Scheme(OsStr::new(&path_str[..i]))) + } else { + None + } + } else { + None + } } pub const MAIN_SEP_STR: &'static str = "/";