From ccc68fc18b615561694650b25e665c257847cf67 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 24 Aug 2011 23:18:23 -0700 Subject: [PATCH] Add std::istr::str_from_cstr. Issue #855 --- src/lib/istr.rs | 15 ++++++++++++++- src/test/stdtest/istr.rs | 9 +++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/lib/istr.rs b/src/lib/istr.rs index a15e32e51906..bed720d8c1e5 100644 --- a/src/lib/istr.rs +++ b/src/lib/istr.rs @@ -3,7 +3,7 @@ index, rindex, find, starts_with, ends_with, substr, slice, split, concat, connect, to_upper, replace, char_slice, trim_left, trim_right, trim, unshift_char, shift_char, pop_char, push_char, is_utf8, from_chars, to_chars, char_len, char_at, bytes, is_ascii, shift_byte, pop_byte, unsafe_from_byte, -unsafe_from_bytes, from_char, char_range_at; +unsafe_from_bytes, from_char, char_range_at, str_from_cstr; export from_estr, to_estr, from_estrs, to_estrs; @@ -461,4 +461,17 @@ fn trim_right(s: &istr) -> istr { fn trim(s: &istr) -> istr { trim_left(trim_right(s)) +} + +fn str_from_cstr(cstr: *u8) -> istr { + let res = ~""; + let start = cstr; + let curr = start; + let i = 0u; + while *curr != 0u8 { + push_byte(res, *curr); + i += 1u; + curr = ptr::offset(start, i); + } + ret res; } \ No newline at end of file diff --git a/src/test/stdtest/istr.rs b/src/test/stdtest/istr.rs index 646d02649e12..b762e438336e 100644 --- a/src/test/stdtest/istr.rs +++ b/src/test/stdtest/istr.rs @@ -1,4 +1,5 @@ import std::istr; +import std::vec; #[test] fn test_eq() { @@ -255,4 +256,12 @@ fn unsafe_from_bytes() { let a = [65u8, 65u8, 65u8, 65u8, 65u8, 65u8, 65u8]; let b = istr::unsafe_from_bytes(a); assert b == ~"AAAAAAA"; +} + +#[test] +fn str_from_cstr() { + let a = [65u8, 65u8, 65u8, 65u8, 65u8, 65u8, 65u8, 0u8]; + let b = vec::to_ptr(a); + let c = istr::str_from_cstr(b); + assert c == ~"AAAAAAA"; } \ No newline at end of file