diff options
| author | Ben Striegel <ben.striegel@gmail.com> | 2013-05-31 18:11:38 -0400 |
|---|---|---|
| committer | Ben Striegel <ben.striegel@gmail.com> | 2013-05-31 18:12:07 -0400 |
| commit | c77d58fad8b484abdc0140d5adb27c738d46f261 (patch) | |
| tree | 7baf7aef930276b714540b2ba06b10ffb9baf374 /src/libstd | |
| parent | 91a707390045eb29e5392de1f7f5b9d5fdb64e65 (diff) | |
| download | rust-c77d58fad8b484abdc0140d5adb27c738d46f261.tar.gz rust-c77d58fad8b484abdc0140d5adb27c738d46f261.zip | |
Add as_c_str method on strings
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/prelude.rs | 2 | ||||
| -rw-r--r-- | src/libstd/str.rs | 61 |
2 files changed, 40 insertions, 23 deletions
diff --git a/src/libstd/prelude.rs b/src/libstd/prelude.rs index 4dcef60781f..5a5efa0781a 100644 --- a/src/libstd/prelude.rs +++ b/src/libstd/prelude.rs @@ -45,7 +45,7 @@ pub use path::PosixPath; pub use path::WindowsPath; pub use ptr::Ptr; pub use ascii::{Ascii, AsciiCast, OwnedAsciiCast, AsciiStr}; -pub use str::{StrSlice, OwnedStr}; +pub use str::{StrSlice, OwnedStr, StrUtil}; pub use from_str::{FromStr}; pub use to_bytes::IterBytes; pub use to_str::{ToStr, ToStrConsume}; diff --git a/src/libstd/str.rs b/src/libstd/str.rs index 4d41f10fdfc..c9452ed5433 100644 --- a/src/libstd/str.rs +++ b/src/libstd/str.rs @@ -2165,34 +2165,51 @@ pub fn as_bytes_slice<'a>(s: &'a str) -> &'a [u8] { } /** - * Work with the byte buffer of a string as a null-terminated C string. - * - * Allows for unsafe manipulation of strings, which is useful for foreign - * interop. This is similar to `str::as_buf`, but guarantees null-termination. - * If the given slice is not already null-terminated, this function will - * allocate a temporary, copy the slice, null terminate it, and pass - * that instead. - * - * # Example - * - * ~~~ {.rust} - * let s = str::as_c_str("PATH", { |path| libc::getenv(path) }); - * ~~~ + * A dummy trait to hold all the utility methods that we implement on strings. */ -#[inline] -pub fn as_c_str<T>(s: &str, f: &fn(*libc::c_char) -> T) -> T { - do as_buf(s) |buf, len| { - // NB: len includes the trailing null. - assert!(len > 0); - if unsafe { *(ptr::offset(buf,len-1)) != 0 } { - as_c_str(to_owned(s), f) - } else { - f(buf as *libc::c_char) +pub trait StrUtil { + /** + * Work with the byte buffer of a string as a null-terminated C string. + * + * Allows for unsafe manipulation of strings, which is useful for foreign + * interop. This is similar to `str::as_buf`, but guarantees null-termination. + * If the given slice is not already null-terminated, this function will + * allocate a temporary, copy the slice, null terminate it, and pass + * that instead. + * + * # Example + * + * ~~~ {.rust} + * let s = "PATH".as_c_str(|path| libc::getenv(path)); + * ~~~ + */ + fn as_c_str<T>(self, f: &fn(*libc::c_char) -> T) -> T; +} + +impl<'self> StrUtil for &'self str { + #[inline] + fn as_c_str<T>(self, f: &fn(*libc::c_char) -> T) -> T { + do as_buf(self) |buf, len| { + // NB: len includes the trailing null. + assert!(len > 0); + if unsafe { *(ptr::offset(buf,len-1)) != 0 } { + to_owned(self).as_c_str(f) + } else { + f(buf as *libc::c_char) + } } } } /** + * Deprecated. Use the `as_c_str` method on strings instead. + */ +#[inline(always)] +pub fn as_c_str<T>(s: &str, f: &fn(*libc::c_char) -> T) -> T { + s.as_c_str(f) +} + +/** * Work with the byte buffer and length of a slice. * * The given length is one byte longer than the 'official' indexable |
