From 91d45b91e64c4db6f07b9dd21837dac84f0a1255 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Fri, 8 Jul 2011 22:23:11 -0700 Subject: [PATCH] stdlib: Implement str::unsafe_from_bytes_ivec() --- src/lib/str.rs | 5 +++++ src/rt/rust_builtin.cpp | 20 ++++++++++++++++++++ src/rt/rustrt.def.in | 1 + 3 files changed, 26 insertions(+) diff --git a/src/lib/str.rs b/src/lib/str.rs index 4093872ee69..51be2f6a069 100644 --- a/src/lib/str.rs +++ b/src/lib/str.rs @@ -55,6 +55,7 @@ native "rust" mod rustrt { fn str_vec(str s) -> vec[u8]; fn str_byte_len(str s) -> uint; fn str_alloc(uint n_bytes) -> str; + fn str_from_ivec(&u8[mutable?] b) -> str; fn str_from_vec(vec[mutable? u8] b) -> str; fn str_from_cstr(sbuf cstr) -> str; fn str_from_buf(sbuf buf, uint len) -> str; @@ -170,6 +171,10 @@ fn unsafe_from_bytes(vec[mutable? u8] v) -> str { ret rustrt::str_from_vec(v); } +fn unsafe_from_bytes_ivec(&u8[mutable?] v) -> str { + ret rustrt::str_from_ivec(v); +} + fn unsafe_from_byte(u8 u) -> str { ret rustrt::str_from_vec([u]); } fn str_from_cstr(sbuf cstr) -> str { ret rustrt::str_from_cstr(cstr); } diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp index 33f4a5114ce..6057ee4cb6c 100644 --- a/src/rt/rust_builtin.cpp +++ b/src/rt/rust_builtin.cpp @@ -313,6 +313,26 @@ str_byte_len(rust_task *task, rust_str *s) return s->fill - 1; // -1 for the '\0' terminator. } +extern "C" CDECL rust_str * +str_from_ivec(rust_task *task, rust_ivec *v) +{ + uintptr_t fill = v->fill ? v->fill : v->payload.ptr->fill; + void *data = v->fill ? v->payload.data : v->payload.ptr->data; + + rust_str *st = + vec_alloc_with_data(task, + fill + 1, // +1 to fit at least '\0' + fill, + 1, + fill ? data : NULL); + if (!st) { + task->fail(2); + return NULL; + } + st->data[st->fill++] = '\0'; + return st; +} + extern "C" CDECL rust_str * str_from_vec(rust_task *task, rust_vec *v) { diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in index 481936eee69..6db3ac6fcf3 100644 --- a/src/rt/rustrt.def.in +++ b/src/rt/rustrt.def.in @@ -41,6 +41,7 @@ str_buf str_byte_len str_from_buf str_from_cstr +str_from_ivec str_from_vec str_push_byte str_slice