diff --git a/src/lib/istr.rs b/src/lib/istr.rs index 4b1f990a243c..256e76d0041b 100644 --- a/src/lib/istr.rs +++ b/src/lib/istr.rs @@ -3,7 +3,8 @@ 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, str_from_cstr; +unsafe_from_bytes, from_char, char_range_at, str_from_cstr, sbuf, +as_buf; export from_estr, to_estr, from_estrs, to_estrs; @@ -467,7 +468,21 @@ fn trim(s: &istr) -> istr { trim_left(trim_right(s)) } -fn str_from_cstr(cstr: *u8) -> istr { +type sbuf = *u8; + +fn buf(s: &istr) -> sbuf { + let saddr = ptr::addr_of(s); + let vaddr: *[u8] = unsafe::reinterpret_cast(saddr); + let buf = vec::to_ptr(*vaddr); + ret buf; +} + +fn as_buf(s: &istr, f: &block(sbuf) -> T) -> T { + let buf = buf(s); + f(buf) +} + +fn str_from_cstr(cstr: sbuf) -> istr { let res = ~""; let start = cstr; let curr = start; diff --git a/src/test/stdtest/istr.rs b/src/test/stdtest/istr.rs index b762e438336e..32497a8858b0 100644 --- a/src/test/stdtest/istr.rs +++ b/src/test/stdtest/istr.rs @@ -264,4 +264,24 @@ fn str_from_cstr() { let b = vec::to_ptr(a); let c = istr::str_from_cstr(b); assert c == ~"AAAAAAA"; -} \ No newline at end of file +} + +#[test] +fn as_buf() { + let a = ~"Abcdefg"; + let b = istr::as_buf(a, { |buf| + assert *buf == 65u8; + 100 + }); + assert b == 100; +} + +#[test] +fn as_buf_small() { + let a = ~"A"; + let b = istr::as_buf(a, { |buf| + assert *buf == 65u8; + 100 + }); + assert b == 100; +}