diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-06-30 14:59:44 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-06-30 14:59:44 +0000 |
commit | 58bd5facb2f4926e14453254e7af50d2f93f3ca2 (patch) | |
tree | fa2507ed97844dd35e47a762154b1f62a57e10db | |
parent | b105cbc80986eb684a272788111f36f6624fedb7 (diff) | |
download | ruby-58bd5facb2f4926e14453254e7af50d2f93f3ca2.tar.gz |
string.c: rb_fstring_new
* string.c (rb_fstring_new): create fstring from pointer and
length.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46626 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | internal.h | 1 | ||||
-rw-r--r-- | string.c | 21 |
2 files changed, 22 insertions, 0 deletions
diff --git a/internal.h b/internal.h index 6409da3d1a..1546b219e8 100644 --- a/internal.h +++ b/internal.h @@ -899,6 +899,7 @@ size_t rb_strftime(char *s, size_t maxsize, const char *format, rb_encoding *enc /* string.c */ VALUE rb_fstring(VALUE); +VALUE rb_fstring_new(const char *ptr, long len); int rb_str_buf_cat_escaped_char(VALUE result, unsigned int c, int unicode_p); int rb_str_symname_p(VALUE); VALUE rb_str_quote_unprintable(VALUE); @@ -225,6 +225,27 @@ rb_fstring(VALUE str) return fstr; } +static VALUE +setup_fake_str(struct RString *fake_str, const char *name, long len) +{ + fake_str->basic.flags = T_STRING|RSTRING_NOEMBED|ELTS_SHARED; + /* SHARED to be allocated by the callback */ + + RBASIC_SET_CLASS((VALUE)fake_str, rb_cString); + fake_str->as.heap.len = len; + fake_str->as.heap.ptr = (char *)name; + fake_str->as.heap.aux.capa = len; + return (VALUE)fake_str; +} + +VALUE +rb_fstring_new(const char *ptr, long len) +{ + struct RString fake_str; + + return rb_fstring(setup_fake_str(&fake_str, ptr, len)); +} + static int fstring_set_class_i(st_data_t key, st_data_t val, st_data_t arg) { |