From 6408d54c133554a938ffc304f320786cfe6a424e Mon Sep 17 00:00:00 2001 From: Tomoki Aonuma Date: Sun, 12 Feb 2012 13:21:50 +0900 Subject: [PATCH 1/2] Implement core::str::from_cstr_len, close #1666 --- src/libcore/str.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/libcore/str.rs b/src/libcore/str.rs index ca7bb819443b6..5cedb1f006430 100644 --- a/src/libcore/str.rs +++ b/src/libcore/str.rs @@ -17,6 +17,7 @@ export from_char, from_chars, from_cstr, + from_cstr_len, concat, connect, @@ -210,6 +211,24 @@ unsafe fn from_cstr(cstr: sbuf) -> str { ret from_bytes(res); } +/* +Function: from_cstr_len + +Create a Rust string from a C string of the given length +*/ +unsafe fn from_cstr_len(cstr: sbuf, len: uint) -> str { + let res = []; + let start = cstr; + let curr = start; + let i = 0u; + while i < len { + vec::push(res, *curr); + i += 1u; + curr = ptr::offset(start, i); + } + ret from_bytes(res); +} + /* Function: concat From 70b04a14d1d635958836c6969ff2d5bd80d4b625 Mon Sep 17 00:00:00 2001 From: Tomoki Aonuma Date: Sun, 12 Feb 2012 13:28:54 +0900 Subject: [PATCH 2/2] Add a test for core::str::from_cstr_len --- src/libcore/str.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/libcore/str.rs b/src/libcore/str.rs index 5cedb1f006430..1f1f5a22ac21c 100644 --- a/src/libcore/str.rs +++ b/src/libcore/str.rs @@ -1979,6 +1979,14 @@ mod tests { assert (c == "AAAAAAA"); } + #[test] + fn test_from_cstr_len() unsafe { + let a = [65u8, 65u8, 65u8, 65u8, 65u8, 65u8, 65u8, 0u8]; + let b = vec::to_ptr(a); + let c = from_cstr_len(b, 3u); + assert (c == "AAA"); + } + #[test] fn test_as_buf() unsafe { let a = "Abcdefg";