diff options
| author | bors <bors@rust-lang.org> | 2015-01-24 19:39:52 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-01-24 19:39:52 +0000 |
| commit | bb7cc4eb26e87ec4cb2acdc5bc3a7d25b9c817be (patch) | |
| tree | 04338cf8bf55a8510cd6ab0771698e320beb13e8 /src/libstd/sys/unix | |
| parent | 76fbb3583174ca8856b4e149929839888f503e6b (diff) | |
| parent | c5369ebc7f4791c4e291951751b8964052c7a523 (diff) | |
| download | rust-bb7cc4eb26e87ec4cb2acdc5bc3a7d25b9c817be.tar.gz rust-bb7cc4eb26e87ec4cb2acdc5bc3a7d25b9c817be.zip | |
Auto merge of #21488 - aturon:os-str, r=alexcrichton
Per [RFC 517](https://github.com/rust-lang/rfcs/pull/575/), this commit introduces platform-native strings. The API is essentially as described in the RFC. The WTF-8 implementation is adapted from @SimonSapin's [implementation](https://github.com/SimonSapin/rust-wtf8). To make this work, some encodign and decoding functionality in `libcore` is now exported in a "raw" fashion reusable for WTF-8. These exports are *not* reexported in `std`, nor are they stable.
Diffstat (limited to 'src/libstd/sys/unix')
| -rw-r--r-- | src/libstd/sys/unix/ext.rs | 35 | ||||
| -rw-r--r-- | src/libstd/sys/unix/mod.rs | 1 | ||||
| -rw-r--r-- | src/libstd/sys/unix/os_str.rs | 86 |
3 files changed, 121 insertions, 1 deletions
diff --git a/src/libstd/sys/unix/ext.rs b/src/libstd/sys/unix/ext.rs index 0e4a9d1b307..9c659b56d93 100644 --- a/src/libstd/sys/unix/ext.rs +++ b/src/libstd/sys/unix/ext.rs @@ -31,7 +31,10 @@ #![unstable] -use sys_common::AsInner; +use vec::Vec; +use sys::os_str::Buf; +use sys_common::{AsInner, IntoInner, FromInner}; +use ffi::{OsStr, OsString}; use libc; use io; @@ -99,6 +102,36 @@ impl AsRawFd for io::net::udp::UdpSocket { } } +// Unix-specific extensions to `OsString`. +pub trait OsStringExt { + /// Create an `OsString` from a byte vector. + fn from_vec(vec: Vec<u8>) -> Self; + + /// Yield the underlying byte vector of this `OsString`. + fn into_vec(self) -> Vec<u8>; +} + +impl OsStringExt for OsString { + fn from_vec(vec: Vec<u8>) -> OsString { + FromInner::from_inner(Buf { inner: vec }) + } + + fn into_vec(self) -> Vec<u8> { + self.into_inner().inner + } +} + +// Unix-specific extensions to `OsStr`. +pub trait OsStrExt { + fn as_byte_slice(&self) -> &[u8]; +} + +impl OsStrExt for OsStr { + fn as_byte_slice(&self) -> &[u8] { + &self.as_inner().inner + } +} + /// A prelude for conveniently writing platform-specific code. /// /// Includes all extension traits, and some important type definitions. diff --git a/src/libstd/sys/unix/mod.rs b/src/libstd/sys/unix/mod.rs index bb98d1e052a..5493bc20a87 100644 --- a/src/libstd/sys/unix/mod.rs +++ b/src/libstd/sys/unix/mod.rs @@ -44,6 +44,7 @@ pub mod fs; pub mod helper_signal; pub mod mutex; pub mod os; +pub mod os_str; pub mod pipe; pub mod process; pub mod rwlock; diff --git a/src/libstd/sys/unix/os_str.rs b/src/libstd/sys/unix/os_str.rs new file mode 100644 index 00000000000..3dd89ad0759 --- /dev/null +++ b/src/libstd/sys/unix/os_str.rs @@ -0,0 +1,86 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +/// The underlying OsString/OsStr implementation on Unix systems: just +/// a `Vec<u8>`/`[u8]`. + +use core::prelude::*; + +use fmt::{self, Debug}; +use vec::Vec; +use slice::SliceExt as StdSliceExt; +use str; +use string::{String, CowString}; +use mem; + +#[derive(Clone)] +pub struct Buf { + pub inner: Vec<u8> +} + +pub struct Slice { + pub inner: [u8] +} + +impl Debug for Slice { + fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> { + self.to_string_lossy().fmt(formatter) + } +} + +impl Debug for Buf { + fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> { + self.as_slice().fmt(formatter) + } +} + +impl Buf { + pub fn from_string(s: String) -> Buf { + Buf { inner: s.into_bytes() } + } + + pub fn from_str(s: &str) -> Buf { + Buf { inner: s.as_bytes().to_vec() } + } + + pub fn as_slice(&self) -> &Slice { + unsafe { mem::transmute(self.inner.as_slice()) } + } + + pub fn into_string(self) -> Result<String, Buf> { + String::from_utf8(self.inner).map_err(|p| Buf { inner: p.into_bytes() } ) + } + + pub fn push_slice(&mut self, s: &Slice) { + self.inner.push_all(&s.inner) + } +} + +impl Slice { + fn from_u8_slice(s: &[u8]) -> &Slice { + unsafe { mem::transmute(s) } + } + + pub fn from_str(s: &str) -> &Slice { + unsafe { mem::transmute(s.as_bytes()) } + } + + pub fn to_str(&self) -> Option<&str> { + str::from_utf8(&self.inner).ok() + } + + pub fn to_string_lossy(&self) -> CowString { + String::from_utf8_lossy(&self.inner) + } + + pub fn to_owned(&self) -> Buf { + Buf { inner: self.inner.to_vec() } + } +} |
