about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-08-25 22:11:42 -0700
committerBrian Anderson <banderson@mozilla.com>2011-08-27 15:54:44 -0700
commit138973335aba835a451ce7c9914c7ca020bcc753 (patch)
tree650da654e1d6cba0d2bd19c5c3686958a285c695
parent7284f820d57e13b10fd9f1c3fc771fac52b6b66a (diff)
Add std::istr::as_buf for converting to cstrs. Issue #855
-rw-r--r--src/lib/istr.rs19
-rw-r--r--src/test/stdtest/istr.rs22
2 files changed, 38 insertions, 3 deletions
diff --git a/src/lib/istr.rs b/src/lib/istr.rs
index 4b1f990a243..256e76d0041 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<T>(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 b762e438336..32497a8858b 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;
+}